Actualmente estoy usando Javascript para cargar algunos archivos de video en S3. El proceso funciona para archivos <100 MB, pero para ~ 100 MB más en Chrome me encuentro con un error (esto funciona en Safari). Estoy usando ManagedUpload en este ejemplo, que debería estar haciendo multipart/form-data en segundo plano.
Fragmento de código:
... let upload = new AWS.S3.ManagedUpload({ params:{ Bucket: 'my-bucket', Key: videoFileName, Body: videoHere, ACL: "public-read" } }); upload.promise(); ... Chrome falla con el error RESULT_CODE_INVALID_CMDLINE_URL , las herramientas de desarrollo fallan y en los registros de la terminal de Chrome aparece esto:
[5573:0x3000000000] 27692 ms: Scavenge 567.7 (585.5) -> 567.7 (585.5) MB, 23.8 / 0.0 ms (average mu = 0.995, current mu = 0.768) allocation failure [5573:0x3000000000] 28253 ms: Mark-sweep 854.6 (872.4) -> 609.4 (627.1) MB, 235.8 / 0.0 ms (+ 2.3 ms in 2 steps since start of marking, biggest step 1.4 ms, walltime since start of marking 799 ms) (average mu = 0.940, current mu = 0.797) allocation fa <--- JS stacktrace ---> [5573:775:0705/140126.808951:FATAL:memory.cc(38)] Out of memory. size=0 [0705/140126.813085:WARNING:process_memory_mac.cc(93)] mach_vm_read(0x7ffee4199000, 0x2000): (os/kern) invalid address (1) [0705/140126.880084:WARNING:system_snapshot_mac.cc(42)] sysctlbyname kern.nx: No such file or directory (2)También intenté usar HTTP PUT, ambos funcionan para archivos más pequeños, pero una vez que me hago más grande, ambos fallan.
¿Algunas ideas? He revisado toneladas de publicaciones de SO / documentos de AWS, pero nada ayudó con este problema todavía.
Editar: he presentado el problema con Chrome; parece que es un error real. Actualizaré la publicación cuando tenga una respuesta.
Este problema provino de cargar el archivo grande en la memoria (varias veces), lo que bloquearía Chrome incluso antes de que tuviera la oportunidad de cargarse.
La solución fue usar createObjectURL (una URL que apunta al archivo) en lugar de readAsDataUrl (el archivo completo), y al enviar el archivo a su API, use const newFile = new File([await fetch(objectURL).then(req => req.blob()], 'example.mp4', {type: 'video/mp4'});
Esto funcionó para mí ya que estaba haciendo muchas conversiones para obtener readAsDataUrl al tipo de archivo que quería, pero de esta manera uso mucho menos espacio.