html5文件夹上传,html中上传文件
长期以来,开发者一直被这个问题所困扰,大部分都采用了flash作为解决这个问题的方案。但是,flash并不是万能的。因为有了flash版本,割据政权带来的问题有时会变成噩梦。有些网站使用form标签的enctype=multipart/form-data属性,但是这个属性需要服务器进行特殊设置来显示进度,而且也比较复杂。复杂意味着容易出错,这不是我们想要的。
现在让我们看看Html5为什么能解决这个问题,以及它能做得有多好。
用HTML5上传文件
在HTML5标准中,XMLHttpRequest对象被重新定义为“XMLHttpRequest Level 2”,它包含以下五个新特性:
1.支持上传和下载字节流,如文件,blob和表单数据。
2.增加了上传和下载的进度事件。
3.支持跨域请求
4.允许发送匿名请求(即不发送HTTP的Referer部分)
5.允许设置请求的超时时间。
在本教程中,我们主要关注第一个和第二个特性,尤其是第二个,——,它可以提供我们想要的上传进度。与之前的方案不同,这个方案不需要服务器做特殊设置,可以边看教程边尝试。
上面的插图是我们可以实现的:
1.显示上传的文件信息,如文件名、类型和大小。
2.可以显示真实进度的进度条。
3.上传速度
4.剩余时间的估计
5.上传的数据量
6.上传后服务器返回的响应。
另外,使用XMLHttpRequest,我们的上传过程都是异步的,因此用户在上传文件时仍然可以操作网页中的其他元素,而无需等待上传完成。上传完成后,我们可以得到服务器的响应,所以整个上传过程是相当符合逻辑的。
HTML5的进度事件
HTML5中有一个新的Progress Events,它为我们提供了以下信息:
1.总文件大小
2.已加载上传的大小。
3.长度是可计算的——进度是可计算的吗?
信息不多,但足以算出文件的进度。当然还有很多东西它没有直接给,非常遗憾。
HTML
和普通的文件上传代码没有太大区别。但是,请注意,输入标记与onchange上的JavaScript函数相关联。
!Type dochtmlhtmlhtmlhead title使用XMLHttpRequest上载文件/title/headbydyformid= form 1 enctype= multipart/form-data method= post action= Upload . PHP div class= row label for= fileToUpload 选择要上载的文件/label input type= File name= fileToUpload id= fileToUpload onchange= files elected();//div div id= fileName /div div id= fileSize /div div id= fileType /div div class= row input type= button onclick= uploadFile() value= Upload //div div id= progress number /div/form/body/htmlJavaScript
一旦我们在HTML中使用了input,我们就可以在JS代码中获得一个FileList对象。这个对象是HTML5中新添加的文件API的一部分。每个文件列表对象都是一组文件对象,它们具有以下属性:
1.名称文件名(不包括路径)
2.type文件的MIME类型(小写)
3.大小文件的大小(以字节为单位)
这正是我们所需要的。当然,HTML5中还有一个FileReader对象,但我们这里不使用。现在通过以上三项内容,我们已经能够控制用户上传的文件大小和文件类型,从而减少服务器再次检测时的压力,提高安全系数。
函数files elected(){ var file=document。getelementbyid( fileToUpload ).文件[0];if(file){ var fileSize=0;如果(文件。大小1024 * 1024)文件大小=(数学。圆形(文件。尺寸* 100/(1024 * 1024))/100 .toString()" MB ";else文件大小=(数学。圆形(文件。尺寸* 100/1024)/100).toString()" KB ";文档。getelementbyid(“文件名”).innerHTML= Name:文件。姓名;文档。getelementbyid( fileSize )。innerHTML= Size: fileSize;文档。getelementbyid(“fileType”).innerHTML= Type:文件。类型;}}那么当用户选择好文件,点击上传之后,又将发生什么呢?
函数uploadFile(){ var xhr=new XMLHttpRequest();var FD=文档。getelementbyid(“form 1”).getFormData();/*事件侦听器*/xhr。上传。addevent侦听器( progress ,uploadProgress,false);xhr.addEventListener(load ,uploadComplete,false);xhr.addEventListener(error ,uploadFailed,false);xhr.addEventListener(abort ,uploadCanceled,false);/*确保将下面的全球资源定位器(Uniform Resource Locator)更改为您的上传服务器端脚本*/xhr.open(POST , upload.php )的网址;xhr。发送(FD);}函数上传进度(evt){ if(evt。长度可计算){ var完成百分比=数学。圆形(evt。加载* 100/evt。合计);文档。getelementbyid(“进度号”).innerHTML=完成百分比。tostring()“%”;} else {文档。getelementbyid(“进度号”).innerHTML="无法计算";} }功能上传完成(evt){/*服务器发回响应*/alert(evt。目标。响应文本)时引发此事件;}函数上传失败{ alert(试图上传文件时出错。);}函数上传已取消(evt) { alert(用户取消了上传,或者浏览器断开了连接。);}在代码的第二行中,我们的射流研究…代码又使用了另一个HTML5推出的新对象——表单数据。上传对象是用户的表单数据的集合,它以键值对的形式存储了表单数据,其值能够包括数字、字符串以及文件。我们通过辗转这个对象,来向服务器提交数据。
当然,这个对象我们也可以在代码中手工构建,比如说像下面这样:
var FD=new FormData();fd.append(author , Shiv Kumar );fd.append(name , Html 5文件API/FormData’);fd.append(fileToUpload ,document。getelementbyid( fileToUpload ).文件[0]);回到正题。回顾上一段代码,我们增加了许多有关XMLHttpRequest的事件监听,其目的是为了获取文件上传的真实情况。尤其需要注意的是,我们所挂钩的,并不是XMLHttpRequest本身,而是其属性,比如上传进度。
完整代码
最后,来看看完整的代码。
!文档类型html html标题使用XMLHttpRequest -最小上传文件/title脚本类型= text/JavaScript 函数files elected(){ var file=document。getelementbyid( fileToUpload ).文件[0];if(file){ var fileSize=0;如果(文件。大小1024 * 1024)文件大小=(数学。圆形(文件。尺寸* 100/(1024 * 1024))/100 .toString()" MB ";else文件大小=(数学。圆形(文件。尺寸* 100/1024)/100).toString()" KB ";文档。getelementbyid(“文件名”).innerHTML= Name:文件。姓名;文档。getelementbyid( fileSize )。innerHTML= Size: fileSize;文档。getelementbyid(“fileType”).innerHTML= Type:文件。类型;} }函数uploadFile(){ var FD=new FormData();fd.append(fileToUpload ,document。getelementbyid( fileToUpload ).文件[0]);var xhr=new XMLHttpRequest();xhr。上传。addevent侦听器( progress ,uploadProgress,false);xhr.addEventListener(load ,uploadComplete,false);xhr.addEventListener(error ,uploadFailed,false);xhr.addEventListener(abort ,uploadCanceled,false);xhr.open(POST ,上传最少。aspx’);xhr。发送(FD);}函数上传进度(evt){ if(evt。长度可计算){ var完成百分比=数学。圆形(evt。加载* 100/evt。合计);文档。getelementbyid(“进度号”).innerHTML=完成百分比。tostring()“%”;} else {文档。getelementbyid(“进度号”).innerHTML="无法计算";} }功能上传完成(evt){/*服务器发回响应*/alert(evt。目标。响应文本)时引发此事件;}函数上传失败{ alert(试图上传文件时出错。);}函数上传已取消(evt) { alert(用户取消了上传,或者浏览器断开了连接。);}/script/head body form id= form 1 enctype= multipart/form-data method= post action= Upload。= fileToUpload 的PHP div class= row 标签选择要上载的文件/label input type= File name= fileToUpload id= fileToUpload onchange= files elected();//div div id= fileName /div div id= fileSize /div div id= fileType /div div class= row input type= button onclick= Upload file() value= Upload /div div id= progress number /div/form/body/html我们的任务完成了吗?可以说完成了,因为这段代码已经能够完成上传文件的任务,而且也能够显示上传的进度;但是理应说我们没有,因为除了这个骨架超文本标记语言之外,我们还有很多没有做的事情,比如半铸钢钢性铸铁(铸造半钢)的美化等等。不过这就不是我们这篇文章的主题了。
最后,提醒一下,教程的代码应当在支持新特性的浏览器之上运行,如果你不清楚自己的浏览器是否支持,可以在这里查询。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。