在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引擎将自动调用我们设置的回调函数。执行回调函数时,文件已经读取完毕,所以我们可以在回调函数内部安全地获得文件内容。
# js
# 操作文件
# javascript 操作文件 实现方法小结
# 表单
# 回调
# 上传
# 单线程
# 都是
# 是一个
# 就会
# 完成后
# 都不
# 尤其是
# 什么时候
# 没有任何
# 并在
# 我们可以
# 一个重要
# 并以
# 第三方
# 来实现
# 类似于
# 可以获得
相关文章:
如何用IIS7快速搭建并优化网站站点?
如何用搬瓦工VPS快速搭建个人网站?
如何注册花生壳免费域名并搭建个人网站?
Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解
小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建
免费公司网站制作软件,如何申请免费主页空间做自己的网站?
怀化网站制作公司,怀化新生儿上户网上办理流程?
php条件判断怎么写_ifelse和switchcase的使用区别【对比】
建站主机选购指南与交易推荐:核心配置解析
如何在云主机上快速搭建网站?
建站之星后台管理:高效配置与模板优化提升用户体验
已有域名能否直接搭建网站?
微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?
高端网站建设与定制开发一站式解决方案 中企动力
零基础网站服务器架设实战:轻量应用与域名解析配置指南
免费ppt制作网站,有没有值得推荐的免费PPT网站?
代购小票制作网站有哪些,购物小票的简要说明?
个人网站制作流程图片大全,个人网站如何注销?
如何用狗爹虚拟主机快速搭建网站?
无锡制作网站公司有哪些,无锡优八网络科技有限公司介绍?
深圳网站制作的公司有哪些,dido官方网站?
中山网站推广排名,中山信息港登录入口?
SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?
如何通过VPS建站无需域名直接访问?
香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧
制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?
教学网站制作软件,学习*后期制作的网站有哪些?
如何在阿里云虚拟服务器快速搭建网站?
如何通过网站建站时间优化SEO与用户体验?
西安大型网站制作公司,西安招聘网站最好的是哪个?
如何用AWS免费套餐快速搭建高效网站?
韩国服务器如何优化跨境访问实现高效连接?
如何在宝塔面板中创建新站点?
长沙做网站要多少钱,长沙国安网络怎么样?
全景视频制作网站有哪些,全景图怎么做成网页?
番禺网站制作公司哪家值得合作,番禺图书馆新馆开放了吗?
公司门户网站制作流程,华为官网怎么做?
婚礼视频制作网站,学习*后期制作的网站有哪些?
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
网站制作公司排行榜,抖音怎样做个人官方网站
建站之星安装后界面空白如何解决?
如何快速重置建站主机并恢复默认配置?
杭州银行网站设计制作流程,杭州银行怎么开通认证方式?
家具网站制作软件,家具厂怎么跑业务?
如何通过FTP服务器快速搭建网站?
高性能网站服务器配置指南:安全稳定与高效建站核心方案
宝塔新建站点为何无法访问?如何排查?
如何快速生成ASP一键建站模板并优化安全性?
香港服务器选型指南:免备案配置与高效建站方案解析
*请认真填写需求信息,我们会在24小时内与您取得联系。