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 Prototype对象
Jan 07 Javascript
jQuery 常见开发使用技巧总结
Dec 26 Javascript
GWT中复制到剪贴板 js+flash实现复制 兼容性比较好
Mar 07 Javascript
js prototype截取字符串函数
Apr 01 Javascript
jQuery javaScript捕获回车事件(示例代码)
Nov 07 Javascript
JavaScript中的正则表达式简明总结
Apr 04 Javascript
纯js代码实现未知宽高的元素在指定元素中垂直水平居中显示
Sep 12 Javascript
基于jquery实现ajax无刷新评论
Aug 19 Javascript
jQuery实现查找链接文字替换属性的方法
Jun 27 Javascript
vue实现图书管理demo详解
Oct 17 Javascript
Vue引入jquery实现平滑滚动到指定位置
May 09 jQuery
JS实现面向对象继承的5种方式分析
Jul 21 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中jpgraph类库的使用介绍
2013/08/08 PHP
thinkphp在模型中自动完成session赋值示例代码
2014/09/09 PHP
php异步多线程swoole用法实例
2014/11/14 PHP
PHP的swoole扩展安装方法详细教程
2016/05/18 PHP
php获取一定范围内取N个不重复的随机数
2016/05/28 PHP
PHP设计模式之工厂模式与单例模式
2016/09/28 PHP
简单谈谈 php 文件锁
2017/02/19 PHP
PHP正则之正向预查与反向预查讲解与实例
2020/04/06 PHP
csdn 博客的css样式 v3
2009/02/24 Javascript
善用事件代理,警惕闭包的性能陷阱。
2011/01/20 Javascript
js获取class的所有元素
2013/03/28 Javascript
js仿百度贴吧验证码特效实例代码
2014/01/16 Javascript
node.js中的emitter.on方法使用说明
2014/12/10 Javascript
jQuery弹出层插件Lightbox_me使用指南
2015/04/21 Javascript
JavaScript设计模式初探
2016/01/07 Javascript
Js的Array数组对象详解
2016/02/22 Javascript
jQuery实现将div中滚动条滚动到指定位置的方法
2016/08/10 Javascript
Angularjs实现mvvm式的选项卡示例代码
2016/09/08 Javascript
JavaScript实现打印星型金字塔功能实例分析
2017/09/27 Javascript
Node.js静态服务器的实现方法
2018/02/28 Javascript
Koa代理Http请求的示例代码
2018/10/10 Javascript
详解小程序input框失焦事件在提交事件前的处理
2019/05/05 Javascript
IE11下处理Promise及Vue的单项数据流问题
2019/07/24 Javascript
jQuery zTree如何改变指定节点文本样式
2020/10/16 jQuery
js 图片懒加载的实现
2020/10/21 Javascript
python开发之字符串string操作方法实例详解
2015/11/12 Python
详解python中的线程
2018/02/10 Python
Python3 chardet模块查看编码格式的例子
2019/08/14 Python
python实现sm2和sm4国密(国家商用密码)算法的示例
2020/09/26 Python
搭建pypi私有仓库实现过程详解
2020/11/25 Python
css3动画事件—webkitAnimationEnd与计时器time事件
2013/01/31 HTML / CSS
css 如何让背景图片拉伸填充避免重复显示
2013/07/11 HTML / CSS
欧洲最大的化妆品连锁公司:Douglas道格拉斯
2017/05/06 全球购物
一份全面的PHP面试问题考卷
2012/07/15 面试题
2014年度党员自我评议
2014/09/13 职场文书
ssh服务器拒绝了密码 请再试一次已解决(亲测有效)
2022/08/14 Servers