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 相关文章推荐
JavaScript 克隆数组最简单的方法
Feb 12 Javascript
jquery模拟LCD 时钟的html文件源代码
Jun 16 Javascript
jQuery中triggerHandler()方法用法实例
Jan 19 Javascript
jQuery实现contains方法不区分大小写的方法
Feb 13 Javascript
javascript实现dom动态创建省市纵向列表菜单的方法
May 14 Javascript
JavaScript中Form表单技术汇总(推荐)
Jun 26 Javascript
js控制li的隐藏和显示实例代码
Oct 15 Javascript
JavaScript时间与时间戳的转换操作实例分析
Dec 07 Javascript
微信小程序获取用户openid的实现
Dec 24 Javascript
express + jwt + postMan验证实现持久化登录
Jun 05 Javascript
python实现迭代法求方程组的根过程解析
Nov 25 Javascript
JS异步堆栈追踪之为什么await胜过Promise
Apr 28 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
模拟flock实现文件锁定
2007/02/14 PHP
php下使用无限生命期Session的方法
2007/03/16 PHP
php把数组值转换成键的方法
2015/07/13 PHP
php简单实现数组分页的方法
2016/04/30 PHP
PHP 结合 Boostrap 结合 js 实现学生列表删除编辑及搜索功能
2019/05/21 PHP
优秀js开源框架-jQuery使用手册(1)
2007/03/10 Javascript
JQuery 学习笔记 选择器之五
2009/07/23 Javascript
jquery 常用操作整理 基础入门篇
2009/10/14 Javascript
jquery easyui combox一些实用的小方法
2013/12/25 Javascript
JS字符串拼接在ie中都报错的解决方法
2014/03/27 Javascript
js判断游览器类型及版本号的代码
2014/05/11 Javascript
jQuery实现网页抖动的菜单抖动效果
2015/08/07 Javascript
jquery实现弹出层登录和全屏层注册特效
2015/08/28 Javascript
javascript合并表格单元格实例代码
2016/01/03 Javascript
jQuery获取checkbox选中的值
2016/01/28 Javascript
浅谈JS继承_借用构造函数 &amp; 组合式继承
2016/08/16 Javascript
基于js实现checkbox批量选中操作
2016/11/22 Javascript
AngularJS1.X学习笔记2-数据绑定详解
2017/04/01 Javascript
vue-cli webpack 开发环境跨域详解
2017/05/18 Javascript
element 结合vue 在表单验证时有值却提示错误的解决办法
2018/01/22 Javascript
Vue 全局loading组件实例详解
2018/05/29 Javascript
微信小程序实现点击卡片 翻转效果
2019/09/04 Javascript
[59:00]OG vs TNC 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
在Python的Flask框架中验证注册用户的Email的方法
2015/09/02 Python
Python实现的各种常见分布算法示例
2018/12/13 Python
Python实现截取PDF文件中的几页代码实例
2019/03/11 Python
详解字符串在Python内部是如何省内存的
2020/02/03 Python
详解pandas映射与数据转换
2021/01/22 Python
在线吉他课程,学习如何弹吉他:Fender Play
2019/02/28 全球购物
思想品德自我鉴定
2013/10/12 职场文书
团队激励口号
2014/06/06 职场文书
大学生心理活动总结
2014/07/04 职场文书
食品安全承诺书范文
2014/08/29 职场文书
党员四风问题个人对照检查材料
2014/10/26 职场文书
mysql多表查询-笔记七
2021/04/05 MySQL
Nginx中使用Lua脚本与图片的缩略图处理的实现
2022/03/18 Servers