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 相关文章推荐
js 解决“options为空或不是对象”
Dec 22 Javascript
jQuery之end()和pushStack()使用介绍
Feb 07 Javascript
浅析hasOwnProperty方法的应用
Nov 20 Javascript
JavaScript验证18位身份证号码最后一位正确性的实现代码
Aug 07 Javascript
每天一篇javascript学习小结(属性定义方法)
Nov 19 Javascript
location.hash保存页面状态的技巧
Apr 28 Javascript
IE8兼容Jquery.validate.js的问题
Dec 01 Javascript
浅谈angular表单提交中ng-submit的默认使用方法
Sep 30 Javascript
Javascript读写cookie的实例源码
Mar 16 Javascript
jQuery实现input[type=file]多图预览上传删除等功能
Aug 02 jQuery
vue与django集成打包的实现方法
Nov 11 Javascript
jQuery实现回到顶部效果
Oct 19 jQuery
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实现RSA加密类实例
2015/03/26 PHP
PHP实现的简单网络硬盘
2015/07/29 PHP
Yii2针对指定url的生成及图片等的引入方法小结
2016/07/18 PHP
微信公众号开发之获取位置信息php代码
2018/06/13 PHP
js版本A*寻路算法
2006/12/22 Javascript
有关JavaScript的10个怪癖和秘密分享
2011/08/28 Javascript
9款2014最热门jQuery实用特效推荐
2014/12/07 Javascript
javascript继承的六大模式小结
2015/04/13 Javascript
js实现鼠标点击文本框自动选中内容的方法
2015/08/20 Javascript
JavaScript中的this到底是什么(一)
2015/12/09 Javascript
JavaScript代码因逗号不规范导致IE不兼容的问题
2016/02/25 Javascript
angular4中关于表单的校验示例
2017/10/16 Javascript
JavaScript基础心法 深浅拷贝(浅拷贝和深拷贝)
2018/03/05 Javascript
详解Vue This$Store总结
2018/12/17 Javascript
Vue分页插件的前后端配置与使用
2019/10/09 Javascript
[38:21]2018DOTA2亚洲邀请赛3月30日 小组赛A组 LGD VS Newbee
2018/03/31 DOTA
深入解析Python中的urllib2模块
2015/11/13 Python
Python彩色化Linux的命令行终端界面的代码实例分享
2016/07/02 Python
python实现在IDLE中输入多行的方法
2018/04/19 Python
django mysql数据库及图片上传接口详解
2019/07/18 Python
用python画一只可爱的皮卡丘实例
2019/11/21 Python
使用CSS3滤镜的filter:blur属性制作毛玻璃模糊效果的方法
2016/07/08 HTML / CSS
html5中去掉input type date默认样式的方法
2018/09/06 HTML / CSS
移动端Html5页面生成图片解决方案
2018/08/07 HTML / CSS
Made in Design英国:设计家具、照明、家庭装饰和花园家具
2019/09/24 全球购物
WEB控件及HTML服务端控件能否调用客户端方法?如果能,请解释如何调用?
2015/08/25 面试题
linux面试题参考答案(6)
2016/06/23 面试题
临床医学专业毕业生的自我评价
2013/10/17 职场文书
互联网创业计划书的书写步骤
2014/01/28 职场文书
护理专业学生职业生涯规划范文
2014/03/11 职场文书
2014年个人教学工作总结
2014/12/09 职场文书
检讨书范文2000字
2015/01/28 职场文书
房地产销售员岗位职责
2015/04/11 职场文书
《这片土地是神圣的》教学反思
2016/02/16 职场文书
创业计划书之校园超市
2019/09/12 职场文书
神州牡丹园的导游词
2019/11/20 职场文书