input[type="file"]上传文件原理详解
最近又搞了一下上传文件功能,用别人的插件不大符合自己要求,还是用HTML5的input[type="file"]比较好控制,现在重新回顾一下使用input[type="file"]上传文件
【1】修改input[type="file"] 的样式
我个人感觉input type=file 的样式有点丑,还是修改修改
<a type="button" class="layui-btn layui-btn-normal upload" id="up_btn">
<input class="change" type="file" multiple="multiple" id="files" />
<i class="fa fa-upload"></i>上传音频
</a>
<a type="button" class="layui-btn layui-btn-primary" onclick="delAll()">
<input class="" type="file" multiple="multiple" />
</a>
<style>
.upload{
padding: 4px 10px;
height: 20px;
position: relative;
}
//隐藏
.change{
position: absolute;
overflow: hidden;
right: 0;
top: 0;
opacity: 0;
}
【2】input[type="file"]的属性
- multiple="multiple" 可接受多个值的文件上传字段
input[type="file"]可以实现上传多个文件,只需要给<input>添加multiple="multiple"属性便实现同时上传多个文件效果。
2) accept="application/x-msdownload,video/*"
input[type="file"]可以实现限定上传的文件类型,只需要给<input>添加 accept="video/*"(限定只上传视频文件)属性。
可以通过accept规定上传的文件类型,可以定义多个文件类型,用逗号隔开。
注意请不要将该属性作为唯一的验证工具,应该在服务器上对文件上传进行验证。
文件后缀名 文件类型
*.3gpp | audio/3gpp, video/3gpp | 3GPP Audio/Video |
*.ac3 | audio/ac3 | AC3 Audio |
*.asf | allpication/vnd.ms-asf | Advanced Streaming Format |
*.au | audio/basic | AU Audio |
*.css | text/css | Cascading Style Sheets |
*.csv | text/csv | Comma Separated Values |
*.doc | application/msword | MS Word Document |
*.dot | application/msword | MS Word Template |
*.dtd | application/xml-dtd | Document Type Definition |
*.dwg | image/vnd.dwg | AutoCAD Drawing Database |
*.dxf | image/vnd.dxf | AutoCAD Drawing Interchange Format |
*.gif | image/gif | Graphic Interchange Format |
*.html | text/html | HyperText Markup Language |
*.jp2 | image/jp2 | JPEG-2000 |
*.jpe | image/jpeg | JPEG |
*.jpeg | image/jpeg | JPEG |
*.jpg | image/jpeg | JPEG |
*.js | text/javascript, application/javascript | JavaScript |
*.json | application/json | JavaScript Object Notation |
*.mp2 | audio/mpeg, video/mpeg | MPEG Audio/Video Stream, Layer II |
*.mp3 | audio/mpeg | MPEG Audio Stream, Layer III |
*.mp4 | audio/mp4, video/mp4 | MPEG-4 Audio/Video |
*.mpeg | video/mpeg | MPEG Video Stream, Layer II |
*.mpg | video/mpeg | MPEG Video Stream, Layer II |
*.mpp | application/vnd.ms-project | MS Project Project |
*.ogg | application/ogg, audio/ogg | Ogg Vorbis |
application/pdf | Portable Document Format | |
*.png | image/png | Portable Network Graphics |
*.pot | application/vnd.ms-powerpoint | MS PowerPoint Template |
*.pps | application/vnd.ms-powerpoint | MS PowerPoint Slideshow |
*.ppt | application/vnd.ms-powerpoint | MS PowerPoint Presentation |
*.rtf | application/rtf, text/rtf | Rich Text Format |
*.svf | image/vnd.svf | Simple Vector Format |
*.tif | image/tiff | Tagged Image Format File |
*.tiff | image/tiff | Tagged Image Format File |
*.txt | text/plain | Plain Text |
*.wdb | application/vnd.ms-works | MS Works Database |
*.wps | application/vnd.ms-works | Works Text Document |
*.xhtml | application/xhtml+xml | Extensible HyperText Markup Language |
*.xlc | application/vnd.ms-excel | MS Excel Chart |
*.xlm | application/vnd.ms-excel | MS Excel Macro |
*.xls | application/vnd.ms-excel | MS Excel Spreadsheet |
*.xlt | application/vnd.ms-excel | MS Excel Template |
*.xlw | application/vnd.ms-excel | MS Excel Workspace |
*.xml | text/xml, application/xml | Extensible Markup Language |
*.zip | aplication/zip | Compressed Archive |
【3】解析获取input[type="file"]的文件数据
- 如果你想要选中文件就自动提交可以给input[type="file"]onchange的改变事件,当你选择完文件就会执行该事件。
- input[type="file"]数据解析
从输出的数据分析就知道获取的数据是一个数组,可以根据length获取上传的某个文件的信息
var f=document.getElementById("files");
console.log(f.files);
【4】如何与后台交互数据
- 可以通过form表单提交,但注意要给form表单添加两个属性
1】method="post" 要用post提交
2】 enctype="multipart/form-data" 要修改请求参数的格式
- 可以通过由<form>表单构造的FormData对象,将需要请求参数以键值对的形式添加到FormData构造函数,由FormData构造函数传递数据给后台
(反正我觉得FormDate非常好用)
function upinput(){
//new FormData的参数是一个DOM对象,而非jQuery对象
var formData = new FormData();
//获取该input的所有元素、属性
var f=document.getElementById("files");
var userID=document.getElementById("userID").value;
for ( var i = 0; i < f.files.length; i++) {
var strname="file"+i;
//判断文件是否符合要求
if (!/\.(swf|flv|mp4|rmvb|avi|mpeg|ra|ram|mov|wmv)$/.test(f.files[i].name)) {
layer.alert("该上传的文件不是视频文件类型!", { icon: 5 , anim: 6 });
break;
}
//将参数以键值对的形式添加到formDate构造函数
formData.append("userID", userID);
formData.append(strname, f.files[i]);
}
console.log(f.files);
$.ajax({
url: "${ctx}/web/MyMusicServlet?method=uploadFiles&type=video",
type: 'POST',
data: formData, // 上传formdata封装的数据
async: true,
// 下面三个参数要指定,如果不指定,会报一个JQuery的错误
cache: false, // 不缓存
// 不设置内容类型 jQuery不要去设置Content-Type请求头
contentType: false,
processData: false, // jQuery不要去处理发送的数据
success: function (data) { //成功回调
if (msg == "新增成功!") {
layer.alert(data);
} else {
layer.alert(data);
}
},
error: function (data) {
alert(data);
}
});
}
【5】其他细节操作
如果想要实现预览、读取等细节操作,可以通过FileReader接口,FileReader接口提供了一个异步的API,通过这个API可以从浏览器中异步访问文件系统中的数据。因此,FileReader接口可以读取文件中的数据,并将读取的数据放入到内存中去。