¿Cómo saber el tamaño de una solicitud HTTP antes de que llegue a su destino?

Iniciado por Diesan Romero, 7 Enero 2020, 00:16 AM

0 Miembros y 1 Visitante están viendo este tema.

Diesan Romero

Estoy estudiando nodejs y aprendí sobre streams y buffer. Lo encontré muy interesante porque se me ocurrió usarlo en un servidor HTTP, ya que si una solicitud es demasiado grande, los datos se pueden enviar poco a poco, especialmente cuando se usa el verbo POST para subir archivos grandes, como videos por ejemplo. El problema es que no todos los datos (archivos en este caso) son muy grandes. ¿Existe alguna manera de saber el tamaño de una solicitud antes de que llegue a su destino?

A mi se me ocurrió desde el cliente evaluar el tamaño del archivo antes de ser enviado y pasar el valor al servidor, pero no se si eso se puede hacer o si corro riesgo de performance. En caso de no ser posible ¿Existe alguna otro alternativa?

AlbertoBSD

Si te refieres a los archivos:

Resumable.js

http://www.resumablejs.com/

CitarWhat is Resumable.js
It's a javascript library providing multiple simultaneous, stable and resumable uploads via the HTML5 File API.

The library is designed to introduce fault-tolerance into the upload of large files through HTTP. This is done by splitting each files into small chunks; whenever the upload of a chunk fails, uploading is retried until the procedure completes. This allows uploads to automatically resume uploading after a network connection is lost either locally or to the server. Additionally, it allows for users to pause, resume and even recover uploads without losing state.

Lo he usado para subir archivos de hasta 10 GB.

Si lo que realmente quieres es aprender a utilizar el input file del HTML te puede devoler un arreglo "files" con el cada uno de los items puedes obtener el size individual: File.size

https://developer.mozilla.org/en-US/docs/Web/API/File

Si te refieres a la data de que mandas mediante POST, lo ideal seria obtener el length de todos los campos URLencodedeados + los nombres de las variables y con eso se das mas o menos cuanto va a ser el Content-Length final, generalmente se mandan:

Variable1=DATA+URL+Encode&Variable2=DATA+URL+Encode&Variable3=DATA+URL+Encode

Y asi sucesivamente, a no se que lo estes mandando en JSON o XML o algun otro formato

Saludos!
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

Diesan Romero

Cita de: AlbertoBSD en  7 Enero 2020, 01:02 AM
Si te refieres a los archivos:

Resumable.js

http://www.resumablejs.com/

Lo he usado para subir archivos de hasta 10 GB.

Lo que necesito saber es cuánto pesa la petición antes de que llegue para saber si usar streams o no. Porque si tengo una petición de 1MB lógicamente no la voy a mandar de a poco, la subo y listo, pero si es de 1GB o más, entonces lo más senzato sería usar streams o cualquier librería como la que me muestras. El problema es saber cuánto pesa la petición antes de que esta sea procesada para definir cómo será procesada.

AlbertoBSD

Por eso que tipo de petición es?

Ya te puse los ejemplos, Archivos, Post, Json, otro?

Desde donde lo estas viendo desde un navegador, desde un proxy desde el server?

Si son archivos utiliza resumable, funciona desde 0 bytes hasta teóricamente el Máximo de capacidad del cliente, manda los archivos en pequeños chunks de tamaña configurable (Usualmente 1 MB).

Saludos
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

Diesan Romero

Cita de: AlbertoBSD en 10 Enero 2020, 02:49 AM
Por eso que tipo de petición es?

Ya te puse los ejemplos, Archivos, Post, Json, otro?

Desde donde lo estas viendo desde un navegador, desde un proxy desde el server?

Si son archivos utiliza resumable, funciona desde 0 bytes hasta teóricamente el Máximo de capacidad del cliente, manda los archivos en pequeños chunks de tamaña configurable (Usualmente 1 MB).

Saludos

Son archivos en este caso. Bien, entonces resumable hace todo el trabajo en el frontend (mido el tamaño del archivo y si es mayor a una cantidad específica lo envía poco a poco?) y ¿Cómo recibe los chunk en el backend? ¿Por medio de los streams? Estoy usando NodeJS.

AlbertoBSD

El backend si tiene que ser configurado para ensamblar los chunks en la pagina de github de resumable hay un codigo de ejemplo para nodejs

https://github.com/23/resumable.js/tree/master/samples/Node.js

Yo lo he implementado en el backend con php y funciona muy bien.

Obvio hay que validar que sea un archivo valido que no te vallan a injectar código etc etc..

Básicamente resumable divide el archivo original en fragmentos y los envia individualmente uno a uno los fragmentos como upload de archivos normales y tu desde el backend le respondes con headers 200 o 404 en caso se exito o de error respectivamente.

Siempre hace ese proceso independiente del archivo original.

Saludos
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

Diesan Romero

Ya vi el ejemplo de NodeJS y está bastante trabajoso, pero bueno, valdrá la pena después de todo. Hay que aprovechar el tema de los streams y el asincronismo. Ya hoy en día la gente sube hasta fotos de 4MB ¿Qué quedará para los videos y las transmisiones?

AlbertoBSD

Cita de: Diesan Romero en 10 Enero 2020, 03:27 AM
Ya vi el ejemplo de NodeJS y está bastante trabajoso, pero bueno, valdrá la pena después de todo.

Si algo trabajoso, sin embargo bien configurado y filtrado todo tipo de archivos maliciosos queda bastante bien

Cita de: Diesan Romero en 10 Enero 2020, 03:27 AM
Ya hoy en día la gente sube hasta fotos de 4MB ¿Qué quedará para los videos y las transmisiones?

Una foto de 4 o 6 MB de una nota de texto que dice un numero telefonico de 10 dígitos 🤣🤣🤣....

De hecho esa libreria de javascript, la realizo una empresa precisamente para trabajar con archivos de videos.



Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

Diesan Romero

Cita de: AlbertoBSD en 10 Enero 2020, 03:38 AM
Una foto de 4 o 6 MB de una nota de texto que dice un numero telefonico de 10 dígitos 🤣🤣🤣....

Jeje, si, cuidado no se de el caso. Impresionante, pero cierto.

Cita de: AlbertoBSD en 10 Enero 2020, 03:38 AM

De hecho esa libreria de javascript, la realizo una empresa precisamente para trabajar con archivos de videos.

Lo mejor de todo es que creo que es open source. Profundizaré. Gracias.