婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > HTML5應用之文件上傳

HTML5應用之文件上傳

熱門標簽:中紳電銷智能機器人 跟電銷機器人做同事 濟南辦理400電話 農村住宅地圖標注 鄭州電銷外呼系統違法嗎 漳州人工外呼系統排名 威海營銷外呼系統招商 鶴壁手機自動外呼系統怎么安裝 ai電銷機器人連接網關

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

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

用HTML5上傳文件

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

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

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

3、跨域請求的支持

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

5、允許設置請求的超時

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

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

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對象,但在這里我們并沒有用它。現在,通過上面的三個內容,我們已經能夠控制用戶上傳的文件大小和文件類型,以便減輕服務器再次檢測時的壓力,并提升安全系數。

 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]);

回到正題。回顧上一段代碼,我們增加了許多有關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的美化等等。不過這就不是我們這篇文章的主題了。

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

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

標簽:甘南 萍鄉 咸陽 惠州 紅河 文山 營口 蘇州

巨人網絡通訊聲明:本文標題《HTML5應用之文件上傳》,本文關鍵詞  HTML5,應,用之,文件,上傳,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《HTML5應用之文件上傳》相關的同類信息!
  • 本頁收集關于HTML5應用之文件上傳的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    青娱乐精品视频在线| a4yy欧美一区二区三区| 色综合久久综合网| 欧美激情一区二区三区在线| 国产一区二区三区久久悠悠色av| 91国偷自产一区二区三区观看| 中文一区二区在线观看| 粉嫩久久99精品久久久久久夜| 欧美tickling网站挠脚心| 美国十次综合导航| 欧美tickling网站挠脚心| 日本va欧美va精品发布| 日韩丝袜情趣美女图片| 国内精品久久久久影院色 | 亚洲曰韩产成在线| 色老汉一区二区三区| 午夜视频在线观看一区二区三区| 7777精品伊人久久久大香线蕉的 | 国产69精品久久777的优势| 综合自拍亚洲综合图不卡区| 暴力调教一区二区三区| 亚洲第一成人在线| 久久一二三国产| 91国产视频在线观看| 韩国av一区二区| 亚洲精品五月天| 国产欧美一区二区精品性色| 欧美中文字幕不卡| 国产.欧美.日韩| 奇米精品一区二区三区在线观看| 精品免费视频.| 色又黄又爽网站www久久| 日本中文字幕一区| 日韩毛片高清在线播放| 国产肉丝袜一区二区| 欧美一区二区美女| 成人aaaa免费全部观看| 国产一区二区91| 日日摸夜夜添夜夜添亚洲女人| 国产欧美精品一区二区三区四区| 日韩一区二区三区电影在线观看 | 国产精品99久| 国产精品影视网| 蜜桃av噜噜一区二区三区小说| 亚洲一区二区中文在线| 亚洲欧美日韩国产另类专区| 国产欧美日韩在线视频| 日韩视频中午一区| 日韩欧美一二三四区| 日韩欧美国产一区二区在线播放 | 欧美在线短视频| 欧美日韩国产首页在线观看| 欧美精品欧美精品系列| 欧美午夜精品久久久久久超碰 | 亚洲激情五月婷婷| 亚洲一区二区在线免费观看视频 | 成人福利电影精品一区二区在线观看| 国产91精品一区二区| 97久久精品人人做人人爽| 成人va在线观看| 欧美性生交片4| 日韩女优制服丝袜电影| 精品国产亚洲在线| 国产精品福利一区| 日本亚洲三级在线| 福利一区二区在线| 在线精品视频一区二区三四| 欧美日韩精品一区二区在线播放| 欧美人与性动xxxx| 久久精品视频一区| 亚洲风情在线资源站| 国产麻豆精品久久一二三| 一本色道亚洲精品aⅴ| 欧美一卡在线观看| 亚洲婷婷在线视频| 国内外精品视频| 欧美日韩一区三区| 亚洲欧洲成人av每日更新| 肉肉av福利一精品导航| 91丨九色丨蝌蚪丨老版| 2021国产精品久久精品| 亚洲第一电影网| 99国产精品久| 欧美tickle裸体挠脚心vk| 国产精品99久久久| 欧美成人a在线| 奇米精品一区二区三区在线观看 | 国产美女精品一区二区三区| 欧美日韩激情一区二区三区| 亚洲色图欧洲色图| 91在线一区二区三区| 国产精品色呦呦| kk眼镜猥琐国模调教系列一区二区 | 欧美三区免费完整视频在线观看| 亚洲女女做受ⅹxx高潮| 91麻豆福利精品推荐| 国产精品麻豆一区二区| 成人妖精视频yjsp地址| 国产精品无人区| 99精品视频在线免费观看| 成人免费小视频| 色综合久久综合网欧美综合网| 亚洲摸摸操操av| 欧美三级视频在线播放| 亚洲电影你懂得| 欧美精品第1页| 另类综合日韩欧美亚洲| 久久久久97国产精华液好用吗| 国产不卡一区视频| 亚洲黄色小说网站| 在线不卡欧美精品一区二区三区| 亚洲国产成人91porn| 日韩一区国产二区欧美三区| 久久疯狂做爰流白浆xx| 中文字幕在线不卡一区| 欧美视频一区二区三区在线观看 | 91在线观看一区二区| 一区二区三区在线免费观看| 欧美一区二区黄色| 成人国产在线观看| 毛片一区二区三区| 亚洲综合在线视频| 日韩视频不卡中文| www.av精品| 丁香六月久久综合狠狠色| 五月天精品一区二区三区| 中文字幕不卡在线观看| 欧美一区二区久久| 欧美区在线观看| 色视频成人在线观看免| 国产精品88888| 日本vs亚洲vs韩国一区三区| 亚洲视频香蕉人妖| 国产精品免费网站在线观看| 精品国产乱码久久久久久久| 欧美一区二区三区公司| 欧美最猛黑人xxxxx猛交| 99视频精品在线| eeuss国产一区二区三区| 麻豆一区二区在线| 九色porny丨国产精品| 免费人成在线不卡| 亚洲综合在线视频| 亚洲一二三四区| 亚洲电影你懂得| 亚洲一区二区av在线| 亚洲一区二区在线免费观看视频 | 国产网站一区二区| 国产精品你懂的在线欣赏| 中文字幕乱码久久午夜不卡| 国产精品午夜在线| 成人免费视频在线观看| 五月激情综合色| 偷拍日韩校园综合在线| 免费观看在线色综合| 国产一区二区影院| gogo大胆日本视频一区| 欧美日韩和欧美的一区二区| 欧美日韩成人综合| 88在线观看91蜜桃国自产| 精品国产露脸精彩对白| 17c精品麻豆一区二区免费| 亚洲精品高清在线| 麻豆国产精品视频| 国产.欧美.日韩| 欧美精品在线观看播放| 国产精品无遮挡| 奇米在线7777在线精品| 91蝌蚪国产九色| 日韩一区二区三免费高清| 国产精品久久久久一区二区三区共| 亚洲精品免费一二三区| 老司机午夜精品| 欧美日韩高清在线| 中文天堂在线一区| 亚洲成a人片在线观看中文| 成人一道本在线| 国产欧美一区二区在线| 蜜桃视频一区二区三区| 91色|porny| 26uuu亚洲婷婷狠狠天堂| 亚洲国产毛片aaaaa无费看| av中文一区二区三区| 国产丝袜在线精品| 国产精品69毛片高清亚洲| 制服.丝袜.亚洲.另类.中文| 亚洲婷婷在线视频| av在线播放不卡| 国产精品国产成人国产三级 | 色婷婷综合久久久中文一区二区| 久久久久久久久久久久久久久99 | 99久久精品国产毛片| 国产精品久久久久久久裸模| 国产麻豆欧美日韩一区| 欧美大片免费久久精品三p| 精品在线观看视频| 久久久国产精品麻豆| 成人性生交大合| 国产精品国产三级国产aⅴ原创| 99精品欧美一区二区三区小说 |