Ich versuche, mithilfe des REST-API und HTML5-Datei Slicing eine große Datei (1,5 GB) auf Amazon S3 zu laden. Hier ist, wie der Upload-Code wie (Code zur besseren Lesbarkeit abgespeckte) aussieht:Amazon S3 CORS PUT nicht
File.prototype.slice = File.prototype.webkitSlice || File.prototype.mozSlice || File.prototype.slice;
var length = u.settings.chunk_size; // 6MB
var start = chunk * length;
var end = Math.min(start + length, u.file.size);
var xhr = new XMLHttpRequest();
var path = "/" + u.settings.key;
path += "?partNumber=" + chunk + "&uploadId=" + u.upload_id;
var method = "PUT";
var authorization = "AWS " + u.settings.access_key + ":" + signature;
var blob = u.file.slice(start, end);
xhr.upload.addEventListener("progress", progress_handler, true);
xhr.addEventListener("readystatechange", handler, true);
xhr.addEventListener("error", error_handler, true);
xhr.addEventListener("timeout", error_handler, true);
xhr.open(method, u.settings.host + path, true);
xhr.setRequestHeader("x-amz-date", date);
xhr.setRequestHeader("Authorization", authorization);
xhr.setRequestHeader("Content-Type", u.settings.content_type);
xhr.setRequestHeader("Content-Disposition", "attachment; filename=" + u.file.name);
xhr.send(blob);
chunk_size
6MB ist. Nachdem ein Chunk den Upload abgeschlossen hat, folgt der nächste und so weiter. Aber manchmal (alle 80 Chunks oder so), die PUT
Anfrage schlägt fehl, mit e.type == "error"
, e.target.status == 0
(was mich überrascht), und e.target.responseText == ""
. Nachdem ein Stück ausfällt, geht der Code wieder Versuche, sie zu laden und bekommt exakt die gleichen Fehler. Wenn ich die Seite und weiterhin den Upload aktualisieren (die gleiche Chunk!), Es funktioniert wie ein Charme (80 Stücke oder so, wenn es wieder stecken bleibt). Hier ist, wie die Anfrage aussieht, ist in Chrom Entwickler-Tools:
Irgendwelche Ideen, warum dies passieren könnte, oder, wie so etwas zu debuggen?
EDIT: Hier ist die OPTIONS
Antwort:
Ja, im Idealfall werden Sie den Antrag unterschreiben, wie Sie sie anstelle von all-at-once am Anfang sind zu senden. –
@RyanParman ja, das ist richtig, aber meine Bibliothek ist in JS und ich muss Signaturen serverseitig generieren, und ich möchte lieber weniger Anfragen an den Server. –
Ah, Gotcha. Ja, das macht einen Unterschied. :) –