JavaScript操作文件_动力节点Java学院整理


Posted in Javascript onJune 30, 2017

在HTML表单中,可以上传文件的唯一控件就是<input type="file">。

注意:当一个表单包含<input type="file">时,表单的enctype必须指定为multipart/form-data,method必须指定为post,浏览器才能正确编码并以multipart/form-data格式发送表单的数据。

出于安全考虑,浏览器只允许用户点击<input type="file">来选择本地文件,用JavaScript对<input type="file">的value赋值是没有任何效果的。当用户选择了上传某个文件后,JavaScript也无法获得该文件的真实路径:

通常,上传的文件都由后台服务器处理,JavaScript可以在提交表单时对文件扩展名做检查,以便防止用户上传无效格式的文件:

var f = document.getElementById('test-file-upload');
var filename = f.value; // 'C:\fakepath\test.png'
if (!filename || !(filename.endsWith('.jpg') || filename.endsWith('.png') || filename.endsWith('.gif'))) {
  alert('Can only upload image file.');
  return false;
}

File API

由于JavaScript对用户上传的文件操作非常有限,尤其是无法读取文件内容,使得很多需要操作文件的网页不得不用Flash这样的第三方插件来实现。

随着HTML5的普及,新增的File API允许JavaScript读取文件内容,获得更多的文件信息。

HTML5的File API提供了File和FileReader两个主要对象,可以获得文件信息并读取文件。

下面的例子演示了如何读取用户选取的图片文件,并在一个<div>中预览图像:

var
  fileInput = document.getElementById('test-image-file'),
  info = document.getElementById('test-file-info'),
  preview = document.getElementById('test-image-preview');
// 监听change事件:
fileInput.addEventListener('change', function () {
  // 清除背景图片:
  preview.style.backgroundImage = '';
  // 检查文件是否选择:
  if (!fileInput.value) {
    info.innerHTML = '没有选择文件';
    return;
  }
  // 获取File引用:
  var file = fileInput.files[0];
  // 获取File信息:
  info.innerHTML = '文件: ' + file.name + '<br>' +
           '大小: ' + file.size + '<br>' +
           '修改: ' + file.lastModifiedDate;
  if (file.type !== 'image/jpeg' && file.type !== 'image/png' && file.type !== 'image/gif') {
    alert('不是有效的图片文件!');
    return;
  }
  // 读取文件:
  var reader = new FileReader();
  reader.onload = function(e) {
    var
      data = e.target.result; // 'data:image/jpeg;base64,/9j/4AAQSk...(base64编码)...'      
    preview.style.backgroundImage = 'url(' + data + ')';
  };
  // 以DataURL的形式读取文件:
  reader.readAsDataURL(file);
});

上面的代码演示了如何通过HTML5的File API读取文件内容。以DataURL的形式读取到的文件是一个字符串,类似于data:image/jpeg;base64,/9j/4AAQSk...(base64编码)...,常用于设置图像。如果需要服务器端处理,把字符串base64,后面的字符发送给服务器并用Base64解码就可以得到原始文件的二进制内容。

回调

上面的代码还演示了JavaScript的一个重要的特性就是单线程执行模式。在JavaScript中,浏览器的JavaScript执行引擎在执行JavaScript代码时,总是以单线程模式执行,也就是说,任何时候,JavaScript代码都不可能同时有多于1个线程在执行。
你可能会问,单线程模式执行的JavaScript,如何处理多任务?

在JavaScript中,执行多任务实际上都是异步调用,比如上面的代码:

reader.readAsDataURL(file);

就会发起一个异步操作来读取文件内容。因为是异步操作,所以我们在JavaScript代码中就不知道什么时候操作结束,因此需要先设置一个回调函数:

reader.onload = function(e) {
  // 当文件读取完成后,自动调用此函数:
};

当文件读取完成后,JavaScript引擎将自动调用我们设置的回调函数。执行回调函数时,文件已经读取完毕,所以我们可以在回调函数内部安全地获得文件内容。

Javascript 相关文章推荐
style、 currentStyle、 runtimeStyle区别分析
Aug 01 Javascript
ExtJS 入门
Oct 29 Javascript
JavaScript instanceof 的使用方法示例介绍
Oct 23 Javascript
jquery批量设置属性readonly和disabled的方法
Jan 24 Javascript
JS实现点击颜色块切换指定区域背景颜色的方法
Feb 25 Javascript
bootstrap选项卡使用方法解析
Jan 11 Javascript
xmlplus组件设计系列之分隔框(DividedBox)(8)
May 02 Javascript
vue-cli如何添加less 以及sass
Jul 06 Javascript
微信小程序自定义tab实现多层tab嵌套功能
Jun 15 Javascript
Vue中 v-if/v-show/插值表达式导致闪现的原因及解决办法
Oct 12 Javascript
javascript实现切割轮播效果
Nov 28 Javascript
请求时token过期自动刷新token操作
Sep 11 Javascript
JavaScript之生成器_动力节点Java学院整理
Jun 30 #Javascript
详解vue组件通信的三种方式
Jun 30 #Javascript
JavaScript实现瀑布流图片效果
Jun 30 #Javascript
十大 Node.js 的 Web 框架(快速提升工作效率)
Jun 30 #Javascript
vue.js移动端tab组件的封装实践实例
Jun 30 #Javascript
jQuery表单设置值的方法
Jun 30 #jQuery
JavaScript注册时密码强度校验代码
Jun 30 #Javascript
You might like
PHP中实现获取IP和地理位置类分享
2015/02/10 PHP
PHP输出多个元素的排列或组合的方法
2017/03/14 PHP
thinkphp5.0整合phpsocketio完整攻略(绕坑)
2018/10/12 PHP
纯JS实现的批量图片预览加载功能
2011/08/14 Javascript
JavaScript原型链示例分享
2014/01/26 Javascript
使用JavaScript的ActiveXObject对象检测应用程序是否安装的方法
2014/04/15 Javascript
JavaScript计时器示例分析
2015/02/05 Javascript
jQuery动态添加及删除表单上传元素的方法(附demo源码下载)
2016/01/15 Javascript
jquery Form轻松实现文件上传
2017/05/24 jQuery
解决Extjs下拉框不显示的问题
2017/06/21 Javascript
vue组件之Alert的实现代码
2017/10/17 Javascript
node.js 用socket实现聊天的示例代码
2017/10/17 Javascript
JavaScript变量声明var,let.const及区别浅析
2018/04/23 Javascript
React如何解决fetch跨域请求时session失效问题
2018/11/02 Javascript
javascript History对象原理解析
2020/02/17 Javascript
基于leaflet.js实现修改地图主题样式的流程分析
2020/05/15 Javascript
python类继承用法实例分析
2014/10/10 Python
探究Python中isalnum()方法的使用
2015/05/18 Python
解决Python requests 报错方法集锦
2017/03/19 Python
使用tensorflow实现线性回归
2018/09/08 Python
使用TensorFlow实现简单线性回归模型
2019/07/19 Python
Python数据可视化实现正态分布(高斯分布)
2019/08/21 Python
Python数据结构dict常用操作代码实例
2020/03/12 Python
html5使用canvas实现图片下载功能的示例代码
2017/08/26 HTML / CSS
美国求婚钻戒网站:Super Jeweler
2016/08/27 全球购物
学生处主任岗位职责
2013/12/01 职场文书
医院实习介绍信
2014/01/12 职场文书
迟到检讨书1000字
2014/01/15 职场文书
房屋出售授权委托书
2014/10/12 职场文书
村官个人总结范文
2015/03/03 职场文书
第二次离婚起诉书
2015/05/18 职场文书
新闻稿怎么写
2015/07/18 职场文书
2016年师德先进个人事迹材料
2016/02/29 职场文书
为什么mysql字段要使用NOT NULL
2021/05/13 MySQL
pandas中DataFrame数据合并连接(merge、join、concat)
2021/05/30 Python
《艾尔登法环》发布最新「战技」宣传片
2022/04/03 其他游戏