Bueno aqui os traigo una duda... alguien se ha planteado como hacer el upload de archivos ($_FILES o como sea) usando ajax en php? el POST hace tiempo que esta controlado pero el upload....
gracias de antemano
| |||
Ajax + Php + Upload Archivos Bueno aqui os traigo una duda... alguien se ha planteado como hacer el upload de archivos ($_FILES o como sea) usando ajax en php? el POST hace tiempo que esta controlado pero el upload.... gracias de antemano |
| |||
Usa la librería Curl en php. Yo la he probado sin tener que instalar ningún paquete. Busca en la web sobre Curl y verás. -Te permite ftp, http, ssl, https, .. -Te permite monitorear el tamaño del archivo, tiempo transcurrido, media de subida o bajada ... busca por curl_open(), ya que de primeras encontré para trabajar con un programa de descarga estilo wget en linea de comandos, pero hay funciones para integrar en php y yo no he tenido que cargar ninguna clase en el código php. Por cierto, he visto una aplicacion para upload de archivos con barra de progreso en Ruby of Rails que queda muy bien y tiene muy poco código. |
| |||
Esa duda ya la han planteado muchas veces, y la respuesta es que no se puede, hay varias solciones que general el mismo efecto, normalmente usando iframes, para subir el fichero y ajax para mostrar una barra de progreso. |
| |||
Por lo que yo veo no es nada imposible, de echo gmail lo hace :? |
| |||
el punto no es que sea posible o imposible..., sino que para subir un archivo es necesario cumplir con una serie de cosas que establece el protocolo http para tal objetivo, ahora si en el futuro los desarrolladores brindan una manera de acceder a esa funcionalidad del navegador desde javascript, entonces recién se podrá subir archivos con ajax |
| |||
tienes razon, pero si lees nuevamente mis mensajes, en ningun momento dije que fuera imposible (quien sabe si en un futuro se pueda subir o no archivos de esa forma), inicialmente solo te pregunte si realmente sabias como hacia el "upload" gmail. |
| ||||
Depende de si el uso de un iframe oculto en vez del uso del objeto xmlhttprequest se considera o no ajax. Lo que sí es cierto es que el objeto xmlhttprequest no puede manejar archivos. Google por mucho que use ajax no puede tampoco realizar upload de archivos usando el objeto xmlhttprequest por muy google que sea. saludos |
| ||||
gmail no es la gran cosa, no le veo tanto ajax que digamos, me recarga la pagina cada vez que hago click en algun link del menu izquierdo. por empezar tiene 15 iframes, lo pueden ver si tienen el html validator para firefox.
__________________ Download FireFox |
| ||||
Este script lo saque de una clase de PHPClass y le hice un par de modificaciones. Aca dejo el sistema funcionando http://retrofox.com.ar/ajaxfileuploader/ Consta de 4 Archivos: la clase AjaxFileUploader.inc.php Código PHP: Código PHP: Código PHP: Código PHP:
__________________ | Cabeza De Raton | Última edición por Calisco; 14/09/2006 a las 20:14 Razón: mal etiquetado los scripts |
| ||||
Este es el link en PHPClass del autor de la clase original. http://www.phpclasses.org/browse/pac...oad/targz.html Ho le hice una moficacion a la funcion uploadFile (obj) para que solo pueda subir archivos .jpg. Mas que nada por el ejemplo, si no me pueden subir un .php al server. Este es el codigo. Código PHP:
__________________ | Cabeza De Raton | Última edición por Calisco; 14/09/2006 a las 20:17 Razón: mal tipeado por apuro ... |
| ||||
Ahora tengo un problema ... y es que no se como puedo rescatar el valor de las variables del archivo $_FILE[archivo]['tmp_name'] o $_FILE [archivo]['name']. Por ejemplo, esta linea: Código PHP: Pero si yo hago: Código PHP:
__________________ | Cabeza De Raton | |
| ||||
Bueno, la idea es tratar de resolver como bosta puedo tomar el valor de las variables de $_FILES[][];
__________________ | Cabeza De Raton | |
| ||||
Cita: disculpa pero ... ¿qué estás diciendo?google está usando el mismo método que se estaba usando antes del uso de AJAX, osea que no le encontró la vuelta a nada. Y los códigos que se han dejado en este tema usan todos un iframe, osea, no está usando lo que se considera ajax para enviar el archivo. ¿o acaso ni te has mirado el código fuente antes de dejar tu comentario? Un saludo |
| |||
Cita: no soy un erudito en ajax, si bien lo uso constantemente.
Iniciado por tunait disculpa pero ... ¿qué estás diciendo? google está usando el mismo método que se estaba usando antes del uso de AJAX, osea que no le encontró la vuelta a nada. Y los códigos que se han dejado en este tema usan todos un iframe, osea, no está usando lo que se considera ajax para enviar el archivo. ¿o acaso ni te has mirado el código fuente antes de dejar tu comentario? Un saludo Pero de momento, que veo una llamada a una funcionq que envia los datos a una pagina alojada en el server para que este la procese y devuelva una respuesta (proceso en segundo plano), lo considero ajax dentro de lo que estamos hablando. Código PHP: |
| ||||
Cita: ok, si consideras que el uso de un iframe para trabajar en segundo plano sin usar el objeto xmlHttpRequest sea también ajax
Iniciado por at_elah no soy un erudito en ajax, si bien lo uso constantemente. Pero de momento, que veo una llamada a una funcionq que envia los datos a una pagina alojada en el server para que este la procese y devuelva una respuesta (proceso en segundo plano), lo considero ajax dentro de lo que estamos hablando. Ahora bien, lo que en general se conoce (o vende) hoy como AJAX es realizar ese proceso en segundo plano usando el objeto xmlHttpRequest no se aplica al uso de un iframe para enviar información al servidor. Si te fijas en el código que has citado no se está enviando información ni ningún archivo al servidor mediante ajax si no que está esperando la respuesta de éste tras haberse enviado el archivo con el submit tradicional de un formulario apuntando a un iframe. Cita: Si te fijas está enviando un null al servidor con AJAX
Iniciado por at_elah
Código:
var http = createRequestObject(); var uploader = ''; handleResponse function createRequestObject() { var obj; var browser = navigator.appName; if(browser == "Microsoft Internet Explorer"){ obj = new ActiveXObject("Microsoft.XMLHTTP"); } else{ obj = new XMLHttpRequest(); } return obj; } function traceUpload(uploadDir) { http.onreadystatechange = handleResponse; http.open("GET", 'imageupload.php?uploadDir='+uploadDir+'&uploader='+uploader); http.send(null); } function handleResponse() { if(http.readyState == 4){ document.getElementById(uploaderId).innerHTML = http.responseText; //window.location.reload(true); } else { document.getElementById(uploaderId).innerHTML = "Uploading File. Please wait..."; } } function uploadFile(obj) { var uploadDir = obj.value; uploaderId = 'uploader'+obj.name; uploader = obj.name; document.getElementById('formName'+obj.name).submit(); traceUpload(uploadDir, obj.name); } http.open("GET", 'imageupload.php?uploadDir='+uploadDir+'&uploader= '+uploader); http.send(null); y está realizando un submit de un formulario document.getElementById('formName'+obj.name).submi t(); y este formulario se escibe desde la clase AjaxFileuploader en su método showFileUploader($uploaderId) en donde devuelve un formulario Código PHP: <form id="formName'.$uploaderId.'" method="post" enctype="multipart/form-data" action="imageupload.php" target="iframe'.$uploaderId.'"> Así que lo único que se está haciendo con ajax es recoger el resultado escrito por el servidor tras recoger el archivo enviado con el formulario a través del iframe, pero enviar con ajax no se está enviando nada. |
| |||
ufff, me cambiaste el concepto. Revisando las funciones que uso para procesar el ajax observo que la unica diferencia entre este codigo Código PHP: Edito para agregar que tambien declaro onreadystatechange, para la funcion de respuesta |
| ||||
Cita: He montado todo el tinglado este de archivos y me imprime sin problemas la línea que comentas
Iniciado por Calisco Ahora tengo un problema ... y es que no se como puedo rescatar el valor de las variables del archivo $_FILE[archivo]['tmp_name'] o $_FILE [archivo]['name']. Por ejemplo, esta linea: Código PHP: Pero si yo hago: Código PHP: Código PHP: Cita: Nombre Temporal: C:\PHP\uploadtemp\phpC0.tmp |
| ||||
Mira, yo acabo de modificar el script que hace la copia del archivo al servidor. Este es el codigo: Código PHP: No me funciona, y no se porque es ...
__________________ | Cabeza De Raton | Última edición por Calisco; 16/09/2006 a las 07:43 |
| ||||
Luego de indagar e indagar ... tengo mis penosas ciertas conclusiones. Como Funciona, a quien le pueda servir: La carga del archivo al servidor lo hace a traves del Iframe Oculto. Aca NO se utiliza ajax en ningun momento. Simplemente la funcion uploadFile dispara el action del formulario mediante Código PHP: Dicha action esta definida en la clase php con el metodo showFileUploader($uploaderId) donde el formulario define action="imageupload.php" target="iframe'.$uploaderId.'". Fijense que el script imageupload.php es cargado en el iFrame Oculto. Luego, lo unico que hace AJAX es llamar a algun script de respuesta a todo este embrollo a traves de la funcion traceUpload(uploadDir, obj.name). Que en este caso vuelve a llamar al mismo imageupload.php y le pasa por URL algunos datos en la linea Código PHP: Si eliminaramos la linea Código PHP: Entonces ..., no podia ver el valor de las variables de $_FILES porque la primera vez se muestran en el iFrame oculto. Y cuando AJAX llama por segunda vez el mismo script, ya los valores de $_FILES se han perdido porque el archivo ya se ha subido. Recomiendo No utilizar este script como 'seguro'. Tiene varios errores y cosas que se podrian acomodar de una forma mas elegante y eficiente. No lo considero un buen ejemplo desde mi humilde opinion. Para entender el codigo me di cuenta que hay cosas que estan de mas, desordenadas, etc ... Saludos.
__________________ | Cabeza De Raton | |
| ||||
El otro día cuando instalé el tinglado de esa clase saqué algunas conclusiones (ninguna buena) que por falta de tiempo no he podido comentar hasta ahora. Calisco, me has ahorrado teclear parte del asunto veo que también has visto lo que hay. Pero el asunto va más allá, según mi opinión. Esta clase se define como upload con ajax cuando no usa ajax para realizar el upload y además el poco uso que hace de ajax es totalmente inutil y sólo confunde pues no trae ninguna información útil ni real. En esta línea de uploader.js ...
Código:
...está enviando unos párametros para nada. Si se quitan el script funciona exactamente igualfunction traceUpload(uploadDir) { http.onreadystatechange = handleResponse; http.open("GET", 'imageupload.php?uploadDir='+uploadDir+'&uploader='+uploader); http.send(null); }
Código:
porque el archivo 'imageupload.php' sólo se encarga de recoger variables enviadas por el método POST y no por GET. En el caso de no encontrar algo concreto por POST devuelve siempre un ...function traceUpload(uploadDir) { http.onreadystatechange = handleResponse; http.open("GET", 'imageupload.php'); http.send(null); } Código PHP: Así que aunque el archivo no se haya subido por algún error el ajax no se entera y sigue recibiendo de cualquier forma el mensaje "Archivo subido" (información errónea en realidad) Cuando se envía el form y ocurre un error (el directorio no existe, por ejemplo) nos salta una alert() pero ese alert no es manejado por ajax, si no por el propio archivo imageupload.php desde el iframe (es el documento del iframe quien lanza el aviso). Sin embargo la parte manejada por ajax (la que no controla nada en realidad) nos escribe en el documento "Archivo subido" y nos quita el campo y lo da por bueno Así el uso de onreadystatechange sólo sirve para lanzar una función que escribe lo que devuelve imageupload.php que es siempre el mismo mensaje cuando se debería, en todo caso, lanzar esa función desde el iframe que es el que de verdad está recogiendo el mensaje fijal (si se subió o no) Así que en este uploader el uso de ajax es inutil e innecesario. Analizo además otros detalles sin sentido: ¿por qué quitar el campo de archivo tras subir el archivo? ¿por qué la clase crea un form para cada campo y un iframe distinto para cada form + campo? se puede manejar todo desde un único iframe y no t ener que hacer tanto malabarismo con idés de formulario e idés de iframes. Sería más lógico que se envíen los archivos a la vez con un único submit y que sea el usuario quien decida el momento de ser enviados (por ejemplo si seleccionó mal el archivo que quería no le da ocasión a rectificar). En fin, que son montones de líneas que no sirven que crean un sistema poco usable y que engaña al "venderse" como un sistema ajax. Se puede hacer lo mismo sin necesidad de tanto lío. |
| ||||
...me olvidaba... haz la prueba y pon visible el iframe y mira lo que sucede Es decir, quita lo que pongo en negritas del código fuente
Código:
Eso es en AjaxFileUploader.inc.php en la función showFileUploader($uploaderId)return '<form id="formName'.$uploaderId.'" method="post" enctype="multipart/form-data" action="imageupload.php" target="iframe'.$uploaderId.'"> <input type="hidden" name="id" value="'.$uploaderId.'" /> <span id="uploader'.$uploaderId.'" style="font-family:verdana;font-size:10;"> Upload File: <input name="'.$uploaderId.'" type="file" value="'.$uploaderId.'" onchange="return uploadFile(this)" /> </span> <iframe name="iframe'.$uploaderId.'" src="imageupload.php" width="400" height="100" style="display:none"> </iframe> </form>'; prueba a definir un directorio que no exista y observa lo que sucede |
| ||||
sisisi, tal cual. Yo he estado depurando todo este codigo. La idea es acomodarlo un poco ponerlo como ejemplo, ya que el original si bien funciona, colo confunde mas al que quiere aprender. Saludos.
__________________ | Cabeza De Raton | |
| |||
Ok gracias por la ayuda MMm.. Tenia el mismo inconveniente.. tenia una pagina que la llamo padre porque por ajax carga al resto (incluyendo el formulario) y cuando le decia al formulario enviar.. obviamente se salia de la pagina padre por aquello del action.. La idea q se espuso aqui me sirvio.. no es ajax.. pero logra un efecto similar.. ahh y ese codigo que pusieron.. valla que fue largo.. solo necesite 3 o 4 lineas de codigo y listo...me la complicaron.. pero aprendi.. Este es un muy buen post |
| ||||
sisisi, es sencillito el codigo no mas ...
__________________ | Cabeza De Raton | |
| |||
Re: Ajax + Php + Upload Archivos Bueno ah que les dejo una modificacion espero que les guste y le sirva mi primer aporte a la comunidad =D usand capas con javascript desde el iframe usando "Parent" bueno no me deja poner enlaces =(Junten todo) Cita: h t t p : / / mundojuegos . webspacemania . com / ajax_upload . zip cualquier cosa :$ [email protected] jiji |