本文摘要:http://www.liaoxuefeng.com/
在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也无法获得该文件的真实路径:
//当设置了Enctype为multipart/form-data 可以传多格式的,不仅限于图片
<form id="form1" runat="server" enctype="multipart/form-data" method="post" action="表格提交的去向"> //要在后台得到数据,这里的action需要给个页面或一般处理程序<input id="File1" type="file" name="File1" /> //如果需要在后台获取信息,这边的标签必须带name属性,后台的Form["XX"]才会有值<input id="Button1" type="button" value="button" /> //这里的type类型改成Submit才能触发表单提交<script src="../js/jquery-1.11.0.min.js"></script><script>'use strict';$("#Button1").click(function () {var filename = document.getElementById("File1").value; //这只是个路径,而且不是真实的
//对文件内类进行过滤if (!filename || !(filename.endsWith('.jpg') || filename.endsWith('.png') || filename.endsWith('.gif'))) {alert('Can only upload image file.');return false;}})</script></form>
我们上传一般只能一个路径,需要文件信息,我们一般在后台去做。
File API 可以在前台就直接获取文件信息,不用在去后台获取
由于JavaScript对用户上传的文件操作非常有限,尤其是无法读取文件内容,使得很多需要操作文件的网页不得不用Flash这样的第三方插件来实现。
随着HTML5的普及,新增的File API允许JavaScript读取文件内容,获得更多的文件信息。
HTML5的File API提供了File
和FileReader
两个主要对象,可以获得文件信息并读取文件。
关于 FIle和FileReader的了解 参考 https://developer.mozilla.org/en-US/docs/Web/API/File
<input id="File1" type="file" /> <div><img id="im" style="width:100px;height:200px" /></div><div id="info"></div><script src="../js/jquery-1.11.0.min.js"></script><script>'use strict';var fileInput = document.getElementById("File1");var im = document.getElementById("im");var info = document.getElementById("info");//监听change事件fileInput.addEventListener("change", function () {if (!fileInput.value) { //非空非零即为真info.innerHTML = "你没有选择文件";return ; //事件里面遇到return就退出了 }
//以下代码看不懂先去了解File Api里面的File和FileReader对象var file = fileInput.files[0];//单个上传,只有一个就是0info.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=reader.result; 这样也可以获取到var data = e.target.result; //data:image/jpeg;base64,/9j/4AAQSk...(base64编码)... //console.log(data); 这个输出来看了一下好多,也看不懂,而且还把网页卡住了im.src = data;}
//回调 reader.readAsDataURL(file); //用于读取File内容,读取完成后,会触发onload事件 })</script>
结果:
解释:
该readAsDataURL
方法用于读取指定Blob
或的内容File
。读取操作完成后,readyState
变成DONE
,loadend
被触发。此时,该result
属性包含 the data as a
表示文件数据的URL作为base64编码字符串。
上面的代码演示了如何通过HTML5的File API读取文件内容。以DataURL的形式读取到的文件是一个字符串,类似于data:image/jpeg;base64,/9j/4AAQSk...(base64编码)...
,常用于设置图像。如果需要服务器端处理,把字符串base64,
后面的字符发送给服务器并用Base64解码就可以得到原始文件的二进制内容。