2012-09-27 3 views
6

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:

enter image description here enter image description here enter image description here

Irgendwelche Ideen, warum dies passieren könnte, oder, wie so etwas zu debuggen?

EDIT: Hier ist die OPTIONS Antwort:

enter image description here

Antwort

4

fand ich endlich das Problem durch Pakete Schnüffeln: Es gibt zwei Probleme:

  1. für PUT Anforderungen, die ein 4xx (nicht getestet für andere nicht 2xx Antworten), die xhr Anfrage Renditen als abgebrochen (Status = 0); noch haben keine Erklärung für die Besuche Why does a PUT 403 show up as Aborted?

  2. gefunden

    Amazon S3 mit einem 403 reagiert, die RequestTimeTooSkewed sagte, weil meine Signaturen erzeugt werden, wenn der Upload beginnt, und nach 15 Minuten (das Timeout, das die RequestTimeTooSkewed Fehler auslöst), schlägt es fehl, und die Signaturen müssen neu generiert werden. Der 403-Fehler wird nie wegen des ersten Problems in der Entwickler-Tools-Konsole oder durch den js Code, gesehen ..

Nach den Signaturen zu regenerieren, alles wirkt wie ein Zauber.

+0

Ja, im Idealfall werden Sie den Antrag unterschreiben, wie Sie sie anstelle von all-at-once am Anfang sind zu senden. –

+0

@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. –

+0

Ah, Gotcha. Ja, das macht einen Unterschied. :) –

2

Haben Sie überprüfen, ob Browser jede 'OPTIONEN' Anforderung stellt. Wenn ja, was sind die Antwortheader?

+0

Check meines bearbeiten out –