2010-03-15 37 views
35

Tengo una aplicación web que acepta cargas de archivos de hasta 4 MB. El script del lado del servidor es PHP y el servidor web es NGINX. Muchos usuarios han solicitado aumentar este límite drásticamente para permitir la carga de video, etc.Subir archivos de 1GB usando fragmentación en PHP

Sin embargo, parece que no hay una solución fácil para este problema con PHP. Primero, del lado del cliente estoy buscando algo que me permita dividir archivos durante la transferencia. SWFUpload no parece hacer eso. Creo que puedo transmitir cargas utilizando Java FX (http://blogs.oracle.com/rakeshmenonp/entry/javafx_upload_file) pero no puedo encontrar ningún equivalente de request.getInputStream en PHP.

El aumento del navegador client_post limits o php.ini upload o max_execution veces no es realmente una solución para archivos realmente grandes (~ 1GB) porque tal vez el navegador agote el tiempo y piense en todos esos blobs almacenados en la memoria.

¿Hay alguna manera de resolver este problema usando PHP en el lado del servidor? Agradecería sus respuestas.

+3

Una de mis aplicaciones permite subir archivos de> 1 GB configurando las mismas opciones del lado del servidor que usted mencionó. Los usuarios nunca han informado tiempos de espera ni nada por el estilo. – Dolph

+2

Una buena solución funciona en todas partes, en mi humilde opinión. Cargar archivos de 1GB no funcionará en módems de 56 KBPS/conexiones lentas. Una solución fragmentada sería muy sólida y puede ayudar a reanudar los enlaces interrumpidos. – rjha94

+0

Echa un vistazo aquí: https://tus.io/ – sgargel

Respuesta

-2

Definitivamente puede escribir una aplicación web que acepte un bloque de datos (incluso a través de un POST) y añada ese bloque de datos a un archivo. Me parece que necesita algún tipo de aplicación del lado del cliente que tomará un archivo y lo dividirá en fragmentos, luego lo enviará a su servicio web un fragmento a la vez. Sin embargo, parece mucho más fácil crear un directorio sftp, y permitir que los clientes simplemente utilicen archivos con alguna aplicación cliente preexistente.

+0

http://code.google.com/p/gigaupload/ – rjha94

+2

Puede que no quieras solo anexar cada fragmento al archivo de destino a medida que entran. Es posible para que los pedazos se salgan de orden. La solución que utilizamos es guardar cada fragmento con una identificación numérica, luego combinar todos los fragmentos una vez que se hayan cargado todos. –

-3

Creo que crear sockets entre servidores y clientes y enviar datos en fragmentos! .. programación de bajo nivel parece ser la solución .. no son necesariamente las apuestas

3

"pero no puedo encontrar ningún equivalente de request.getInputStream en PHP."

fopen('php://input'); tal vez?

+0

No php: // entrada para datos de formulario multiparte – rjha94

0

¿Cómo sobre el uso de un applet de Java para la carga y PHP para el procesamiento ..

puede encontrar un ejemplo aquí para Jupload: http://sourceforge.net/apps/mediawiki/jupload/index.php?title=PHP_Example

+0

Gracias por el enlace. Eso debería ser posible, estoy intentando con Java FX en este momento. La captura de pantalla de JUpload se ve desde hace 10 años; o) – rjha94

+0

Jaja no estoy seguro hombre :) pero el código PHP es bastante reciente ... (hace unos días la última actualización) se puede ver cómo se fragmenta ... http://jupload.svn.sourceforge.net/viewvc/jupload/trunk/wwwroot/samples.PHP/jupload.php?view=markup – Chris

3

He creado un cliente JavaFX para enviar archivos de gran tamaño en trozos de tamaño máx. de publicación (estoy usando 2 MB) y una secuencia de comandos de receptor de PHP para ensamblar los fragmentos en el archivo original. Estoy liberando el código bajo la licencia de Apache aquí: http://code.google.com/p/gigaupload/ Siéntase libre de usar/modificar/distribuir.

+0

Si esto es lo que resolvió su problema, no lo dude y márquelo como respuesta ;-) –

10

plupload es una biblioteca javascript/php, y es bastante fácil de usar y permite la fragmentación.

Aunque usa HTML5.

+0

Vale la pena mencionar que, mientras tanto, también es compatible con HTML4, Silverlight y Flash, como se puede ver [aquí] (http://www.plupload.com/example_all_runtimes.php). – jdepypere

2

Intente utilizar el script bigupload. Es muy fácil de integrar y puede cargar hasta 2 Gb en porciones. El tamaño del fragmento es personalizable.

+1

el enlace está muerto – machineaddict

1

Eche un vistazo a tus protocol que es un protocolo basado en HTTP para cargas de archivos reanudables para que pueda continuar donde lo dejó sin volver a cargar datos enteros en caso de interrupciones. Este protocolo también ha sido adopted by vimeo desde mayo de 2017.

Puede encontrar varias implementaciones del protocolo en diferentes idiomas here. En su caso, puede utilizar su cliente de JavaScript llamado uppy y utilizar golang o php implementación del servidor basado en un servidor.

Cuestiones relacionadas