亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > HTML > 正文

HTML5應用之文件上傳

2024-08-26 00:19:19
字體:
來源:轉載
供稿:網友

長期以來,開發者們一直為此苦惱,大部分為解決這個問題都采用了flash作為解決方案,但flash并非靈丹妙藥,因為flash版本,割據造成的問題有時反倒成為了噩夢。有些網站則采用了form標簽的enctype=multipart/form-data屬性,但這一屬性要求服務器作出特殊的設置才能夠顯示進度,而且本身也比較復雜,復雜就意味著容易出現錯誤,這可不是我們想要的。

現在我們來看看Html5為什么能夠解決這個問題,以及,它到底能做的多好。

用HTML5上傳文件

在HTML5標準中,XMLHttpRequest對象被重新定義,被稱為“XMLHttpRequest Level 2”,其中包含了以下5個新特性:

1、支持上傳、下載字節流,比如文件、blob以及表單數據

2、增加了上傳、下載中的進度事件

3、跨域請求的支持

4、允許發送匿名請求(即不發送HTTP的Referer部分)

5、允許設置請求的超時

在這篇教程中,我們主要關注第一和第二項特性,尤其是第二項——它能夠提供我們想要的上傳進度。和之前的方案不同,這個方案并不要求服務器作出特殊的設置,因此大家邊看教程就可以邊動手試試了。

html5,文件上傳,文件上傳進度,html5大文件上傳

html5,文件上傳,文件上傳進度,html5大文件上傳

上面圖示的就是我們能夠實現的內容:

1、顯示上傳的文件信息,比如文件名、類型、尺寸

2、一個能夠顯示真實進度的進度條

3、上傳的速度

4、剩余時間的估算

5、已上傳的數據量

6、上傳結束后服務器返回的響應

另外,憑借XMLHttpRequest,我們的上傳過程整個都是異步的,因此用戶在上傳文件的時候,依然可以操作網頁當中的其它元素,并不需要專門等待上傳的完成。而在上傳結束后,我們能夠獲取服務器發回的響應,因此整個上傳過程都顯得相當順理成章。

HTML5的進度事件

HTML5當中新增了一個進度事件(Progress Events),這個事件為我們提供了以下信息:

1、total – 文件大小

2、loaded – 已上傳的大小

3、lengthComputable – 進度是否可計算

信息并不多,但是在計算文件進度上已經足夠了。當然,也還有很多東西它沒有直接給出,這非常遺憾。

HTML

與普通的文件上傳代碼并沒有太大差異。不過注意,input標簽關聯了一個JavaScript函數在onchange上。

 <!DOCTYPE html><html><head>    <title>使用XMLHttpRequest上傳文件</title></head><body><form id="form1" enctype="multipart/form-data" method="post" action="upload.php"><div class="row">      <label for="fileToUpload">Select a File to Upload</label><input type="file" name="fileToUpload" id="fileToUpload" onchange="fileSelected();"/>    </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="progressNumber"></div></form></body></html>

JavaScript

一旦我們在HTML中使用了input,我們就可以在JS代碼中獲取到一個FileList對象。這個對象是HTML5中新增加的文件API中的一部分,每一個FileList對象都是一組文件對象的集合,而文件對象則擁有下列的屬性:

1、name – 文件名(不包含路徑)

2、type – 文件的MIME類型(小寫)

3、size – 文件的尺寸(單位為字節)

這正是我們所需要的。當然,HTML5中還有一個FileReader對象,但在這里我們并沒有用它?,F在,通過上面的三個內容,我們已經能夠控制用戶上傳的文件大小和文件類型,以便減輕服務器再次檢測時的壓力,并提升安全系數。

 function fileSelected() {  var file = document.getElementById('fileToUpload').files[0];  if (file) {    var fileSize = 0;    if (file.size > 1024 * 1024)      fileSize = (Math.round(file.size * 100 / (1024 * 1024)) / 100).toString() + 'MB';    else      fileSize = (Math.round(file.size * 100 / 1024) / 100).toString() + 'KB';    document.getElementById('fileName').innerHTML = 'Name: ' + file.name;    document.getElementById('fileSize').innerHTML = 'Size: ' + fileSize;    document.getElementById('fileType').innerHTML = 'Type: ' + file.type;  }}

那么當用戶選擇好文件,點擊上傳之后,又將發生什么呢?

 function uploadFile() {  var xhr = new XMLHttpRequest();  var fd = document.getElementById('form1').getFormData();  /* event listners */  xhr.upload.addEventListener("progress", uploadProgress, false);  xhr.addEventListener("load", uploadComplete, false);  xhr.addEventListener("error", uploadFailed, false);  xhr.addEventListener("abort", uploadCanceled, false);  /* Be sure to change the url below to the url of your upload server side script */  xhr.open("POST", "upload.php");  xhr.send(fd);}function uploadProgress(evt) {  if (evt.lengthComputable) {    var percentComplete = Math.round(evt.loaded * 100 / evt.total);    document.getElementById('progressNumber').innerHTML = percentComplete.toString() + '%';  }  else {    document.getElementById('progressNumber').innerHTML = 'unable to compute';  }}function uploadComplete(evt) {  /* This event is raised when the server send back a response */  alert(evt.target.responseText);}function uploadFailed(evt) {  alert("There was an error attempting to upload the file.");}function uploadCanceled(evt) {  alert("The upload has been canceled by the user or the browser dropped the connection.");}

在代碼的第二行中,我們的JS代碼又使用了另一個HTML5推出的新對象——FormData。FormData對象是用戶的表單數據的集合,它以鍵值對的形式存儲了表單數據,其值能夠包括數字、字符串以及文件。我們通過輾轉這個對象,來向服務器提交數據。

當然,這個對象我們也可以在代碼中手工構建,比如說像下面這樣:

var fd = new FormData();fd.append("author", "Shiv Kumar");fd.append("name", "Html 5 File API/FormData");fd.append("fileToUpload", document.getElementById('fileToUpload').files[0]);

回到正題?;仡櫳弦欢未a,我們增加了許多有關XMLHttpRequest的事件監聽,其目的是為了獲取文件上傳的真實情況。尤其需要注意的是,我們所掛鉤的,并不是XMLHttpRequest本身,而是其屬性,比如uploadProgress。

完整代碼

最后,來看看完整的代碼。

 <!DOCTYPE html><html><head>    <title>Upload Files using XMLHttpRequest - Minimal</title>    <script type="text/javascript">      function fileSelected() {        var file = document.getElementById('fileToUpload').files[0];        if (file) {          var fileSize = 0;          if (file.size > 1024 * 1024)            fileSize = (Math.round(file.size * 100 / (1024 * 1024)) / 100).toString() + 'MB';          else            fileSize = (Math.round(file.size * 100 / 1024) / 100).toString() + 'KB';          document.getElementById('fileName').innerHTML = 'Name: ' + file.name;          document.getElementById('fileSize').innerHTML = 'Size: ' + fileSize;          document.getElementById('fileType').innerHTML = 'Type: ' + file.type;        }      }      function uploadFile() {        var fd = new FormData();        fd.append("fileToUpload", document.getElementById('fileToUpload').files[0]);        var xhr = new XMLHttpRequest();        xhr.upload.addEventListener("progress", uploadProgress, false);        xhr.addEventListener("load", uploadComplete, false);        xhr.addEventListener("error", uploadFailed, false);        xhr.addEventListener("abort", uploadCanceled, false);        xhr.open("POST", "UploadMinimal.aspx");        xhr.send(fd);      }      function uploadProgress(evt) {        if (evt.lengthComputable) {          var percentComplete = Math.round(evt.loaded * 100 / evt.total);          document.getElementById('progressNumber').innerHTML = percentComplete.toString() + '%';        }        else {          document.getElementById('progressNumber').innerHTML = 'unable to compute';        }      }      function uploadComplete(evt) {        /* This event is raised when the server send back a response */        alert(evt.target.responseText);      }      function uploadFailed(evt) {        alert("There was an error attempting to upload the file.");      }      function uploadCanceled(evt) {        alert("The upload has been canceled by the user or the browser dropped the connection.");      }    </script></head><body><form id="form1" enctype="multipart/form-data" method="post" action="upload.php"><div class="row">      <label for="fileToUpload">Select a File to Upload</label><input type="file" name="fileToUpload" id="fileToUpload" onchange="fileSelected();"/>    </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="progressNumber"></div></form></body></html>

我們的任務完成了嗎?可以說完成了,因為這段代碼已經能夠完成上傳文件的任務,而且也能夠顯示上傳的進度;但是理應說我們沒有,因為除了這個骨架HTML之外,我們還有很多沒有做的事情,比如CSS的美化等等。不過這就不是我們這篇文章的主題了。

最后,提醒一下,教程的代碼應當在支持新特性的瀏覽器之上運行,如果你不清楚自己的瀏覽器是否支持,可以在這里查詢。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到HTML教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩成人在线视频| 操日韩av在线电影| 日韩av电影在线免费播放| 国产mv免费观看入口亚洲| 搡老女人一区二区三区视频tv| 久久久久久亚洲精品中文字幕| 日韩av网站大全| 欧美激情精品久久久久久免费印度| 97视频免费在线观看| 欧美视频裸体精品| 国产日韩精品综合网站| 欧美黑人视频一区| 久久久噜噜噜久久| 青青a在线精品免费观看| 日韩福利视频在线观看| 日韩国产欧美精品在线| 亚洲aa在线观看| 久久在线观看视频| 美女扒开尿口让男人操亚洲视频网站| 欧美成人精品激情在线观看| 欧美精品一区在线播放| 精品中文视频在线| 亚洲精品永久免费| 色综合久久中文字幕综合网小说| 亚洲色图美腿丝袜| 一区二区成人精品| 日韩在线观看免费全| 国内精品小视频| 日本精品久久电影| 日韩经典一区二区三区| 亚洲一区二区福利| 欧美成年人视频网站| 日韩欧美精品中文字幕| 国语自产偷拍精品视频偷| 日韩欧美亚洲国产一区| 日韩欧美国产视频| 68精品久久久久久欧美| 国产精品久久不能| 成人国产精品av| 亚洲视频在线视频| 国产成人精品电影久久久| 丝袜亚洲欧美日韩综合| 欧美日韩裸体免费视频| 午夜精品蜜臀一区二区三区免费| 成人免费在线视频网站| 久久精彩免费视频| 国产精品中文字幕在线| 自拍亚洲一区欧美另类| 欧美精品在线播放| 九九久久久久久久久激情| 一区二区欧美日韩视频| 亚洲精品中文字幕av| 欧美日韩不卡合集视频| 亚洲肉体裸体xxxx137| 国产精品网址在线| 国产欧美在线观看| 欧美激情视频网址| 亚洲网站在线看| 国产精品自拍小视频| 欧美国产亚洲视频| 日韩毛片在线观看| 亚洲国产免费av| 欧美大片va欧美在线播放| 91成人国产在线观看| 欧美午夜xxx| 国产亚洲精品美女久久久久| 色老头一区二区三区在线观看| 国产精品 欧美在线| 日韩资源在线观看| 欧美肥婆姓交大片| 成人免费视频在线观看超级碰| 日韩av日韩在线观看| 亚洲美腿欧美激情另类| 欧美激情手机在线视频| 欧美激情第1页| 韩曰欧美视频免费观看| 国产成人av在线| 欧美噜噜久久久xxx| 国产精品久久久久久久午夜| 97在线视频一区| 久精品免费视频| 久久久亚洲天堂| 国产精品久久久久久网站| 国产日产欧美精品| 久久人体大胆视频| 播播国产欧美激情| 欧美成年人视频网站| 亚洲精品综合久久中文字幕| 日韩av在线网站| 久久伊人91精品综合网站| 最近2019中文字幕一页二页| 国产精品91久久久| 国产午夜精品视频免费不卡69堂| 久久视频在线直播| 97精品视频在线播放| 精品动漫一区二区| 亚洲男人第一av网站| 在线视频亚洲欧美| 中文字幕亚洲二区| 性欧美长视频免费观看不卡| 亚洲精品白浆高清久久久久久| 九九久久久久99精品| 久国内精品在线| 九九热精品视频国产| 亚洲欧美色婷婷| 国产一区二区色| 国产一区二区三区在线看| 91av在线精品| 黑人与娇小精品av专区| 中文字幕欧美视频在线| 欧美视频在线观看免费| 欧美天堂在线观看| 精品视频在线播放免| 亚洲欧美999| 欧美激情视频一区二区三区不卡| 亚洲无av在线中文字幕| 精品成人乱色一区二区| 毛片精品免费在线观看| 日韩经典第一页| 久久精品中文字幕电影| 国产精品色视频| 96国产粉嫩美女| 精品久久久999| 亚洲毛片在线免费观看| 91成人天堂久久成人| 欧美专区在线播放| 中日韩美女免费视频网址在线观看| 亚洲肉体裸体xxxx137| 91久久久精品| 57pao国产精品一区| 亚洲最大成人免费视频| 亚洲美女在线观看| 日韩成人高清在线| 亚洲第一页中文字幕| 欧美成人亚洲成人日韩成人| 日韩影视在线观看| 97免费视频在线| 九九热精品在线| 精品一区二区电影| 欧美高清视频在线观看| 欧美第一黄色网| 国产精品久久久久久av| 91亚洲午夜在线| 久久久久久久久久久免费| 久久久久久午夜| 欧美性xxxx18| 欧美一区二区大胆人体摄影专业网站| 国产亚洲xxx| 欧美国产日韩一区二区| 精品欧美一区二区三区| 欧美大片在线看免费观看| 国产精选久久久久久| 精品露脸国产偷人在视频| 欧美电影院免费观看| 国产一区二区三区在线播放免费观看| 亚洲xxxx做受欧美| 91精品国产综合久久久久久蜜臀| 久久免费少妇高潮久久精品99| 久久久国产精品免费| 91麻豆桃色免费看| 热99精品里视频精品| 在线观看欧美日韩国产| 精品亚洲国产成av人片传媒| 中文字幕一区二区精品|