2013-04-03 67 views
0

好了,我發現這個方法用於從diferent問題上傳大文件:爲什麼我的文件數據在傳輸中丟失?

function sliceit(file) 
{ 
    fr = new FileReader; 
    chunkSize = 1000000;    

    chunks = Math.ceil(file.size/chunkSize); 
    chunk = 0; 
    var isstart = true; 

    function loadNext() { 
     start, end, 
     start = chunk * chunkSize; 
     if (start > file.size) 
      start = end+1; 
     end = start + (chunkSize -1) >= file.size ? file.size : start + (chunkSize -1); 
     fr.onloadend = function(e) 
     { 
      while(!fr.result || fr.result == "" || fr.result == undefined) 
      { 
      } 
      fdata = fr.result; 
      xmlhttp, form, data; 
      data = {}; 
      data.filename = document.getElementById("filename0").value; 
      data.username = document.getElementById("username").value; 
      data.password = document.getElementById("password").value; 
      data.public = document.getElementById("public").value; 
      if(isstart) 
      { 
       var form = new FormData(); 
       form.append("filename", data.filename); 
       form.append("username", data.username); 
       form.append("password", data.password); 
       form.append("public", data.public); 
       form.append("filebytes", fdata); 
       xmlhttp = jQuery.ajaxSettings.xhr(); 
       xmlhttp.open("POST", "../MakeEmptyFile.php", false); 
       isstart = false; 
      } 
      else 
      { 
       form = new FormData(); 
       form.append("filename", data.filename); 
       form.append("username", data.username); 
       form.append("password", data.password); 
       form.append("filebytes", fdata); 
       xmlhttp = jQuery.ajaxSettings.xhr(); 
       xmlhttp.open("POST", "../AddTo.php", false); 
      } 
      xmlhttp.send(form); 
      console.log(xmlhttp.responseText); 
      if (++chunk <= chunks) 
      { 
       loadNext(); 
      } 
      else 
      { 
       stdlog("Completed."); 
      } 
     }; 
     fr.readAsText(file.slice(start, end)); 

    } 
    loadNext(); 
} 

出於某種原因,每次我打開了XMLHttpRequest時,它顯示出文件數據從來沒有實際發送。這是因爲它太大了,還是什麼?謝謝!

+0

你爲什麼使用FileReader? –

+0

@RayNicholus因爲我上傳的文件太大而無法正常發送,所以我使用FileReader對象一次讀取大約10兆字節,這應該足夠慢。 –

+1

這不是FileReader的用途。無需使用FileReader將文件分割成塊。只需在File對象上使用slice方法並將生成的Blob發送到服務器即可。 –

回答

0

這聽起來像你缺少一些與File API相關的基本概念。我的回答來自您問題的評論。

首先,大塊上傳文件的正確方法是在BlobFile對象上使用the slice methodslice方法將始終返回BlobBlob代表BlobFile的部分。那麼你可以appendBlob到你的FormData對象。您的FormData對象將以多部分編碼的POST請求發送。 Blob將作爲表單字段在請求的多部分邊界之一內部表示,就像您附加到您的FormData對象的任何其他參數一樣。

服務器端,您可以讀取此Blob,就像在解析MPE請求時讀取任何其他文件一樣。這Blob將需要臨時存儲在服務器端,以及構成完整文件的任何其他Blob。一旦你收到了所有的部件,你將需要按照服務器端正確的順序組裝它們。

您當前的方法涉及將文件切片爲blob,讀取blob的全部內容,然後將內容附加到您的FormData對象。這對我來說似乎是多餘和低效的。

相關問題