2016-01-14 51 views
16

我只有在谷歌Chrome和鉻一個非常奇怪的問題後的淨::在Chrome ERR_FILE_NOT_FOUND。上傳斑點爲多部分上傳導致500MB

的背景是:

我上傳使用多部分上傳方法文件到我的服務器,這意味着我打破文件到10MB的塊,每個塊發送到服務器。這可以在任何大小的文件的所有瀏覽器中完美地工作,當我需要加密每個塊時,問題就開始了。

對於加密,我使用CryptoJS,並且在上傳該塊之前,我對它進行加密並得到上述的結果Blob,這對於我必須上傳少於50個塊(50個塊,總共大約500mb) ,之後我得到POST http://(...) net::ERR_FILE_NOT_FOUND

古怪,這適用於所有其他瀏覽器中,包括Opera這基本上是時下鉻,除了鉻和鉻。我在IE,Firefox,Edge,Safari,Opera,Chrome和Chromium上測試過它。

下面你可以看到我的代碼如何工作的,你們可以有一個想法,這不是真正的代碼,我在應用程序中使用,而是它是一個測試代碼我寫的產生同樣的結果。

非但沒有我要上傳的塊文件的切片(File.slice)和加密它來獲得blob的,我要生成一個虛假的blob我塊的大小。我把setTimeout模擬加密blob所需的時間。就像我之前說的,我得到了相同的結果,我真正的代碼做這個:

function uploadNext(prevResponse) { 
    if (currentPart == totalPartsFile) 
     return; 

    //var chunk = getNextChunk(); 
    var totalSize = file.size; 

    setTimeout(function() { 
     var blob = new Blob([new ArrayBuffer(constants.chunkSize)], { 
      type: 'application/octet-string', 
      name: file.name 
     }); 

     console.log(blob); 

     blob.encrypted = true; 
     blob.key = encryptionKey; 
     blob.mimeType = file.mimeType; 
     blob.name = file.name; 
     blob.originalFileSize = originalFileSize || file.size; 

     uploadFile(objectId, currentPart, blob, totalSize, prevResponse, function(resp) { 
      uploadNext(resp); 
     }); 
    }, 1000); 
} 

所以,上面的代碼,是產生我的一滴,下面有上傳部分:

function uploadFile (objectId, index, blob, totalSize, prevResponse, callback) { 

    var format = "encrypted"; 
    var params = "?format=" + format + (format === "encrypted" ? "&encoding=base64" : ""); 
    var endPoint = constants.contentServiceUrl + resourceService.availableResources.addContents.link.split(':objectId').join(objectId) + params; 

    var formData = new FormData(); 

    formData.append("totalFileSizeBytes", totalSize); 
    formData.append("partIndex", index); 
    formData.append("partByteOffset", previousOffset); 
    formData.append("chunkSize", blob.size); 
    formData.append("totalParts", totalPartsFile); 
    formData.append("filename", blob.name); 

    if (currentPart != 0) { 
     formData.append("uploadId", prevResponse.uploadId); 
     formData.append("bucket", prevResponse.bucket); 
    } 

    if (finalChunk) { 
     for (var key in etags1) { 
      formData.append("etags[" + key + "]", etags1[key]); 
     } 
    } 

    formData.append("data", blob); 

    previousOffset += blob.size; 

    var request = { 
     method: 'POST', 
     url: endPoint, 
     data: formData, 
     headers: { 
      'Content-Type': 'multipart/form-data' 
     } 
    } 

    $http(request) 
     .success(function(d) { 
      _.extend(etags1, d.etags); 
      console.log(d); 
      callback(d); 
     }) 
     .error(function(d) { 
     console.log(d); 
    });             
} 

當然還有其他支持變量和代碼,我沒有放在這裏,但這足以讓我們知道我們正在處理的內容。

在這個例子中,我使用的是AngularJS'$http模塊,但我嘗試過使用純XMLHttpRequest以及我得到了相同的結果。

就像我說的,我只是單個文件大於499mb大(50+塊),只有在Chrome得到POST http://(...) net::ERR_FILE_NOT_FOUND

我張貼這種這裏我一直在尋找一個解決方案,但我無法找到與此相關的任何問題,我在互聯網上找到的最接近的事情是這個問題在Chromium項目論壇:

https://code.google.com/p/chromium/issues/detail?id=375297

在這一點上,我真的不知道該怎麼辦了,所以我想知道是否有人已經在過去類似的問題,並能以某種方式解決它。

感謝您提前給出答案。

+0

我也打只使用XMLHttpRequest來,甚至不加密塊同樣的問題。你有幸找到發生了什麼? – harun

+0

不幸的是我必須在我的應用程序中設置一個400MB的限制。它似乎是一個錯誤或對Chrome的限制,使500MB後的斑點是純垃圾。儘管如此,我仍然期待着解決方案。 –

+0

我和@ Eric.M在同一場景中。我真的需要一個解決方案,我發現的是,這是一個Chrome錯誤。 – gpalomar

回答

-1

似乎是Firebug插件問題。嘗試禁用它。這個對我有用。

Firefox瀏覽器。當我通過塊加載文件時遇到問題。我禁用了插件,並且沒有出現內存泄漏。也許它會幫助你

對於Chrome一切正常。

+1

問題出在Chrome上。 –

1

chrome只能爲任何blob分配500mb,所以如果你嘗試分配500mb + 1字節,它會明顯的忽略那個字節,爲了解決這個問題,你將不得不以499mb的塊讀取文件,然後你將擁有在服務器上合併文件。

或者你可以嘗試類似ZipJS的東西,然後上傳zip文件,它爲我工作。

var zip = new JSZip(); 
    zip.file("file1", "content1"); 
    zip.file("file2", "content2");