Estoy intentando subir un archivo grande (1.5GB) a Amazon S3 utilizando el corte de archivos REST Api y HTML5. Así es como el código de carga se ve como (código simplificada para facilitar la lectura):Amazon S3 CORS PUT falla
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
es 6MB. Después de que un fragmento termina de cargarse, el siguiente sigue, y así sucesivamente. Pero a veces (cada 80 trozos más o menos), la solicitud PUT
falla, con e.type == "error"
, e.target.status == 0
(lo que me sorprende) y e.target.responseText == ""
. Después de que falla un trozo, el código vuelve a intentar cargarlo y obtiene exactamente el mismo error. Cuando actualizo la página y continúo la carga (¡el mismo fragmento!), Funciona como un amuleto (por 80 pedazos más o menos, cuando se pega de nuevo). Así es como se ve en la solicitud de herramientas de Chrome dev:
Cualquier idea por qué esto podría suceder, o cómo depurar algo como esto?
EDIT: Aquí está la respuesta OPTIONS
:
Sí, lo ideal sería que firme la solicitud al igual que los está enviando en lugar de todo a la vez al principio. –
@RyanParman Sí, es correcto, pero mi biblioteca está en JS y necesito generar firmas del lado del servidor, y preferiría hacer menos solicitudes al servidor. –
Ah, tengo. Sí, eso hace la diferencia. :) –