2012-09-27 14 views
6

Sto provando a caricare un file di grandi dimensioni (1,5 GB) su Amazon S3 utilizzando l'API REST e il file HTML5 slicing. Ecco come il codice di caricamento sembra (codice ridotta per migliorare la leggibilità):Amazon S3 CORS PUT non riesce

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. Dopo che un chunk finisce il caricamento, ne segue uno successivo e così via. Ma a volte (ogni 80 blocchi o così), la richiesta PUT non riesce, con e.type == "error", e.target.status == 0 (che mi sorprende) e e.target.responseText == "". Dopo un chunk non riesce, il codice tenta nuovamente di caricarlo e ottiene lo stesso errore. Quando aggiorno la pagina e continuo il caricamento (lo stesso chunk!), Funziona come un incantesimo (per 80 blocchi o giù di lì, quando si blocca di nuovo). Ecco come la richiesta appare in strumenti di sviluppo di cromo:

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

Tutte le idee perché questo potrebbe accadere, o come eseguire il debug qualcosa di simile?

EDIT: Ecco la risposta OPTIONS:

enter image description here

risposta

4

ho finalmente trovato il problema sniffing dei pacchetti: ci sono due questioni:

  1. per PUT richieste che ottenere un 4xx (non prova per gli altri non 2xx risposte), la richiesta XHR ritorna come abortito (stato = 0); non hanno ancora trovato una spiegazione per questo, check out Why does a PUT 403 show up as Aborted?

  2. Amazon S3 ha risposto con un 403 che ha detto RequestTimeTooSkewed, perché le mie firme vengono generati quando si avvia il caricamento, e dopo 15 minuti (il timeout che fa scattare l'errore RequestTimeTooSkewed), fallisce e le firme devono essere rigenerate. Tale errore 403 non si vede mai nella console strumenti di sviluppo o dal codice js, a causa del primo problema ..

Dopo rigenerare le firme, tutto funziona come un fascino.

+0

Sì, idealmente firmeresti la richiesta proprio mentre li stai inviando invece di tutto-a-una volta all'inizio. –

+0

@RyanParman sì, è vero, ma la mia libreria è in JS e ho bisogno di generare firme lato server, e preferisco fare meno richieste al server. –

+0

Ah, gotcha. Sì, questo fa la differenza. :) –

2

Ti è verificare se il browser sta facendo qualsiasi richiesta di 'opzioni'. Se sì, quali sono le intestazioni di risposta.

+0

controlla la mia modifica –