FileReader

今天写码遇到的一个需求是在页面中上传文件时,
只选择文件,并未上传,即在前端判断文件大小,
如果文件过大,则提示用户重新选择文件。

原本判断文件大小的思路,是使用img元素,
把文件的URL赋值给img的src,然后通过filesize来拿到文件大小。
但使用这个方法,必须得到文件的URL,所以还是需要先上传才可以。

如此,使用HTML5的FileReader接口,即可完全在页面里读取文件了。

使用方法简述如下:
Plus:不支持IE,of course,as always……

FileReader专门用于读取文件,
它提供了一些读取文件的方法,以及包含读取结果的事件模型。
目前只有FF3.6+和Chrome6.0+实现了这个接口。

首先判断你的浏览器是否支持FileReader接口:
if( typeof FileReader == “undefined” ){
  alert( “您的浏览器不支持FileReader!” ); 
}else{
  // do FileReader things
}

在页面结构里,我们需要给一个input用来上传文件:

则在支持FileReader的浏览器里就可以这样写:
document.getElementById(“File”).addEventListener(“change”, readFile, false);
这是在监听input的change事件,一旦选择了文件,触发了change事件,即刻调用readFile方法。
besides,如果是上传图片,
我们在结构里可以再给一个img:用来放置上传的图片。
由此我们也顺便实现了在图片发送之前即显示在页面上的功能。

现在定义这个关键的readFile方法:
function readFile(){
  var file = this.files[0]; //input
  if( file.size > 5*1024*1024 ){  //用size属性判断文件大小不能超过5M
    alert( “你上传的文件太大了!” )
  }else{
    var reader = new FileReader();
    reader.readAsDataURL(file);
    reader.onload = function(e){
      var res = this.result;
      $(“#Img”).attr(“src”, res);
    }
  }
}
注意,这里的this.result是把文件转换为base64后的字符串,
如果是图片,则赋值给img的src即可显示。

当然也可以用这个base64的字符串长度来大致判断文件大小。
但要知道,这个base64字符串长度与文件实际大小是有差别的。
你把这个字符串打印出来看看就知道了。

————————— 我是搔首弄姿的分割线 —————————

刚才使用的是FileReader的一个方法readAsDataURL,
actually,FileReader有四个方法,三个用来读取文件,一个用来中断读取:

方法:abort
参数:无
作用:中断读取

方法:readAsBinaryString
参数:file
作用:将文件读取为二进制码(打印出来在页面上是一堆乱码,二进制麽!)

方法:readAsDataURL
参数:file
作用:将文件读取为DataURL(本例中用的就是这个方法,result就是文件的base64字符,DataURI)

方法:readAsText
参数:file, [optional] in DOMString encoding(第二个参数是文本的编码方式,默认UTF-8)
作用:将文件读取为文本(读取的结果就是这个文本文件中的内容)

此外,FileReader还包含了一套完整的事件模型,用来捕获读取文件时的状态:

事件:onabort
描述:读取中断时触发

事件:onerror
描述:出错时触发

事件:onload
描述:文件读取成功完成时触发

事件:onloadend
描述:读取完成时触发,不论读取成功还是失败

事件:onloadstart
描述:读取开始时触发

事件:onprogress
描述:读取中

文件一旦被读取,不论成功还是失败,
实例(var reader = new FileReader)的result属性都会被填充。
如果读取失败,result的值就是null,
如果读取成功,result的值就是读取的结果。

Last but not least, FileReader这货是HTML5的,
所以IE不支持,使用时务必了解。

### FileReader 使用指南及常见问题解决方案 `FileReader` 是 Java 提供的一个便捷工具类,继承自 `InputStreamReader`,专门用于读取字符文件。下面详细介绍其基本用法、注意事项以及一些常见的问题及其解决方案。 #### 1. 基本用法 `FileReader` 主要用来从文件中逐字符或逐行读取数据。通常配合缓冲区(BufferedReader)一起使用以提高效率。 ```java try (FileReader fr = new FileReader("example.txt"); BufferedReader br = new BufferedReader(fr)) { String line; while ((line = br.readLine()) != null) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); } ``` 以上代码片段展示了一个典型的例子:打开名为 `"example.txt"` 的文件,并按照行的方式打印每一行的内容[^1]。 #### 2. 注意事项 - **资源管理**:始终确保在操作完成后关闭流对象。现代做法推荐利用 try-with-resources 构造自动完成这一过程。 - **异常处理**:由于 `FileNotFoundException` 属于受检异常,在创建 `FileReader` 实例时必须显式声明或者捕获该异常[^3]。 #### 3. 常见问题及解决方案 ##### 问题一: 文件路径错误导致程序崩溃 当指定的文件名不正确或是相对路径设置失误时,程序会因找不到目标文件而终止执行。为了避免这种情况的发生,可以先验证文件是否存在再继续后续动作: ```java File file = new File("path/to/file"); if (!file.exists() || !file.canRead()) { throw new IllegalArgumentException("Invalid or unreadable file."); } try (FileReader fr = new FileReader(file)) { int character; while ((character = fr.read()) != -1) { System.out.print((char) character); } } catch (IOException ex) { ex.printStackTrace(); } ``` 这样可以在早期阶段发现配置不当之处并给出相应的反馈信息[^1]。 ##### 问题二: 高效大批量数据传输性能瓶颈 对于非常庞大的文本资料来说单纯依靠简单的循环读写显然不够理想。此时应该考虑引入更高阶的技术手段比如 NIO Channels 或者分片加载机制来提升吞吐率降低延迟时间。 另外值得注意的是虽然上面提到过 JS-Spark-MD5 这样的第三方库主要是面向前端领域开发人员设计用于生成消息摘要值并不直接关联于此话题但是它们背后所体现出来的设计理念——即通过对原始素材逐步累积更新状态直至最终得出结论的方法论同样适用于这里的大规模输入情境之中[^5]。 --- ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值