主頁(yè) > 知識(shí)庫(kù) > HTML5應(yīng)用之文件上傳

HTML5應(yīng)用之文件上傳

熱門標(biāo)簽:中紳電銷智能機(jī)器人 跟電銷機(jī)器人做同事 濟(jì)南辦理400電話 農(nóng)村住宅地圖標(biāo)注 鄭州電銷外呼系統(tǒng)違法嗎 漳州人工外呼系統(tǒng)排名 威海營(yíng)銷外呼系統(tǒng)招商 鶴壁手機(jī)自動(dòng)外呼系統(tǒng)怎么安裝 ai電銷機(jī)器人連接網(wǎng)關(guān)

長(zhǎng)期以來(lái),開發(fā)者們一直為此苦惱,大部分為解決這個(gè)問(wèn)題都采用了flash作為解決方案,但flash并非靈丹妙藥,因?yàn)閒lash版本,割據(jù)造成的問(wèn)題有時(shí)反倒成為了噩夢(mèng)。有些網(wǎng)站則采用了form標(biāo)簽的enctype=multipart/form-data屬性,但這一屬性要求服務(wù)器作出特殊的設(shè)置才能夠顯示進(jìn)度,而且本身也比較復(fù)雜,復(fù)雜就意味著容易出現(xiàn)錯(cuò)誤,這可不是我們想要的。

現(xiàn)在我們來(lái)看看Html5為什么能夠解決這個(gè)問(wèn)題,以及,它到底能做的多好。

用HTML5上傳文件

在HTML5標(biāo)準(zhǔn)中,XMLHttpRequest對(duì)象被重新定義,被稱為“XMLHttpRequest Level 2”,其中包含了以下5個(gè)新特性:

1、支持上傳、下載字節(jié)流,比如文件、blob以及表單數(shù)據(jù)

2、增加了上傳、下載中的進(jìn)度事件

3、跨域請(qǐng)求的支持

4、允許發(fā)送匿名請(qǐng)求(即不發(fā)送HTTP的Referer部分)

5、允許設(shè)置請(qǐng)求的超時(shí)

在這篇教程中,我們主要關(guān)注第一和第二項(xiàng)特性,尤其是第二項(xiàng)——它能夠提供我們想要的上傳進(jìn)度。和之前的方案不同,這個(gè)方案并不要求服務(wù)器作出特殊的設(shè)置,因此大家邊看教程就可以邊動(dòng)手試試了。

上面圖示的就是我們能夠?qū)崿F(xiàn)的內(nèi)容:

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

2、一個(gè)能夠顯示真實(shí)進(jìn)度的進(jìn)度條

3、上傳的速度

4、剩余時(shí)間的估算

5、已上傳的數(shù)據(jù)量

6、上傳結(jié)束后服務(wù)器返回的響應(yīng)

另外,憑借XMLHttpRequest,我們的上傳過(guò)程整個(gè)都是異步的,因此用戶在上傳文件的時(shí)候,依然可以操作網(wǎng)頁(yè)當(dāng)中的其它元素,并不需要專門等待上傳的完成。而在上傳結(jié)束后,我們能夠獲取服務(wù)器發(fā)回的響應(yīng),因此整個(gè)上傳過(guò)程都顯得相當(dāng)順理成章。

HTML5的進(jìn)度事件

HTML5當(dāng)中新增了一個(gè)進(jìn)度事件(Progress Events),這個(gè)事件為我們提供了以下信息:

1、total – 文件大小

2、loaded – 已上傳的大小

3、lengthComputable – 進(jìn)度是否可計(jì)算

信息并不多,但是在計(jì)算文件進(jìn)度上已經(jīng)足夠了。當(dāng)然,也還有很多東西它沒(méi)有直接給出,這非常遺憾。

HTML

與普通的文件上傳代碼并沒(méi)有太大差異。不過(guò)注意,input標(biāo)簽關(guān)聯(lián)了一個(gè)JavaScript函數(shù)在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

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

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

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

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

這正是我們所需要的。當(dāng)然,HTML5中還有一個(gè)FileReader對(duì)象,但在這里我們并沒(méi)有用它?,F(xiàn)在,通過(guò)上面的三個(gè)內(nèi)容,我們已經(jīng)能夠控制用戶上傳的文件大小和文件類型,以便減輕服務(wù)器再次檢測(cè)時(shí)的壓力,并提升安全系數(shù)。

 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;
  }
}

那么當(dāng)用戶選擇好文件,點(diǎn)擊上傳之后,又將發(fā)生什么呢?

 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代碼又使用了另一個(gè)HTML5推出的新對(duì)象——FormData。FormData對(duì)象是用戶的表單數(shù)據(jù)的集合,它以鍵值對(duì)的形式存儲(chǔ)了表單數(shù)據(jù),其值能夠包括數(shù)字、字符串以及文件。我們通過(guò)輾轉(zhuǎn)這個(gè)對(duì)象,來(lái)向服務(wù)器提交數(shù)據(jù)。

當(dāng)然,這個(gè)對(duì)象我們也可以在代碼中手工構(gòu)建,比如說(shuō)像下面這樣:

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,我們?cè)黾恿嗽S多有關(guān)XMLHttpRequest的事件監(jiān)聽,其目的是為了獲取文件上傳的真實(shí)情況。尤其需要注意的是,我們所掛鉤的,并不是XMLHttpRequest本身,而是其屬性,比如uploadProgress。

完整代碼

最后,來(lái)看看完整的代碼。

 <!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>

我們的任務(wù)完成了嗎?可以說(shuō)完成了,因?yàn)檫@段代碼已經(jīng)能夠完成上傳文件的任務(wù),而且也能夠顯示上傳的進(jìn)度;但是理應(yīng)說(shuō)我們沒(méi)有,因?yàn)槌诉@個(gè)骨架HTML之外,我們還有很多沒(méi)有做的事情,比如CSS的美化等等。不過(guò)這就不是我們這篇文章的主題了。

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

標(biāo)簽:甘南 萍鄉(xiāng) 咸陽(yáng) 惠州 紅河 文山 營(yíng)口 蘇州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《HTML5應(yīng)用之文件上傳》,本文關(guān)鍵詞  HTML5,應(yīng),用之,文件,上傳,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《HTML5應(yīng)用之文件上傳》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于HTML5應(yīng)用之文件上傳的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章