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 相关文章推荐
原来Jquery.load的方法可以一直load下去
Mar 28 Javascript
jquery 鼠标滑动显示详情应用示例
Jan 24 Javascript
javascript基本包装类型介绍
Apr 10 Javascript
JavaScript实现随机替换图片的方法
Apr 16 Javascript
JS基于Mootools实现的个性菜单效果代码
Oct 21 Javascript
基于jQuery制作小图标上下滑动特效
Jan 18 Javascript
Angular实现较为复杂的表格过滤,删除功能示例
Dec 23 Javascript
微信小程序实现swiper切换卡内嵌滚动条不显示的方法示例
Dec 20 Javascript
NestJs 静态目录配置详解
Mar 12 Javascript
JS实现网页端猜数字小游戏
Mar 06 Javascript
如何使用jQuery操作Cookies方法解析
Sep 08 jQuery
vue实现两个组件之间数据共享和修改操作
Nov 12 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
浅谈本地WAMP环境的搭建
2015/05/13 PHP
php生成Android客户端扫描可登录的二维码
2016/05/13 PHP
laravel框架如何设置公共头和公共尾
2019/10/22 PHP
js去除重复字符串两种实现方法
2013/01/09 Javascript
基于JavaScript 数据类型之Boolean类型分析介绍
2013/04/19 Javascript
js 实现日期灵活格式化的小例子
2013/07/14 Javascript
JQuery中dataGrid设置行的高度示例代码
2014/01/03 Javascript
理解js回收机制通俗易懂版
2016/02/29 Javascript
JavaScript学习笔记之数组去重
2016/03/23 Javascript
JavaScript中的数组遍历forEach()与map()方法以及兼容写法介绍
2016/05/19 Javascript
浅谈String.valueOf()方法的使用
2016/06/06 Javascript
浅谈js的异步执行
2016/10/18 Javascript
js仿QQ邮箱收件人选择与搜索功能
2017/02/10 Javascript
layui弹出层效果实现代码
2017/05/19 Javascript
[34:27]DOTA2上海特级锦标赛B组败者赛 VG VS Spirit第一局
2016/02/26 DOTA
[01:10:48]完美世界DOTA2联赛PWL S2 GXR vs PXG 第一场 11.18
2020/11/18 DOTA
Python实现从url中提取域名的几种方法
2014/09/26 Python
Python脚本实现DNSPod DNS动态解析域名
2015/02/14 Python
在Python的Django框架中实现Hacker News的一些功能
2015/04/17 Python
python实现自动更换ip的方法
2015/05/05 Python
浅谈python新手中常见的疑惑及解答
2016/06/14 Python
SQLite3中文编码 Python的实现
2017/01/11 Python
Python 判断文件或目录是否存在的实例代码
2018/07/19 Python
Python实现二叉树的最小深度的两种方法
2019/09/30 Python
Python三元运算与lambda表达式实例解析
2019/11/30 Python
Python 限定函数参数的类型及默认值方式
2019/12/24 Python
Python生成器传参数及返回值原理解析
2020/07/22 Python
你正在寻找的CSS3 动画技术
2011/07/27 HTML / CSS
The North Face北面荷兰官网:美国著名户外品牌
2019/10/16 全球购物
销售心得体会
2014/01/02 职场文书
工作会议欢迎词
2014/01/16 职场文书
中青班党性分析材料
2014/02/16 职场文书
2014村务公开实施方案
2014/02/25 职场文书
党的群众路线教育实践方案
2014/05/11 职场文书
学校四风问题对照检查材料思想汇报
2014/09/26 职场文书
青年干部培训班学习心得体会
2016/01/06 职场文书