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 XML实现两级级联下拉列表
Nov 10 Javascript
表格单元格交错着色实现思路及代码
Apr 01 Javascript
举例详解AngularJS中ngShow和ngHide的使用方法
Jun 19 Javascript
Jquery实现仿京东商城省市联动菜单
Nov 19 Javascript
全面解析bootstrap格子布局
May 22 Javascript
AngularJS表格详解及示例代码
Aug 17 Javascript
原生js仿jquery一些常用方法(必看篇)
Sep 20 Javascript
node.js基于mongodb的搜索分页示例
Jan 22 Javascript
Vue制作Todo List网页
Apr 26 Javascript
javascript 构建模块化开发过程解析
Sep 11 Javascript
vue使用axios实现excel文件下载的功能
Jul 16 Javascript
浅谈Vue使用Elementui修改默认的最快方法
Dec 05 Vue.js
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.ini 中文版
2006/10/28 PHP
队列在编程中的实际应用(php)
2010/09/04 PHP
关于php连接mssql:pdo odbc sql server
2011/07/20 PHP
深入file_get_contents与curl函数的详解
2013/06/25 PHP
php eval函数一句话木马代码
2015/05/21 PHP
Laravel实现autoload方法详解
2017/05/07 PHP
Laravel中encrypt和decrypt的实现方法
2017/09/24 PHP
ThinkPHP5.0框架实现切换数据库的方法分析
2019/10/30 PHP
Laravel 集成微信用户登录和绑定的实现
2019/12/27 PHP
HTML5如何适配 iPhone IOS 底部黑条
2021/03/09 HTML / CSS
Add a Table to a Word Document
2007/06/15 Javascript
AJAX 网页保留浏览器前进后退等功能
2011/02/12 Javascript
js+css使DIV始终居于屏幕中间 左下 左上 右上 右下的代码集合
2011/03/10 Javascript
node.js [superAgent] 请求使用示例
2015/03/13 Javascript
Node.js中Request模块处理HTTP协议请求的基本使用教程
2016/03/31 Javascript
javascript中获取class的简单实现
2016/07/12 Javascript
jQuery滚动插件scrollable.js用法分析
2017/05/25 jQuery
详解React Native 屏幕适配(炒鸡简单的方法)
2018/06/11 Javascript
IE11下CKEditor在Bootstrap Modal中下拉问题的解决
2019/09/25 Javascript
vue实现弹幕功能
2019/10/25 Javascript
Python 内置函数memoryview(obj)的具体用法
2017/11/23 Python
scrapy爬虫完整实例
2018/01/25 Python
python计算两个数的百分比方法
2018/06/29 Python
python tkinter GUI绘制,以及点击更新显示图片代码
2020/03/14 Python
python3 中时间戳、时间、日期的转换和加减操作
2020/07/14 Python
Python Unittest原理及基本使用方法
2020/11/06 Python
Scrapy-Redis之RedisSpider与RedisCrawlSpider详解
2020/11/18 Python
移动端html5判断是否滚动到底部并且下拉加载
2019/11/19 HTML / CSS
美国厨房和园艺工具网上商店:Nestneed
2019/08/24 全球购物
Ever New美国:澳大利亚领先的女装时尚品牌
2019/11/28 全球购物
生物化学研究助理员求职信
2013/10/09 职场文书
结婚保证书范文
2014/04/29 职场文书
2014年党员自我评议总结
2014/09/23 职场文书
离婚协议书怎么写
2015/01/26 职场文书
2015年后备干部工作总结
2015/05/15 职场文书
SQL基础的查询语句
2021/11/11 MySQL