File控件杂谈

2019-11-24 00:48 来源:未知

File杂谈——初识file控件

2015/07/23 · HTML5 · file控件

原稿出处: 百码山庄   

首先本人表明下,这里介绍的file控件指的是网页中的FileUpload对象,也正是我们广阔的<input type=”file”> 。即使您不是想寻觅那方面的事物,就足以绕道了。

  我们数不胜数采纳<input type='file'/>来落到实处网页中文件上传效用,顾客能够由此点击file控件选用当半夏件,当我们提交包蕴该控件的表单时,浏览器会向服务器发送客户选中的文书。

File类基础,file类

File类的效果:
Java的io包中定义了File类,用于对文件或文件夹的拘留操作。
File类只能用于表示文件或文件夹的音讯(属性)和对该公文或文件夹的删除创设操作
(不能够对剧情举行拜访)
因而创造File类对象能够用程序来操作Computer上的文件或文件夹。

 

File类的构造方法:
File(String path):通过点名的不二等秘书技名字符串来成立叁个新的File对象,抽象路线名是用来表示有些文件或文件夹的路线定位。
File(File parent,String path):依据parent父文件对象和path子文件名字符串来成立叁个新的File对象。

 

File类的常用API
文本操作:
exists():推断文件是还是不是存在:再次回到值为布尔值
getCanonicalPath() :获取当前文件的科班路线名 
separator:用于表示路线层级分割符,能够幸免不一致操作系统的分割符分裂等的景况
createNewFile():在硬盘中开创多少个文件
length():长度
lastModified():创设时间:new Date(File.lastModified())
delete():删除
getName():得到文件或文件夹名

文本夹操作:
exists():剖断文件是不是存在:返回值为布尔值
getCanonicalPath()  :获取当前文件的科班路线名 
separator:用于表示路线层级分割符,能够制止不相同操作系统的分割符不意气风发致的动静
boolean mkdir():创立文件夹
mkdirs():假使父文件夹不设有就伙同创办
listFiles():该办法再次来到的路径名用于表示此抽象路线名的目录中的文件和目录的数组
listFiles(FileFilter filter) :该措施再次回到的路子名用于表示此抽象路线名的目录中的文件和目录的数组,并且带有FileFilter类型的过滤器
isDirectory():推断是不是文件夹
delDirectory(pp):调用删除文件夹方法

 1 public void testFile01() throws IOException{
 2         //在计算机内存中创建一个File对象,用来对应计算机的存储硬盘中的当前文件夹
 3         File file = new File(".");
 4         System.out.println("当前文件夹是否存在:" file.exists());
 5         System.out.println("查看当前文件夹的路径位置:" file.getCanonicalPath());
 6         //与硬盘中是否存在文件夹没有直接联系,只是存在JVM中的对象
 7         File fileDemo = new File(file,"fileDemo");
 8         System.out.println("查看当前文件夹中是否存在fileDemo文件夹:" fileDemo.exists());
 9         if(!fileDemo.exists()){
10             fileDemo.mkdir();//创建出fileDemo文件夹  
11         }
12         
13                 File testFile = new  File(file,"aa" File.separator "testFile");
14         if(!testFile.exists()){
15 //            boolean flag = testFile.mkdir();
16 //            System.out.println("创建结果:" flag);
17             testFile.mkdirs();//创建文件夹,当父目录不存在会把父目录先创建出来
18         }
19         
20         File aFile = new File(fileDemo,"a.txt");
21         System.out.println("a.txt在硬盘中是否存在:" aFile.exists());
22         if(!aFile.exists()){
23             aFile.createNewFile();//在硬盘中创建一个文件
24         }
25         System.out.println("a.txt在硬盘中是否存在:" aFile.exists());
26         System.out.println("a.txt的标准路径为:" aFile.getCanonicalPath());
27         System.out.println("a.txt的文件长度为:" aFile.length());
28         System.out.println("a.txt的创建时间:" new Date(aFile.lastModified()));
29         /*
30          * 删除文件对象表示的文件或文件夹,成功删除返回true。
31          * 如果文件对象表示的是一个文件夹,删除的时候必须保证此文件夹是空文件夹才能删除
32          */
33         aFile.delete();
34         //删除aa会失败
35         File aa = new File(file,"aa");
36         aa.delete();
37     }

public void testFile02(){
        File file = new File(".");//当前文件夹对象
        File[] files = null;
        if(file.exists()){
            //listFiles():查看当前文件夹下有什么子文件或子文件夹,如果文件夹路径为空,返回空
            //如果此路径名不是表示一个文件夹或者发生了I/O异常,也返回null
             files = file.listFiles();
        }
        for(File f:files){
            //getName():获得文件或文件夹名
            System.out.println(f.getName());
        }
    }

    public void testFile03() throws IOException{
        File path = new File(".");
        File pppp = new File(path,"pp" File.separator "ppp" File.separator "pppp");
        File demoFile = new File(pppp,"demo.txt");
        if(!pppp.exists()){
            pppp.mkdirs();//将父文件夹与子文件夹一起创建
        }
        if(!demoFile.exists()){
            demoFile.createNewFile();//创建文件
        }
        File pp = new File(path,"pp");
        delDirectory(pp);//调用删除文件夹方法下面没有文件则可以成功
    }

//使用遍历方法删除文件夹,如果内部有文件则删除文件,防止无法删除文件夹
    public static void delDirectory(File dir) throws IOException{
        if(!dir.exists()){//如果文件夹不存在,抛出运行时异常
            throw new RuntimeException("文件夹" dir "不存在");
        }
        if(!dir.isDirectory()){//判断是否文件夹
            throw new RuntimeException(dir "不是目录");
        }
        File[] subs = dir.listFiles();
        if(subs!=null&&subs.length>0){//遍历所有子文件和文件夹,删除里面内容
            //遍历所有的subs
            for(File f:subs){
                if(!f.isDirectory()){//不是文件夹就是文件
                    System.out.println("文件名为:" f.getName());
                    if(!f.delete()){//如果删除失败则抛出异常,如果成功则不进来,文件也删掉了
                        throw new IOException("无法删除文件" f.getName());
                    }
                }else{//文件夹处理
                    System.out.println("开始处理文件夹" f.getName());
                    delDirectory(f);//调用删除文件夹方法,删除子文件夹
                    System.out.println("子文件夹已经删除,开始删除该文件夹" f.getName());
                    f.delete();//删除完子文件和子文件夹后,需要删除当前的文件夹
                }
            }
        }
        dir.delete();//删除dir目录的内容
    }

    //使用过滤器过滤掉一部分文件,处理符合规则的文件
    public void testFile04(){
        File file = new File("src" File.separator "day07");//创建文件对象
        FileFilter filter = new FileFilter(){
            //该方法用于定义过滤规则,如果return true则表示符合规则的
            //返回值为false  则表示不符合规则的
            @Override
            public boolean accept(File pathname) {
                //matches匹配符合正则表达式规则的内容
                if(pathname.getName().matches(".*[.]java")){
                    return true;
                }
                return false;
            }
        };
        //传入过滤器对象,过滤掉不符合规则的file对象
        File[] paths = file.listFiles(filter);
        for(File f:paths){
            System.out.println(f.getName());
        }
    }

 

File类的功用: Java的io包中定义了File类,用于对文本或文件夹的管住操作。 File类只可以够用于表示文件或文件夹的音信(属...

1、制造文件夹

(1卡塔 尔(英语:State of Qatar)学习自定义首先先领会自定义控件的机能以致为啥用到自定义控件

                    自定义控件是在现成的控件不满意项目须要,何况需求大量施用相像制版格式的时候所拟订的控件,说白了正是满意项目标必要。

功能

当大家须求在网页中贯彻公文上传功效的时候,file控件就能够大有作为了。HTML文书档案中每加多多少个 <input type=”file”> ,实际正是开创了一个FileUpload实例对象。顾客能够因而点击file控件采用当三步跳件,当大家提交包涵该file控件的表单时,浏览器会向服务器发送顾客选中的当羊眼半夏件。进而将地方文件传输到服务器,供其余网络客户下载或行使,完毕文件上传作用。

  看上边的呈报,file控件貌似挺强盛的,事实上也是那般的。但事实上费用中大家也能够挑出file控件的超级多标题:

 

 (2卡塔 尔(英语:State of Qatar) 自定义控件的世襲类

        Control 类实现向客户展现消息的类所需的最基本功能。它管理客户通过键盘和指针设备所举办的输入。它还管理音讯路由和乌海。固然它并不完成绘制,可是它定义控件的界线(其岗位和尺寸卡塔 尔(英语:State of Qatar)。它提供窗口句柄--引用

       这里作者珍视说的是 Control的持续使用

美中相差

未可厚非,file控件很强盛,给网页上传文件带给了宏大的有益。不过,它不用全盘!

第风流罗曼蒂克,从控件自个儿而言,我们得以由此value属性获取到客户选取的文件名称,但出于安全性等成分思索,该属性无法钦赐暗中同意值,并且该属性为只读属性。

说不上,大概也是file控件令大多开辟者头痛的地点。file控件在挨门挨户主流浏览器之间的显现大大有区别,给顾客带给的视觉心得不完全相似,何况大致不恐怕因此一向改换样式来达到统生龙活虎,上面笔者用一张图来更清晰的告诉我们:

图片 1

侦查破案了啊?更可恨的是“接纳文件”、“Browse…”、“浏览…”三处文字均不能转移!!不过,那无非是视觉上的差距,差别浏览器下file控件的作为也设有有的差距:

  • A1、A2、A3、Camaro、A6,五处大家均能够单击触发布文书件接受
  • A5 处大家却须要双击技术接触文件选拔

总的说来,file控件从暗许视觉效果和相互体验方面来说,是开垦人士和普通顾客都很难接收的。

  1、大家得以经过value属性获取客户采纳的文书的名号,但出于安全因素,该属性只读,所以也就不可能钦赐私下认可值。

File file_1 = new File(File.separator "mnt" File.separator "sdcard" File.separator);

风流倜傥(完结大家先是个简易的控件卡塔 尔(英语:State of Qatar)

    咱们请先看效果图

   图片 2

道高朝气蓬勃尺,道高风姿罗曼蒂克尺

既然暗许的东西大家都不能够担任,那么不能够承当的东西大家就要去改变它。

透过无数开采者的一再试行注解,大家不能够由此转移宽度,高度,来支配file控件中开关的尺码,可是大家得以经过设置file控件的字体大小(font-size)来改动那么些开关的尺寸,更让人可观的是主流浏览器对改换font-size的显示是豆蔻梢头律的。

那么,聪明的开荒者们就有了应对之策了。

率先,大家从近日表现行反革命差描述中能够开掘A2、PASSAT、A6,三处均可单击触发文件接收文件,何况那三处还大概有一个协同点——它们均处于控件左侧,那么我们就能够转移控件字体大小,让侧边那生龙活虎局地丰富大,况且只让顾客见到这大器晚成区域(或部分卡塔尔,并且只让顾客操作该区域,那么A5处人机联作不相同样的难点就可以缓慢解决了。为了达成那些指标,我们能够在file控件外面包裹生机勃勃层容器,并设置尺寸,通过固定将file控件右侧区域突显到对象区域,并为容器设置溢出隐敝( overflow: hidden )。小编要么用代码来注明呢:

XHTML

<style> .file-group { position: relative; width: 200px; height: 80px; border: 1px solid #ccc; /* 为了呈现可知区域,非必得 */ overflow: hidden; } .file-group input { position: absolute; right: 0; top: 0; font-size: 300px; } </style> <div class="file-group"> <input type="file" name="" id="J_File"> </div>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<style>
    .file-group {
        position: relative;
        width: 200px;
        height: 80px;
        border: 1px solid #ccc; /* 为了显示可见区域,非必须 */
        overflow: hidden;
    }
    .file-group input {
        position: absolute;
        right: 0;
        top: 0;
        font-size: 300px;
    }
</style>
<div class="file-group">
    <input type="file" name="" id="J_File">
</div>

在浏览器中查阅上边代码的意义,分明Chrome、Firefox、IE下展现效果鲜明太不平等了(其实文字被推广挤出可以知道区域了,差没有多少什么都看不到卡塔尔国,那么怎么应对吗?所谓“道高黄金时代尺,道高豆蔻梢头尺”,这里大致的原理正是让file控件处于较高的层(z-index卡塔 尔(阿拉伯语:قطر‎,而且安装透明(opacity,低版本IE用filter卡塔 尔(阿拉伯语:قطر‎,让前边的成分来设置样式,以此到达视觉风格统风流洒脱。说得不是很通晓,依旧一贯上代码吧:

XHTML

<style> .file-group { position: relative; width: 200px; height: 80px; border: 1px solid #ccc; /* 为了显得可以预知区域,非必得 */ overflow: hidden; cursor: pointer; line-height: 80px; font-size: 16px; text-align: center; color: #fff; background-color: #f50; border-radius: 4px; } .file-group input { position: absolute; right: 0; top: 0; font-size: 300px; opacity: 0; filter: alpha(opacity=0); cursor: pointer; } .file-group:hover { background-color: #f60; } </style> <div class="file-group"> <input type="file" name="" id="J_File"> 选拔文件 </div>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<style>
    .file-group {
        position: relative;
        width: 200px;
        height: 80px;
        border: 1px solid #ccc; /* 为了显示可见区域,非必须 */
        overflow: hidden;
        cursor: pointer;
        line-height: 80px;
        font-size: 16px;
        text-align: center;
        color: #fff;
        background-color: #f50;
        border-radius: 4px;
    }
    .file-group input {
        position: absolute;
        right: 0;
        top: 0;
        font-size: 300px;
        opacity: 0;
        filter: alpha(opacity=0);
        cursor: pointer;
    }
    .file-group:hover {
        background-color: #f60;
    }
</style>
<div class="file-group">
    <input type="file" name="" id="J_File">
    选择文件
</div>

最终大家再看下各浏览器表现相仿的尾声显示效果及相互作用体验:

图片 3

OK,到这里大家终于对file控件有个简易的认知了,前面笔者还大概会提供越来越多file控件或基于file控件延伸出来的有关资料,风乐趣的对象能够穿梭关切。

1 赞 3 收藏 评论

图片 4

  2、最让我们诟病的是,file控件在分化浏览器上长相迥异。那让大家开拓者情何以堪?况兼“接纳文件”、“浏览…”等字样均不恐怕改良。更可恨的是IE9中file控件相同于输入框的职位需求双击才干接触文件接受。这样的视觉效果与相互体验真正让我们不可能承当。

 

(1卡塔 尔(阿拉伯语:قطر‎首先我们要求创立一个类库  此处我们供给小心的是您所创设的类库恐怕所您所援用的,不可能和你现成项目中的类公事重名 否者将会编写翻译不通过

图片 5

 

下边是我们供给写入的代码

图片 6图片 7

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace MyCustomControls.MycustomControls
{
    /// <summary>
    /// 添加类文件 继承Control类
    /// </summary>
    public class MyFirstControls : Control
    {
        protected override void Render(HtmlTextWriter writer)
        {
            //这里写入想要输出的 文本标签
            writer.Write("<table>");
            writer.Write("<tr> <td>用户名:</td> <td> <input type='text' name='TextUser'/> </td>  </tr>");
            writer.Write("<tr><td>密码:</td> <td><input type='text' name='TextPwd'/></td>   </tr>");
            writer.Write("<tr><td><input type='button' Value='确定'/></td> <td><input type='submit' Value='取消'/></td> </tr>");
            writer.Write("</table>");

        }
    }
}

View Code

代码写入成功后 我们实行调换操作

 图片 8

  so,目前比比皆已的应用方案是这般的:

if(!file_1.exists()){//推断文件夹是或不是留存(不设有则创制这一个文件夹卡塔尔

接下来创造新的连串张开援引

  在file控件外面包裹大器晚成层容器,并安装其尺寸,通过一定将file控件侧面区域(因为IE9中file控件左边区域单击无效卡塔 尔(阿拉伯语:قطر‎显示到指标区域,并为容器设置溢出隐蔽。同不时候,为了让控件可被点击,大家让file处于较高的层并设置透明,只让容器样式可知,以此到达视觉与互为风格的联结。见代码:

 

那边是大家新创制的体系

图片 9

然后大家须要把我们调换的控件增多到工具箱

操作 如下  点击Vs界面  工具(T)---->点击分选工具箱(x卡塔尔国--->点击浏览(B)--->确定 那样就足以了

图片 10*

在大家工具箱中找出拖拽就会贯彻大家想要的效用了

 

图片 11

<style type="text/css">
  .container{
      font-family: "microsoft yahei";
      position: relative;
      width:200px;
      height: 80px;
      border:1px solid #ccc;/*为了看上去明显*/
      overflow: hidden;
      line-height: 80px;
      font-size: 16px;
      text-align: center;
      color: #fff;
      background-color: #ccc;
      border-radius: 4px;
  }
  .container:hover{
      background-color: #eee;
  }
  #myFile{
      position: absolute;
      font-size: 300px;
      cursor: pointer;
      right:0;
      top:0;
      opacity: 0;
      filter: alpha(opacity=0);
  }

</style>
<div class="container">
    <input type="file" name="myFile" id="myFile" value="" />
    选择文件
 </div>

    file_1.makedir();//创设文件夹

  希望对大家享有利于------------------------指教请留言

 

 

 

 

 

 

 

 

 

 

 

 

    

 

  那样大家超多消除了以上所说的主题材料了。

}  

  HTML5到来以前,大家对此file控件能够行使的有用多少也便是value属性了,H5给file控件新扩张了files属性,该属性包涵file控件选拔的公文对象的集聚,此中包含上次改良时间、名称、大小等音讯。那十分的大地方便人民群众了笔者们开荒者,还记得以前在合营社做二个类型,要调整上传文件大小的时候还索要依赖flash来完毕,否则只可以等公事上传播服务端了再判定大小,结果相当多时候上传了一个十分的大的公文,页面加载了半天(向后台传递必要走网络,相比耗费时间卡塔尔国,最后照旧告诉小编文件过大。试想,那样的心得客户孰忍直视?(PS:IE9不扶助files属性卡塔尔

 

  不过随着才能的前行,大家发掘了其它生龙活虎种恐怕更合乎顾客操作习于旧贯的上传文件的办法:拖拽。今后曾经有许多网址协理这种措施了。大家看二个演示的例证:

File file = new File(File.separator "mnt" File.separator "sdcard"

  

  • File.separator "1.txt");
<style>
            html,body,div{
                margin:0;
                padding: 0;
            }
            #file{
                display: none;
            }
            .up-area{
                margin:50px auto;
                border: 1px dashed #ccc;
                background-color: #eee;
                width:600px;
                height:400px;
                line-height: 400px;
                text-align: center;
                color: #666;
                cursor: pointer;
            }
            .up-area:hover{
                background-color: #ddd;
            }
        </style>
<input type="file" id="file"/>
        <div class="up-area" id="upArea"></div>
        <script type="text/javascript">
            (function(){
                var area= document.getElementById("upArea"),
                    file = document.getElementById("file");
                function uploadFile(fs){
                    console && console.log(fs);
                }
                area.onclick = function(){
                    console && console.log("click");
                    file.click();
                }
                file.onchange=function(){
                    uploadFile(this.files);
                }
                area.ondragenter = function(e){
                    this.className = "up-area hover";
                    e.preventDefault();
                }
                area.ondragover = function(e){
                    e.preventDefault();
                }
                area.ondrop = function(e){
                    e.preventDefault();
                    console && console.log("drop");
                    var dt = e.dataTransfer;
                    this.className = "up-area";
                    uploadFile(dt.files);
                };
            })();

</script>

 

  将文件拖至黄绿虚线区域就可以查看效果,这里大家第生龙活虎关切的是div的ondrop事件,大家来看files属性并非来源于file控件,而是dataTransfer对象,大家看出,H5貌似又给大家提供了风度翩翩种file控件之外的文书上传渠道。

if(!file.exists()){//判定文件是或不是留存(不设有则成立那一个文件卡塔 尔(阿拉伯语:قطر‎

  那大家世袭用用吧!

 

  大家通晓,日常的上传文件进程是那般的:点击接收文件或直接将文件拖拽至区域内,触发布公文件上传,文件异步发送至服务器,待服务器处理完结,再次来到音信呈现到页面上。

    storefile.createNewFile();//创造文件夹

  古板的文本上传要达成异步,经常常有二种渠道(iframe模拟、flash插件卡塔 尔(阿拉伯语:قطر‎。咱们这里都不展现了,大家用FormData,用js成立八个表单对象,并向当中加多表单数据,结合XMLHttpRequest对象将表单异步提交。

}

  看代码:

function uploadFile(fs){
                var len = fs.length;
                for(var i=0;i<len;i  ){
                    sendFile(fs[i]);
                }
            }
            function sendFile(file){
                var xhr = new XMLHttpRequest(),
                    fd = new FormData();//ie10  supported
                fd.append('file',file);
                xhr.onreadystatechange=function(){
                    if(xhr.readyState == 4 && xhr.status == 200){
                        consoleDiv.innerHTML  = "<br/>"   xhr.responseText;//多文件
                    }
                }
                xhr.open("POST",'upload.php');
                xhr.send(fd);
            }
            file.onchange = function(){//file控件属性改变时触发上传
                uploadFile(this.files);
            }
            area.ondrop = function(e){//拖拽区域拖入文件时触发上传
                e.preventDefault();
                var dt =e.dataTransfer;
                uploadFile(dt.files);
            }

  代码内容比较容易,不再赘言……须求注意的少数就是FormData在IE类别浏览器里,9通通不帮助,10和11都是大器晚成对援救。

  提及此处,与公事上传相关的,大家还想看八个H5新扩大的指标:FileReader。js创制FileReader对象比较轻便:var reader = new FileReader();通过FileReader对象能够访谈文件,看三个简易的例子:

var rd = new FileReader();
rd.onload=function(e){
   console && console.log(e.target.result);
}
rd.readAsText(file);

  以上代码中file参数是一个file对象,能够是File控件的file属性中FileList中的三个,也可以是dataTransfer中files属性中FileList中的二个。

  关于FileReader越来越多的原委同学们方可团结搜索,先到此地了。由于怕昨天会加班,没时间写博,故而提前了一天。

版权声明:本文由19463331韦德国际发布于韦德国际1946官网,转载请注明出处:File控件杂谈