Como File Uploader Asincrono ?

Iniciado por Diabliyo, 12 Agosto 2010, 22:53 PM

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

Diabliyo

Buenas.

Actualmente en mi CMS la forma de hacer uploading a archivos es simplemente moviendolos despues de haber procesado el formulario (pulsando ENVIAR), pero, lo que ahora quiero es brindar la posibilidad de hacer el proceso de forma paralale (asincrono).

La primer idea fue utilizar AJAX como medio, pero evidentemente esto no es posible ya que los flujos GET y POST son solo para pasar variables, y en este caso el flujo $_FILE no entra :( ( o si, si entra diganmelo xD).

La segunda idea (y la que medio funciona) es utilizar un <form> el cual procese a este dentro de un <iframe>, y con un poco de javascript hacer parecer que esta en AJAX, vaya, cuando el usuario proporciona el archivo a subir y pulsa Subir, el Formulario sigue estático pero en la parte donde esta el <input type="file se esta procesando la subida, al finalizar la subida simplemente se cambia el mensaje a algo como: Subido con éxito....

Mi script no presenta problemas para archivos de menos de 5MB, pero, si intento subir un archivo de 10, 15, 20 o mas MBs, simplemente no se sube :(....

Tengo en menta la razon de que el script se frene o simplemente NO se suba el archivo, es porque la configuración del Apache asigna un tiempo de ejecución limite de un script PHP, y pues este simplemente excede el tiempo de ejecución y por ende, se frena el script. Si fuese asi, como me recomiendan configure mi Apache ?

La idea es que quiero contemplar archivos hasta de 700MB.

Me gustaría por favor me ayudaran o brindaran su opinión, a continuación les pongo el code:

configuracion de mi php.ini
post_max_size 8M 8M
max_execution_time 30 30
max_file_uploads 20 20
max_input_nesting_level 64 64
max_input_time 60 60
memory_limit 128M 128M


Código (php) [Seleccionar]
<script type="text/javascript">
function resultadoUpload(estado, file)
{
if (estado == 0)
var mensaje = file + ' <img src="loading.gif" border="0">';
else if (estado == 1)
var mensaje = file + ' <img src="palomita.png" border="0">';
else if (estado == 2)
var mensaje = 'Error: Tipo de archivo/extensión no permitido.';
else if (estado == 3)
var mensaje = 'Error: No se pudo copiar el archivo.';
else
var mensaje = 'Error Desconocido';

document.getElementById('upload').innerHTML=mensaje;
}

function capa_verno( capa )
{
var layer;
layer= document.getElementById(capa);

if( layer.style.visibility=="hidden" )
{
layer.style.visibility="visible"; //visible - hidden
layer.style.display="block"; // none - block
}
else
{
layer.style.visibility="hidden"; //visible - hidden
layer.style.display="none"; // none - bloque
}
}
</script>
<?php
if( !strcmp($_GET["file"], "up") )
{
sleep(3);
echo '<script language="javascript" type="text/javascript">
window.top.window.resultadoUpload(\'1\', \''
$_FILES["archivo"]["name"]. '\');
</script>'
;
}
else
{
echo 'Archivos:<p>
<div id="upload"></div>
<form action="?file=up" method="POST" id="form" enctype="multipart/form-data" target="ajax_upload" 
onsubmit="resultadoUpload(\'0\', \'Subiendo \')">
<input type="file" name="archivo"><input type="submit" value="Subir" onclick="capa_verno(\'form\')">
</form>
<iframe name="ajax_upload" id="ajax_upload" style="border-style:none;"></iframe>'
;
}
?>

~ Yoya ~

Eso pasa por la directiva upload_max_filesize, que establece el tamaño máximo a subir... No entendí lo que quisiste decir anteriormente

Info
upload_max_filesize
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.

Diabliyo

Cita de: ~ Yoya ~ en 12 Agosto 2010, 23:09 PM
Eso pasa por la directiva upload_max_filesize, que establece el tamaño máximo a subir... No entendí lo que quisiste decir anteriormente

Info
upload_max_filesize

Sobre asincrono ?, me refiero a subir un archivo (estilo Gmail) en donde el usuario pueda subir un archivo sin procesar el formulario (dejar subiendo el archivo), asi puede escribir una entrada mientras tanto.

Sobre upload_mx_filesize existe forma de configurarla ilimitada ?, digo, porque igual si la pongo a limite de 700MB y alguien sube algo de 800MB ya el script tendria problemas :(

IMPORTANTE: edite el primer psot, checa la configuracion de mi apache please.

Saludos !

~ Yoya ~

incrementa el valor de la directiva de upload_max_filesize y post_max_size, puedes ponerle 2G a upload_max_filesize o mas, dependiendo de los archivos que creas que puedes intentar subir y post_max_size unos megas mas que upload_max_filesize por si deseas enviar mas datos desde el mismo POST...

En el mismo script, puedes usar la función set_time_limit() que establece el limite de tiempo que puede ejecutarse el script y si este se sobrepasa entra el tiempo establecido de la directiva max_execution_time...
Osea, si establece 100 el limite de ejecucion del script con la función set_time_limit() + 30 de la directiva max_execution_time serán 130. Puedes ponerle el tiempo que creas...

Creo que con el valor por defecto de la directiva max_input_time bastara, pero si son muchos datos que enviaras via POST puedes incrementarla.

El valor por defecto de la directiva memory_limit puedes dejarla asi, para evitar que el servidor se sobrecargue...

El valor por defecto de la directiva max_input_nesting_level, lo puedes dejar como esta.
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.

Diabliyo

#4
Por ultimo, que piensas del script para upload ?, crees que exista algo mejor pero que no use Flash ni Java ?

Porque la idea es basicamente subir los archivos a un directorio, al mismo tiempo registrar una variable de session donde esten los nombres, los nombres de los archivos a subir se cambiaran al momento de finalizar la subida por un nombre aleatorio, posteriormente cuando el usuario Procese/Enive el formulario, se revisara la variable de sesion registrada y al contener esta datos se asume que subieron archivos, se mueven y se genera un registro en la BDD.

Saludos !

~ Yoya ~

Cita de: Diabliyo en 13 Agosto 2010, 00:13 AM
Por ultimo, que piensas del script para upload ?, crees que exista algo mejor pero que no use Flash ni Java ?

Nose man, primero tocaría Ajax antes que flash xD y nose ajax... Esta duda la podrías mover a desarrollo web ya que el problema no seria con PHP...
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.

Diabliyo

Cita de: ~ Yoya ~ en 13 Agosto 2010, 00:17 AM
Nose man, primero tocaría Ajax antes que flash xD y nose ajax... Esta duda la podrías mover a desarrollo web ya que el problema no seria con PHP...

Lo que pasa es que AJAX solo procesa flujos POST y GET, asi que el flujo $_FILE no se puede :(...

raul338

No tengo idea de como se hace en ajax para manejar archivos, pero si en caso se puede, lo puedes hacer por partes y enviarlos por post! :P (inventa algun sistemita de comandos entre aplicaciones)