整合營銷服務(wù)商

          電腦端+手機端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          HTML DOM INPUT FILE 大文件上傳方法

          TML DOM INPUT FILE 大文件上傳方法,HTML DOM INPUT FILE 大文件上傳技術(shù),HTML DOM INPUT FILE 大文件上傳技巧,HTML5大文件上傳方案,HTML DOM INPUT FILE 大文件上傳組件,HTML5大文件上傳API,HTML DOM INPUT FILE 大文件上傳函數(shù),INPUT FILE 大文件上傳教程,DOM INPUT FILE 大文件上傳源碼,HTML大文件上傳代碼,HTML大文件上傳分片,HTML大文件上傳分段,HTML大文件上傳分割,HTML大文件上傳切割,HTML大文件上傳解決方案,

          現(xiàn)在chrome提供了相關(guān)的API,在HTML5中也能夠上傳文件,不過有限制,每個域名限制了5個TCP連接。用起來不是那么的舒服,也不夠靈活,當(dāng)然也能夠滿足一般的使用場景。不太復(fù)雜的也能夠湊合著用。

          但是如果有上傳文件夾,文件夾中包含很多文件,比如1萬或者10萬,這種場景下用起來就不是那么的舒服了,如果單個文件的大小超過10G,比如20G,這種場景下用起來也不是特別的舒服。

          還有批量下載的話HTML5的能力也有限,下是能下,但是每下一個文件就需要用戶手動確認(rèn)一下,那比如我要下載100個文件,也需要確認(rèn)100次,用戶不太接受這種方式。

          1.下載示例

          https://gitee.com/xproer/up6-vue-cli



          將up6組件復(fù)制到項目中

          示例中已經(jīng)包含此目錄



          1.引入up6組件



          2.配置接口地址

          接口地址分別對應(yīng):文件初始化,文件數(shù)據(jù)上傳,文件進度,文件上傳完畢,文件刪除,文件夾初始化,文件夾刪除,文件列表

          參考:http://www.ncmem.com/doc/view.aspx?id=e1f49f3e1d4742e19135e00bd41fa3de



          3.處理事件



          啟動測試



          啟動成功



          效果



          數(shù)據(jù)庫

          tml5文件分割上傳解決方案

          html5提供的文件API中可以輕松的對文件進行分割切片, 然后通過javascript異步處理向服務(wù)器傳輸數(shù)據(jù), 突破對大文件上傳的限制, 同時異步處理在一定程度上也提高了文件上傳的效率。用戶體驗上也優(yōu)于前述方案。

          index.html

          <!DOCTYPE html>
          <html>
          <head lang="en">
          <meta charset="UTF-8">
          <title>大文件上傳實例</title>
          <script type="text/javascript">
              const BYTES_PER_CHUNK = 1024 * 1024; // 每個文件切片大小定為1MB .
              var slices;
              var totalSlices;
              //發(fā)送請求
              function sendRequest() {
                  var blob = document.getElementById('file').files[0];
                  var start = 0;
                  var end;
                  var index = 0;
                  // 計算文件切片總數(shù)
                  slices = Math.ceil(blob.size / BYTES_PER_CHUNK);
                  totalSlices= slices;
                  while(start < blob.size) {
                  end = start + BYTES_PER_CHUNK;
                  if(end > blob.size) {
                      end = blob.size;
                  }
                  uploadFile(blob, index, start, end);
                  start = end;
                  index++;
                  }
              }
              //上傳文件
              function uploadFile(blob, index, start, end) {
                  var xhr;
                  var fd;
                  var chunk;
                  xhr = new XMLHttpRequest();
                  xhr.onreadystatechange = function() {
                  if(xhr.readyState == 4) {
                  if(xhr.responseText) {
                      alert(xhr.responseText);
                  }
                  slices--;
                  // 如果所有文件切片都成功發(fā)送,發(fā)送文件合并請求。
                  if(slices == 0) {
                      mergeFile(blob);
                      alert('文件上傳完畢');
                  }
                  }
                  };
                  chunk =blob.slice(start,end);//切割文件
                  //構(gòu)造form數(shù)據(jù)
                  fd = new FormData();
                  fd.append("file", chunk);
                  fd.append("name", blob.name);
                  fd.append("index", index);
                  xhr.open("POST", "upload.php", true);
                  //設(shè)置二進制文邊界件頭
                  xhr.setRequestHeader("X_Requested_With", location.href.split("/")[3].replace(/[^a-z]+/g, '$'));
                  xhr.send(fd);
              }
              function mergeFile(blob) {
                  var xhr;
                  var fd;
                  xhr = new XMLHttpRequest();
                  fd = new FormData();
                  fd.append("name", blob.name);
                  fd.append("index", totalSlices);
                  xhr.open("POST", "merge.php", true);
                  xhr.setRequestHeader("X_Requested_With", location.href.split("/")[3].replace(/[^a-z]+/g, '$'));
                  xhr.send(fd);
              }
          </script>
          </head>
          <body>
          <input type="file" id="file"/>
          <button onclick="sendRequest()">上傳</button>
          </body>
          </html>

          upload.php

          <?php
          //省略了文件接收判斷isset部分
          //當(dāng)前目錄下建立一個uploads文件夾
          //接收文件名時進行轉(zhuǎn)碼,防止中文亂碼。
          $target = "uploads/" .iconv("utf-8","gbk",$_POST["name"]) . '-' . $_POST['index'];
          move_uploaded_file($_FILES['file']['tmp_name'], $target);
          // Might execute too quickly.
          sleep(1);
          ?>

          merge.php

          <?php
          //文件合并
          $target = "uploads/" .iconv("utf-8","gbk",$_POST["name"]);
          $dst = fopen($target, 'wb');
          for($i = 0; $i < $_POST['index']; $i++) {
          $slice = $target . '-' . $i;
          $src = fopen($slice, 'rb');
          stream_copy_to_stream($src, $dst);
          fclose($src);
          unlink($slice);
          }
          fclose($dst);

          關(guān)鍵函數(shù)stream_copy_to_stream()

          int stream_copy_to_stream ( resource $source , resource $dest [, int $maxlength = -1 [, int $offset = 0 ]] )

          <?php
          $src = fopen('http://www.example.com', 'r');
          $dest1 = fopen('first1k.txt', 'w');
          $dest2 = fopen('remainder.txt', 'w');
          echo stream_copy_to_stream($src, $dest1, 1024) . " bytes copied to first1k.txt\n";
          echo stream_copy_to_stream($src, $dest2) . " bytes copied to remainder.txt\n";
          ?>
          var blob = document.getElementById('file').files[0];
          console.dir(blob);

          相關(guān)的屬性如下:

          lastModified: 1511081596000

          lastModifiedDate: Sun Nov 19 2017 16:53:16 GMT+0800 (中國標(biāo)準(zhǔn)時間) {}

          name: "IMG_20171119_165316.jpg"

          size: 4383101

          type: "image/jpeg"

          slice: ? slice() 用于切割文件

          本文已經(jīng)過原作者 Tapas Adhikary 授權(quán)翻譯

          簡介

          上傳文件功能可以說是項目經(jīng)常出現(xiàn)的需求。從在社交媒體上上傳照片到在求職網(wǎng)站上發(fā)布簡歷,文件上傳無處不在。在本文中,我們將討論 HTML文件上傳支持的10種用法,希望對你有用。

          1. 單文件上傳

          我們可以將input 類型指定為file,以在Web應(yīng)用程序中使用文件上傳功能。

          <input type="file" id="file-uploader">
          

          input filte 提供按鈕上傳一個或多個文件。默認(rèn)情況下,它使用操作系統(tǒng)的本機文件瀏覽器上傳單個文件。成功上傳后,F(xiàn)ile API 使得可以使用簡單的 JS 代碼讀取File對象。要讀取File對象,我們需要監(jiān)聽 change事件。

          首先,通過id獲取文件上傳的實例:

          const fileUploader = document.getElementById('file-uploader');
          

          然后添加一個change 事件偵聽器,以在上傳完成后讀取文件對象, 我們從event.target.files屬性獲取上傳的文件信息:

          fileUploader.addEventListener('change', (event) => {
            const files = event.target.files;
            console.log('files', files);
          });
          

          在控制臺中觀察輸出結(jié)果,這里關(guān)注一下FileList數(shù)組和File對象,該對象具有有關(guān)上傳文件的所有元數(shù)據(jù)信息。

          如果大家看到這里,有點激動,想手賤一下,可以 CodePen 玩玩,地址:https://codepen.io/atapas/pen/rNLOyRm

          2. 多文件上傳

          如果我們想上傳多個文件,需要在標(biāo)簽上添加 multiple 屬性:

          <input type="file" id="file-uploader" multiple />
          

          現(xiàn)在,我們可以上傳多個文件了,以前面事例為基礎(chǔ),選擇多個文件上傳后,觀察一下控制臺的變化:

          如果大家看到這里,有點激動,想手賤一下,可以 CodePen 玩玩,地址:https://codepen.io/atapas/pen/MWeamYp

          3.了解文件元數(shù)據(jù)

          每當(dāng)我們上傳文件時,File對象都有元數(shù)據(jù)信息,例如file name,size,last update time,type 等等。這些信息對于進一步的驗證和特殊處理很有用。

          const fileUploader = document.getElementById('file-uploader');
          
          // 聽更 change 件并讀取元數(shù)據(jù)
          fileUploader.addEventListener('change', (event) => {
            // 獲取文件列表數(shù)組
            const files = event.target.files;
          
            // 遍歷并獲取元數(shù)據(jù)
            for (const file of files) {
              const name = file.name;
              const type = file.type ? file.type: 'NA';
              const size = file.size;
              const lastModified = file.lastModified;
              console.log({ file, name, type, size, lastModified });
            }
          });
          

          下面是單個文件上傳的輸出結(jié)果:

          如果大家看到這里,有點激動,想手賤一下,可以 CodePen 玩玩,地址:https://codepen.io/atapas/pen/gOMaRJv

          4.了解 accept 屬性

          我們可以使用accept屬性來限制要上載的文件的類型,如果只想上傳的文件格式是 .jpg,.png 時,可以這么做:

          <input type="file" id="file-uploader" accept=".jpg, .png" multiple>
          

          在上面的代碼中,只能選擇后綴是.jpg和.png的文件。

          如果大家看到這里,有點激動,想手賤一下,可以 CodePen 玩玩,地址:https://codepen.io/atapas/pen/OJXymRP

          5. 管理文件內(nèi)容

          成功上傳文件后顯示文件內(nèi)容,站在用戶的角度上,如果上傳之后,沒有一個預(yù)覽的,就很奇怪也不體貼。

          我們可以使用FileReader對象將文件轉(zhuǎn)換為二進制字符串。然后添加load 事件偵聽器,以在成功上傳文件時獲取二進制字符串。

          // FileReader 實例
          const reader = new FileReader();
          
          fileUploader.addEventListener('change', (event) => {
            const files = event.target.files;
            const file = files[0];
          
            reader.readAsDataURL(file);
          
            reader.addEventListener('load', (event) => {
              const img = document.createElement('img');
              imageGrid.appendChild(img);
              img.src = event.target.result;
              img.alt = file.name;
            });
          });
          

          如果大家看到這里,有點激動,想手賤一下,可以 CodePen 玩玩,地址:https://codepen.io/atapas/pen/zYBvdjZ

          6.驗證文件大小

          如果用戶上傳圖片過大,為了不讓服務(wù)器有壓力,我們需要限制圖片的大小,下面是允許用戶上傳小于 1M 的圖片,如果大于 1M 將上傳失敗。

          fileUploader.addEventListener('change', (event) => {
            // Read the file size
            const file = event.target.files[0];
            const size = file.size;
          
            let msg = '';
          
           // 檢查文件大小是否大于1MB
            if (size > 1024 * 1024) {
                msg = `<span style="color:red;">The allowed file size is 1MB. The file you are trying to upload is of ${returnFileSize(size)}</span>`;
            } else {
                msg = `<span style="color:green;"> A ${returnFileSize(size)} file has been uploaded successfully. </span>`;
            }
            feedback.innerHTML = msg;
          });
          

          如果大家看到這里,有點激動,想手賤一下,可以 CodePen 玩玩,地址:https://codepen.io/atapas/pen/pobjMKv

          7. 顯示文件上傳進度

          更好的用戶體驗是讓用戶知道文件上傳進度,前面我們用過了FileReader以及讀取和加載文件的事件。

          const reader = new FileReader();
          

          FileReader還有一個progress 事件,表示當(dāng)前上傳進度,配合HTML5的progress標(biāo)簽,我們來模擬一下文件的上傳進度。

          reader.addEventListener('progress', (event) => {
            if (event.loaded && event.total) {
              // 計算完成百分比
              const percent = (event.loaded / event.total) * 100;
              // 將值綁定到 `progress`標(biāo)簽
              progress.value = percent;
            }
          });
          

          如果大家看到這里,有點激動,想手賤一下,可以 CodePen 玩玩,地址:https://codepen.io/atapas/pen/eYzpwYj

          8. 怎么上傳目錄上傳?

          我們可以上傳整個目錄嗎?嗯,這是可能的,但有一些限制。有一個叫做webkitdirectory的非標(biāo)準(zhǔn)屬性(目前只有谷歌瀏覽器還有Microsoft Edge支持按照文件夾進行上傳),它允許我們上傳整個目錄。

          目前只有谷歌瀏覽器還有Microsoft Edge支持按照文件夾進行上傳,具體可以看下百度云盤的網(wǎng)頁版的上傳按鈕,在火狐下就支持按照文件進行上傳,而在谷歌和Edge下,就會給用戶提供一個下拉,讓用戶選擇是根據(jù)文件進行上傳還是根據(jù)文件夾進行上傳。

          <input type="file" id="file-uploader" webkitdirectory />
          

          用戶必須需要確認(rèn)才能上傳目錄

          用戶單擊“上傳”按鈕后,就會進行上傳。這里要注意的重要一點。FileList數(shù)組將以平面結(jié)構(gòu)的形式包含有關(guān)上載目錄中所有文件的信息。對于每個File對象,webkitRelativePath屬性表示目錄路徑。

          例如,上傳一個主目錄及其下的其他文件夾和文件:

          現(xiàn)在,F(xiàn)ile 對象將將webkitRelativePath填充為:

          如果大家看到這里,有點激動,想手賤一下,可以 CodePen 玩玩,地址:https://codepen.io/atapas/pen/dyXYRKp

          9. 拖拽上傳

          不支持文件上傳的拖拽就有點 low 了,不是嗎?我們來看看如何通過幾個簡單的步驟實現(xiàn)這一點。

          首先,創(chuàng)建一個拖放區(qū)域和一個可選的區(qū)域來顯示上傳的文件內(nèi)容。

          <div id="container">
            <h1>Drag & Drop an Image</h1>
            <div id="drop-zone">
              DROP HERE
            </div>
          
            <div id="content">
              Your image to appear here..
            </div>
          
          </div>
          

          通過它們各自的ID獲取dropzone和content 區(qū)域。

           const dropZone = document.getElementById('drop-zone');
           const content = document.getElementById('content');
          

          添加一個dragover 事件處理程序,以顯示將要復(fù)制的內(nèi)容的效果:

          dropZone.addEventListener('dragover', event => {
            event.stopPropagation();
            event.preventDefault();
            event.dataTransfer.dropEffect = 'copy';
          });
          

          接下來,我們需要一個drop事件監(jiān)聽器來處理。

          dropZone.addEventListener('drop', event => {
            // Get the files
            const files = event.dataTransfer.files;
          
          
          });
          

          如果大家看到這里,有點激動,想手賤一下,可以 CodePen 玩玩,地址:https://codepen.io/atapas/pen/ExyVoXN

          10. 使用objectURL處理文件

          有一個特殊的方法叫做URL.createobjecturl(),用于從文件中創(chuàng)建唯一的URL。還可以使用URL.revokeObjectURL()方法來釋放它。

          URL.revokeObjectURL() 靜態(tài)方法用來釋放一個之前已經(jīng)存在的、通過調(diào)用 URL.createObjectURL() 創(chuàng)建的 URL 對象。當(dāng)你結(jié)束使用某個 URL 對象之后,應(yīng)該通過調(diào)用這個方法來讓瀏覽器知道不用在內(nèi)存中繼續(xù)保留對這個文件的引用了。

          
          fileUploader.addEventListener('change', (event) => {
            const files = event.target.files;
            const file = files[0];
            
            const img = document.createElement('img');
            imageGrid.appendChild(img);
            img.src = URL.createObjectURL(file);
            img.alt = file.name;
          });
          
          

          如果大家看到這里,有點激動,想手賤一下,可以 CodePen 玩玩,地址:https://codepen.io/atapas/pen/BazzaoN

          總結(jié)

          無論何時,如果你還想學(xué)習(xí)本文涉及的一些知識,你可以在這里嘗試。

          https://html-file-upload.netlify.app/


          主站蜘蛛池模板: 日本在线一区二区| 久久se精品一区二区国产| 精品亚洲AV无码一区二区三区| 亚洲国产成人精品久久久国产成人一区二区三区综 | 精品国产精品久久一区免费式 | 精品动漫一区二区无遮挡| 久久久国产精品亚洲一区 | 国产精品亚洲专区一区| 成人精品一区久久久久| 精品天海翼一区二区| 国产日韩精品一区二区在线观看| 国产大秀视频一区二区三区| 国产av一区二区精品久久凹凸| 日本一区二区三区在线视频| aⅴ一区二区三区无卡无码| 插我一区二区在线观看| 久久精品一区二区免费看| 无码国产精品一区二区免费模式| 色一乱一伦一图一区二区精品| 亚洲午夜精品一区二区公牛电影院| 无码福利一区二区三区| 在线免费视频一区| 一区二区三区在线观看中文字幕| 国偷自产Av一区二区三区吞精| 精品亚洲综合在线第一区| 91精品福利一区二区三区野战| 毛片一区二区三区无码| 波多野结衣一区二区三区88| 中文字幕一区二区三区精华液| 亚洲国产国产综合一区首页| 3D动漫精品一区二区三区| 国产一区在线播放| 亚洲色欲一区二区三区在线观看| 人妻无码视频一区二区三区| 久久久久久人妻一区二区三区| 国产福利电影一区二区三区,日韩伦理电影在线福 | 日本丰满少妇一区二区三区| 日韩精品无码一区二区视频| 精品少妇ay一区二区三区| 国产一区二区影院| 无码人妻精品一区二区三区66 |