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:
Tutte le idee perché questo potrebbe accadere, o come eseguire il debug qualcosa di simile?
EDIT: Ecco la risposta OPTIONS
:
Sì, idealmente firmeresti la richiesta proprio mentre li stai inviando invece di tutto-a-una volta all'inizio. –
@RyanParman sì, è vero, ma la mia libreria è in JS e ho bisogno di generare firme lato server, e preferisco fare meno richieste al server. –
Ah, gotcha. Sì, questo fa la differenza. :) –