我只有在谷歌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
在這一點上,我真的不知道該怎麼辦了,所以我想知道是否有人已經在過去類似的問題,並能以某種方式解決它。
感謝您提前給出答案。
我也打只使用XMLHttpRequest來,甚至不加密塊同樣的問題。你有幸找到發生了什麼? – harun
不幸的是我必須在我的應用程序中設置一個400MB的限制。它似乎是一個錯誤或對Chrome的限制,使500MB後的斑點是純垃圾。儘管如此,我仍然期待着解決方案。 –
我和@ Eric.M在同一場景中。我真的需要一個解決方案,我發現的是,這是一個Chrome錯誤。 – gpalomar