Usuario anónimo ¿Quieres tener tu propio blog?
Crear blog gratis en OboLog

Descripción y fuentes del upload PHP + AJAX con barra de progreso

por obokaman
jueves, 23 de marzo del 2006 a las 23:17
guardado en , , ,

Días atrás comenté que había estado trabajando en un pequeño experimento para conseguir implementar un sistema para realizar upload de archivos mediante PHP, que permitiera generar una barra de progreso, con la que controlar el estado de la carga de archivos en todo momento.

A continuación encontraréis disponible para descara el código fuente de dicho experimento y una pequeña descripción del paquete y de los requisitos para su puesta en marcha.

Contenidos del paquete

  • /cgi-bin/upload.cgi: este es el CGI perl que se encarga de gestionar el upload, además de ir escribiendo todos los datos POST en un único archivo que nos permite controlar el total de datos cargados en el servidor en un momento determinado.
  • /upload.php: es el documento principal, que contiene el código HTML y JS necesario para crear dinámicamente los campos file y el listado de archivos que vamos a cargar al servidor, así como dibujar dinámicamente la barra de progreso a partir de las respuestas recibidas por AJAX.
  • /ajax_process.php: es el script PHP que recibirá las peticiones AJAX, comprobará el estado del upload y devolverá una respuesta XML con datos como el tamaño total del archivo, la cantidad de datos cargada, los nombres de los archivos...
  • /xml.class.php: un par de clases para crear/parsear datos XML.
  • /img: contiene dos imágenes opcionales: un fondo animado para la barra de progreso y un icono "en proceso".

Ejemplo en vivo

Podéis ver un ejemplo real en la URL http://www.obolog.com/upload.php

Descarga del código fuente

Podéis descargar un ZIP con el código fuente desde http://www.obolog.com/downloads/ajax_upload.zip

Créditos

La idea de la carga múltiple de archivos la tomé de : Upload multiple files with a single file element

El código del script CGI que permite el upload y la escritura de los datos raw POST es una modificación de Mega Upload, de raditha.com.

Toda la implementación de AJAX se ha llevado a cabo usando la librería Jquery , consiguiendo una simplificación extrema ( vereis que todo el código necesario para la creación dinámica de campos file y la escritura y modificación de la barra de progreso supera en poco las 50 líneas ).

 

Y bueno, eso es todo amigos. Que lo disfrutéis. Preguntas y dudas a los comentarios.

Mensajes relacionados

Comentarios

roger roger
Muchas gracias Albert! That's a great piece of tool.

BUeno, bueno... Felicidades! (auqn no me he enterado de res!) Pero Albert, ya sabes que tienes una cita conmigo... un punto más que se agrega a mi lista de NS/NC...

:-) 

Tim Tim

No Habla Espanol, but I really want to get this working on my site....when I test it out It just sits there....loading.

MeLeNaS MeLeNaS
Majuki dixit: "Albert, ya sabes que tienes una cita conmigo..."
Sorprendido
EH EH!! què vol dir això? aqui hi ha tema i jo no m'he enterat? això no pot ser... Riendo
Hola, no hablo español así que esta traducción puede ser incorrecta. No puedo conseguir esta escritura para trabajar en mi Web site (http://watelevision.com/upload.php) que la escritura upload con éxito el archivo, pero nunca aparece en la carpeta del tmp y la barra del progreso no se mueve, él sigue siendo en blanco. ¡Por favor ayuda!
No hablo Chino, pero eso de que debas una cita a alguien me parece la mar de interesante. Por cierto ya probaré el script que tiene buena pinta. A melenas tambien le ha hecho gracia lo de tu cita eh? yo tambien quiero una cita contigo.Riendo

Ponte a la cola, dude. Guiño

MeLeNaS MeLeNaS
en NeburX s'apunta a un bombardeig!! :P
Alejandro Alejandro

Albert,

Me parece excelente el script. El mejor de todos los que vi. El problema es que no logro que funcione. Cuando cargo archivos la barra no se completa y el archivo nunca llega. Disculpa la molestia, hay algo que me este olvidando? o el servidor requiere de alguna libreria en particular?

Desde ya muchas gracias ! 

Agh! Llevas toda la razón, Alejandro! El código es la adaptación del ejemplo que colgué, y precisamente en ese ejemplo, para no saturar el servidor, simplemente no hacía nada con los archivos subidos, se quedaban en la carpeta temporal...

Así pues, para conseguir que el script termine de ser funcional, y poder trabajar con los archivos, faltaría mover los temporales a una carpeta de trabajo. Eso se podría hacer tanto directamente desde el CGI, o mediante un script PHP al que redireccionara éste. Espero poder subir el script modificado en un par de días. Os informaré con un comentario en cuanto lo haya actualizado.

Siento el descuido! Avergonzado

Muy bueno! felicidades, me gustaría contactar contigo para hablar sobre un proyecto de web, estoy buscando un programador joven, innovador, amante de internet y arriesgado.

Si te sientes identificado, será un placer conocerte,

ups, he escrit en castella, soc de Manresa ;-) 

Muy interesante tu articulo, yo tenia tambien esa idea de cargar archivos mediante ajax. Lo intente personalmente siguiendo un ejemplo de registro de datos mediante ajax, pero no pude, pero con este codigo vere si puedo implementarlo en mi web, la cual estoy actualizando. GRacias
Alfredo Alfredo

¿Cuando queda pronta la modificación del script? Veo que los post llegan hasta el 11/04/06 y aún no hay nada..... es que la ansiedad dejo de ser un valor?

Disculpad la tardanza... Hace algo más de una semana me trasladé al nuevo piso, y aún no tengo internet allí. Si los operadores de Jazztel no me han mentido... en unas dos semanas habrán llevado a cabo la portabilidad y la activación de la línea, así que para entonces, podré colgar los cambios.

Mientras tanto... sólo puedo conectar desde el trabajo. Triste

Ola! Adorei seu script, mas estou um problema. Tudo funciona perfeitamente, mas para onde vao meus arquivos no servidor ?

Muito obrigado, se puder responder no meu email, ou no meu msn: fabricio_massula@hotmail.com

Obrigado Guiño

Alfredo Alfredo
Ok, esperemos que pronto se solucione tu conexión y confiemos hmmm en los operadores de Jazztel que si son igual a los servicios uruguayos estamos en problema. En lo posible avisa de alguna forma que se realizó la modificación. Gracias por tu tiempo y por compartir tus ideas.
Alejandro Alejandro

Buenismo, mira gracias !
Lo baje de nuevo y anda perfecto. Que tendria que modificar para recuperar los archivos que subo? o sea, moverlos a una carpeta

Epale!!! está súper tu explicación!

(Y)Chulo

Josue Ramirez Josue Ramirez

Que tal men, hace unos dias curiosiando por la red me encontre tu script y mi reaccion fue como si hubiera encontrado el santo grial jejejeje

 en pocas alabras: esta muy bueno el script, Chulo

 pero no seas malo sube el script funcional

Miguel Miguel

Hola que tal,

Estoy impresionado por las posibilidades de AJAX, pero he tratado de instalar el script en mi servidor y no consigo que haga nada. Se queda "cargando..." y no hace nada.

 Es muy posible que haya cometido algún fallo al instalarlo, por lo que cualquier ayuda será bienvenida. La estructura del servidor es similar a la de todos

 /var/www/vhosts/dominio.com/cgi-bin

 /var/www/vhosts/dominio.com/httpdocs

 /var/www/vhosts/dominio.com/tmp

...

 En el archivo ajax_process.php que debería poner aquí:

<?
// Put here the same folder that in CGI
define ( "TEMP_DIR", $_SERVER['DOCUMENT_ROOT']."/tmp/" );
//---------------->

y en upload.cgi

# variable values. This folder will host the raw post data during the upload.

$tmp_dir="/var/www/vhosts/obolog.com/httpdocs/tmp";


Saludos

Saludos
Miguel Miguel

Soy yo otra vez,

Ya he conseguido que funcione. Está muy bien.

MMy MMy
Como lo has conseguido?
Alfredo Alfredo

Riendo ¡Eureka! conseguí que funcione este script, aún me falta aprolijarlo un poco pero copia bien los archivos enviados al temp. No es tan fácil para explicarlo aquí ya que faltan unas cuantas líneas en diversas partes Después cuando este pronto les paso un enlace.

PARA ALFREDO PARA ALFREDO
A MI NO ME HACE EL LENGTH
Alfredo Alfredo

Entiendo por "length" tal vez la barra de progreso, eso puede ser porque estas ejecutando "upload.php" desde un directiorio sin ser el raíz.. entonces necesitas en el "<form" de este archivo colocar en la parte de action: action="/cgi-bin .... una barra inclinada para decirle que esta desde el raíz. Me atraso un poco en mandar la solución porque debo entregar un trabajo para el lunes 12. La solución si alguien quiere maltratarse un poco está bajando el megaupload y ver el archivo llamado upload2.php, entonces suben ese archivo también y en upload.php después de $("#ok_status").show(); colocan abajo:
self.location.href ='upload2.php?sid=<?=$sid?>';
esto redirije al upload2.php luego de subido el archivo pero antes deben sacar de ajax_upload.php las 4 líneas que hay como estas:
unlink(TEMP_DIR.$_REQUEST["sid"]."_signal");
ya que upload2.php toma esos archivos que se borran con unlink y estos archivos son muy importantes porque contienen la info de los archivos subidos para dividirlos del temp original creado al subir, luego si se quiere al final del upload2.php se pueden borrar con las líneas esas de unlink que eliminaron de archivo ajax. Recuerden que en upload2.php hay una línea que mueve los archivos...algo así:
rename($file['tmp_name'][$i], aquí_el_directorio_y_el_nuevo_nombre_del_archivo);
Pueden crear algo con ese bucle o el nombre original deberían sacarlo con un "explode" ya que sino da error c:\\directorio\\1.jpg por algo así, entonces con explode:
$archtemp=explode('\\',$file['tmp_name'][$i]);  
y agregan:
$cuento=count($archtemp);
    if ($cuento>0)
    { $archivo=$archtemp($cuento-1); }
    else
    $archivo=$archtemp;
    $archivo=str_replace(' ','_',$archivo);
medio rebuscando... aun no lo probe. Espero que alguien de esta forma pueda hacerlo andar, de lo contrario hay que esperar hasta que me vea libre... de mis responsabilidades... ¡suerte!

Alfredo Alfredo

¡Me aburrí!, me tome un tiempito y lo modifiqué, en cada archivo puse un comentario así es más fácil que ande. El enlace demora unos segundos para permitir la descarga, luego aparece:Click here to download file.
http://www.mysharefile.com/v/f4rwrn0b/upload_ajax.zip.html
Los créditos son para Albert García, claro está, lo mío es solo un retoquesito.

Alfredo Alfredo

Cuidado, acá mando otra vez el archivo zip, ya que el anterior dentro de upload2.php no tenía los unlink para eliminar los archivos temporales una vez subidos, ahora los borra. Aquí el archivo modificado:
http://www.mysharefile.com/v/1230849/upload_ajax_2.zip.html
Eso es todo, espero que ande bien, luego sería una buena idea renombrar el archivo upload.cgi por un nombre raro tipo up_ajax_pro.cgi y en upload.php luego cambiar el <form... con el nuevo nombre por un tema de seguridad... me puse paranoico.

En efecto, como habían comentado por ahí arriba, el script estaba incompleto, puesto que sólo controlaba la carga del archivo, no trataba los archivos subidos, ni los copiaba a ninguna parte. Esto fué debido a que usé como modelo el propio experimento que usaba en esta misma web, donde simplemente realizo el control de upload, para luego eliminar los archivos de control ( _qstring, _flenght, _signal... ), y dejar los archivos subidos en el temporal, donde son eliminados periódicamente.

 Para conseguir la completa funcionalidad del script basta con añadir un print "location:%url_del_script%" al final del CGI, especificando el URL del script que tratará el upload, como si de un upload simple de PHP se tratara. He modificado el script subido para incorporar este cambio.

Recordad, como también os han apuntado por ahí arriba, que es importante que tengáis en cuenta las rutas a los archivos ( relativas, absolutas... )cuando configuréis los scripts.

Aclaración: los archivos *_qstring, *_flenght, *_signal... SÍ deben borrarse al finalizar el upload, puesto que sólo sirven para que el control AJAX pueda ir midiendo el progreso de la carga. No son realmente los archivos subidos, si no los datos en bruto del envío POST.

Un saludo y disculpad la demora. ;) 

Delia Delia
Muy bueno el script felicidades.... de Cbba-Bolivia
g0nzo g0nzo
Hola! I've got (hopefully) small problem with this script. After clicking on SEND button i get progress bar, but nothing happens. It continously sends POST data to ajax_process.php, but there's no response. In apache error log i get: "Premature end of script headers: /home/user/public_html/ajax_upload_test/cgi-bin". What does it mean? Maybe i have something wrong with permissions, but i've set 755 everywhere and it still doesn't work.

Hi g0nzo!

Are you sure that your Apache's config allow cgi-script execution in the folder that contains upload.cgi?

Take a look at http://httpd.apache.org/docs/2.0/howto/cgi.html

I hope this help you.

Regards!

g0nzo g0nzo
Thanks! Finally i fixed the progress bar (however i don't know really how :) ). 2 question though: - to save uploaded files can i use something like this: foreach($_FILES as $file) { move_uploaded_file($file['tmp_name'], $file['name']); }? It doesn't work, that's why i'm asking :) I'm not php programmer, i'm doing it for my friend and he wants me to show him "complete" solution... - can it work with thickbox? i mean non-thickbox version is working (at least the progress bar :)) and thickbox version is not. there's exactly the same problem i had before with the progress bar... Cheers, g0nzo
ricbax ricbax
This script is great and I have manipulated it to upload files. The only problem is that this upload progress bar is great for small files only. It seems anything over 15MB and the upload.cgi times out. Any suggestions on why this is timing out?  TIA Riendo
estimado amigo , esta muy interesante su codigo , pero no tendras cuando subes esta smultiples imagenes te pueda cortar en pequeñas imagenes, y asu ves mantengan las originales en su tamaño. atte. Gracias por tu respuesta Riendo
karina karina

Hola a todos Necesito un favor Llorando

Necesito hacer que varios usuarios puedan subir y bajar archivos por ejemplo de imagenes desde una web, es decir que un usuario "x" suba un archivo 1.jpg y que otro usuario "Z" le guste ese archivo y lo baje, es decir una carpeta en  donde se puedan alojar archivos de imagenes, que esten al acceso de los usuarios, que puedan subir y bajarlos cuando quieran, buscarlos, etc... Avergonzado

Por favor si alguien me puede dar una mano en esto.... si me pueden pasar los script, un ejemplo, se los agradecería mucho...

saludos Karina

Hola Karina, me encuentro en tu misma situación y tengo varias dudas:

1- Para que funcione AJAX es necesario instalar algún interprete en el servidor? Tengo entendido que se basa en JavaScript, por lo que no lo tengo muy claro.

2- El megaupload funciona sin AJAX?

3- Si AJAX es obligatorio, conocen algún otro fichero PHP, Perl, JS o HTM para subir archivos a un servidor? No es imprescindible que muestre la barra de progreso.

4- Supone algún riesgo para el servidor el uso de su script? Me gustaria limitar por ejemplo el tamaño y las extensiones para los ficheros que se suban al servidor. Las extensiones se pueden configurar fácilmente en la página upload.php pero no se si esto es suficiente o si hay que modificar algún documento más.

Nada más por mi parte, muchísimas gracias por compartir su trabajo y por su ayuda. Un cordial saludo.

Miguel Miguel

Alfredo,

No consigo que funcione tu ejemplo.

Los 4 archivos temporales que se copin en tmp_upload se generan correctamente, pero despues no soy capaz de copiar el archivo al directorio definitivo.

 Me podrías ayudar?

Gracias

Dante Dante
muy bueno exelente !!

Hola, estuve viendo el script y funciona muy bien sólo que algunas veces el script genera un error de permisos entre el CGI y el PHP ya que el php muchas veces no puede acceder directamente a la carpeta de temporales si no ha sido el mismo script quien lo hacreado. Estuve intentando mover los archivos desde perl pero mis conocimentos en perl son pocos.

Quisiera preguntar si alguien sabe como se interpreta el siguiente comando que existe en el javasscript

 $("#Submit").set("disabled","disabled"); (realmente no se que es el $('#elemento'). blabla).

Desde ya muchas gracias y el script funciona de maravillas.

Saludos 

Mi problema es que le doy a subir pero mirad lo que pasa la direcon es esta http://62.43.32.202/prueba/upload.php.
Dde y muchas gracias Saludos a todos
Alfredo Alfredo

Miguel, no sé cual es tu problema al copiar los archivos al nuevo dir, o que error te genera el código.
Joel, tal vez sería bueno que pruebes el script desde un hosting linux real.
Enrique, eso es para habilitar o deshabilitar el botón de subida cuando por lo menos tenés un archivo ya seleccionado.
Karina, eso que pedís al igual que alguien que dijo por allí de subir fotos y al mismo tiempo crear una miniatura es bastante complejo y al mismo tiempo muy personalizado a cada proyecto, se hace imposible desde aquí informar algo así.

Me aconsejas alguno alfredo que sea gratuito es solo para probarlo y modificarlo es que yo mas adelante en septiembre comprare uno en Aruba pero mientras tanto quiero crear todo el sistema.
Joel Joel
Mira consegui este dominio pero el script sigue sin ir http://joelpace.mundoserver.org/prueba/upload.php
Trystan4861 Trystan4861

Enrique, esto es para ti:

$("#Submit").set("disabled","disabled");

eso es una sentencia creada a partir de la librería jquery que en su nueva versión beta sería <<jQuery("#Submit").set("disabled","disabled"); >> pero seguirá siendo funcional la forma que nos presentas.

 Paso a explicartelo

$() es una funcion que nos devuelve un array de objetos que cumplan una serie de requisitos, los requisitos son los que se encuentran dentro de los (), por ejemplo #Submit que indica todos los objetos que tengan como id "Submit", si se hubiese puesto ".Submit" habrían sido todos los elementos con la clase css "Submit", o si se quisiese indicar todos los input del tipo submit: 'input[@type="submit"]'

el .set es otra función, sí como lees, es que jQuery implementa la concatenación de funciones y se pueden usar funciones sobre los objetos devueltos por las anteriores funciones.

.set lo que hace es establecer un parámetro o atributo de objeto a lo que se le diga, es decir, .set("disabled","disabled") establece el parametro disabled a disabled, sería como tener esto:

<input type="submit" id="Submit" value="Enviar">

y tras interpretarse el javascript quedase algo como

<input type="submit" id="Submit" value="Enviar" disabled="disabled">

Para aprender mas de jQuery te aconsejo que te documentes tanto en la pagina oficial como en tantas otras que hay sobre la librería.

Un saludo

Miguel Miguel

Alfredo gracias por responder.

 El problema es que en tu ejemplo aparece una carpeta "uploads" donde se supone que el script upload2.php debería copiar el archivo, borrando a su vez los temporales creados. A mi me borra los temporales perfectamente, pero en la carpeta uploads no se copia nada (por supuesto tengo permiso 777 para esa carpeta).

Un saludo

Muy bueno tu codigo man, pero tengo un pequeño problemita ... y es que yo lo que necesito es poder subir un zip, modifico la funcion javascript que verifica la extension y deja de funcionar .... te pego el codigo:

if ( false != elem )
        {
            filepath = elem.value.split("\\");
            filename = filepath[filepath.length-1];
            extensionpath = filename.split(".");
            extension = extensionpath[extensionpath.length-1];
             /*if( !extension.match(/(jpg)|(jpeg)/) )
            {
                alert ( "Sólo se permite subir imágenes: jpg." );
                return false;
            }*/
            $(elem).hide();
            $("#file_list").append("<li style='display:none'>&bull; "+filename+" <a xhref='javascript:;' onclick='delFile(this,"+($("#file_list li").size()+1)+")' style='color:red'>[x]</small></a></li>\n");
            $("#file_list li:last").slideDown("slow");
        }

Espero que alguien me pueda ayudar, muchas gracias ^^

Sonia Sonia

Hola, me parece super bueno este script. Lo que pasa es que yo voy un poco pez en esto Triste y me gustaria saber dos cosillas.

1. se puede ejecutar este script en cualquier ordendor? no es necesario tener linux, verdad?

2. Hay que configurar algún parámetro o algo? es que no me funciona, aparece la barra de estado de la descarga, pero ya esta, no se completa ni nada.

Os agradezco un montón la ayuda.

Juanra Juanra

Hola a todos, ante todo enhorabuena por la aplicacion es muy interesante. yo he estado dandole vueltas , y mi problema es que no se donde se alojan los archivos... dado que solo se fragmentan en el temporal y despues, se borran con el unlink...pero, no consigo saber donde se suben , es mas no consigo saber que lineas tocar para poder cambiar el directorio donde se suban los archivos.

Para aquellos que solo vean la barra de descarga pero esta no se inicie, probad a desabilitar cualquier antivirus o firewall que tengais, basicamente por que AJAX utiliza puertos que podeis tener cerrado.

Un saludo

Ya solucione el error era que el script cgi en concreto no tenia 755 ahora me va de perla lo modificare un poco par ael sistema que estoy haciendo muchas gracias.
Yiyo Yiyo

Hola gente, me parece muy bueno el script pero no logro probarlo en mi hosting. La barra de progreso no avanza... El cgi tiene permisos 755 el temp dir creo haberlo puesto bien /home/.../public_html/tmp_upload pero no doy con mi error... Si alguien me puede orientar se lo agradeceria ya que necesitaría algo asi. Luego si puedo correrlo en mi hosting necesitaré que me aclaren otras dudas.

Gracias

Miguel Miguel

Alfredo, tengo una duda

En el archivo upload2.php aparece la siguiente línea

rename($file['tmp_name'][$i], 'uploads/'.$archivo);

La variable $file['tmp_name'][$i], se supone que es donde se ha copiado el archivo "temporalmente", que supongo será el directorio temporal del servidor (distinto a /tmp_upload que es donde se copian los temporales postdata,flength,signal,qstring).

Suponiendo que esto que digo es cierto, como copio el archivo temporal al directorio uploads, ya que diche línea parece no hacer nada.

rename($file['tmp_name'][$i], 'uploads/'.$archivo);

Saludos

Alfredo Alfredo

Miguel, vi tu ejemplo en el server y creo que funciona bien, al menos no hay mensajes de error.

vicman vicman

Hola, primero k todo muchas gracias, se ve muy interesante y util este sistema.

Quisiera preguntarte si tambien funciona con ASP o solo contiene comandos para PHP.

 Gracias

Esta weno el script pero no me funciona
digame si he cometido algun error
http://musica.erostlv.com/upload.php

Ariel Ariel

Hola, como muchos en este blog tengo el problema de que la progress bar no se mueve y el file upload no se realiza. Existe un zip que contenga la version final para poder usar tal como se demuestra en http://www.obolog.com/upload.php ?

Muchas gracias por su tiempo y agradezco su ayuda 

jasdevildeil85 jasdevildeil85

ey yo tengo el play y nesesito que me digan si al play le puedo poner dvds gravados mil piratas por favor poner noticia aqui

Miguel Miguel

Ariel, estoy en tu misma situación aunque yo he conseguido que se mueva la progress bar no consigo que el archivo se copie al directorio.

 Si pudieran tener la versión final sería de gran ayuda. Gracias a todos por hacer esto posible.

MIGUEL, yo al contrario tuyo he logrado subir el archivo, pero no hacer correr la progress bar. Enviame un correo con lo que hiciste tu, yo me encargo de arreglar lo que me falta y publicar el codigo en mi server para que lo bajen los demas.

Mi msn, arrobared@hotmail.com

PD: Gracias Obokaman por tu ayuda!

Miguel Miguel

Hola a todos/as

¿ Alguien sabe como se puede limitar el tamaño máximo del archivo? Efectivamente el upload.cgi tiene una variable con la que se limita, pero al ejecutar el script no aparece ningún mensaje de alerta y aparece continuamente "cargando..."

 Más concretamente la funcion bye_bye no parece hacer nada.

Un saludo

Al fin, puedo ejecutar el script, pero no en mi hosting. En mi hosting el log de errores me arroja:

[22-Aug-2006 14:15:35] PHP Fatal error: Cannot redeclare class xmlwriter in /home/cristali/public_html/xml.class.php on line 61

 

Esta todo igual en los dos hosting, los permisos, los path de acceso, pero no logro que en mi hosting se ejecute el script, se suben los archivos a la carpeta tmp, pero ahí quedan.

 

Espero que alguien me pueda orientar porque en un host puedo ejecutarlo y en el mió no.

 

Gracias.

Hola Felipe,

 posiblemente no puedas ejecutarlo por la versión de PHP que está corriendo. Creo que el nombre de la clase XMLwriter entra en conflicto con alguna función reservada de PHP5. Prueba a cambiar el nombre a la clase, tanto en su definición como en todos los lugares donde se instancie, y debería funcionarte correctamente. Cambiale el nombre a, por ejemplo, XMLPusher, y me cuentas.

Un saludo! 

EXCELENTE!!!

Gracias compadre, me funco a la perfección.

Bueno, no me queda nada mas que agradecer y dejo mi email por si alguien tiene problemas.

Saludos desde CHILE

Hola, me ha gustado muchísimo el script, pero no consigo hacerlo funcionar...he cambiado las rutas a la carpeta temp, y parece que el script falla porque no se llegan a crear los archivos _signal y _signal. La carpeta temporal es una que he creado en la carpeta 'public_html' con chmod 777. Entonces, he modificado esto:

# upload.cgi

# variable values. This folder will host the raw post data during the upload.
$tmp_dir="/home/s0285021/public_html/tmp/";

# ajaxprocess.php (Lo he dejado igual, y he comprobado que las rutas son las mismas en los 2 archivos)

// Put here the same folder that in CGI
define ( "TEMP_DIR", $_SERVER['DOCUMENT_ROOT']."/tmp/" );
//---------------->

El problema es que en la carpeta temporal solo se crean 2 archivos, y parece que por eso nunca termina la barra de progreso. Llega hasta el final pero no pone Carga finalizada con éxito!...

¿Alguien que me ayude?  Llorando

Félix, supongo que le diste al upload.cgi permisos 755.
Y para mas seguridad, reemplaza la linea 41 por:
$tmp_dir=$ENV{'DOCUMENT_ROOT'} . '/tmp/';

Lo otro es fijarte si no tienes conflicto con la clase XMLwriter.

Pero por lo menos con los datos anteriores deberia crearte los archivos temporales en la carpeta TMP.

Salu2.

Emilio Emilio

Hola buenas, tengo un problema y es que los archivos temporales se crean bien (los 4), pero a la hora de llevar el temporal a la capeta destino no lo consigo. He estado probando hacerlo desde el CGI o desde el upload2 como han dicho por ahi arriba pero no me hace nada. Si alguien de a los que les va me puden poner este paso o explicarlo como hacerlo se lo agradeceria mucho.

Un saludo. 

Very interesting!

http://www.mysharefile.com/v/1230849/upload_ajax_2.zip.html seems to be broken though :( Anywhere else I can get it? Thanks!

Fran Fran
Estimados Amigos:

            Estoy tratando de poner en funcionamiento el script y no logro hacerlo. Tengo un sistema win2000 y he instalado easyPhp para trabajar con mis páginas php. Como indican en el blog, he cambiado las rutas tanto en el upload.php y en el upload.cgi, pero no me carga los ficheros en mi carpeta tmp (no se mueve la barra de progreso, ni me muestra información de lo que está subiendo).

            ¿que puedo hacer? ¿serían tan amables de ayudarme? por favor.

           Muchas gracias por todo.


Hola,  he hecho lo que me has dicho Felipe, pero creo que la he fastidiao...ahora no me crea ningún archivo y la barra no s carga. Pone cargando pero no pasa nada. Soy un negao para esto del AJAX...mira que llevo tiempo intentandolo y no lo consigo...:@

Salu2 y ayuda por favor...Llorando

PD: siento no haber contestado antes pero no he estado en casa. 

Ya lo consegui!! Bueno muchas gracias, ya esta hecho. El problema eran los atributos de la carpeta temp. Ahora lo que pasa es que me gustaría que los archivos que subo se movieran a una carpeta en concreto, pero no se como hacerlo. Supongo que sera con move_upload_files, pero como tengo 4 archivos en temp, no se como juntarlos en uno solo que sea el correcto.

 ¿Alguién sabe cómo hacerlo?

Salu2 y gracias! 

Santiago Santiago

Hola me urge que me ayuden porfavor tengo el siguiente problma
http://www.santiagomenas.u13.biz/upload.php 
No empieza a funcionar la barra y no sube los archivos el cgi-bin el archivo y carpeta tien permision 777 y el de img tiene tambien 777
Por favor ayudenme me urge quien pueda contactarme para ayudarme y hacerlo funciónar que me agrege smenasolis@gmail.com Muchas gracias y hasta Luego

Oscar Oscar
Me pasa lo mismo que a Santiago. Vale para PHP 4.x ? o se necesita PHP5?
Hola chicos,

funciona tanto con PHP4.X como con PHP5. El problema pueden seguir siendo  los permisos de ejecución del script CGI. Recordad que no sólo es necesario darle permisos correctos al archivo, sino, además, configurar Apache para permitir la ejecución de CGIs dentro de la carpeta donde se encuentre el script. 

Os recomiendo echar un vistazo a la página de Apache, donde encontraréis más información acerca de cómo aseguraros que la configuración es la correcta.

Oscar Oscar

El servidor es dedicado y configurado de serie por el proveedor de hosting y he visto que tiene habilitado el tema de los cgi. He probado a copiar el cgi al directorio de scripts y he modificado el upload.php par que apunte a dicha ruta, pero nada.

Alguna forma de saber si realmente funcionan los scripts en cgi? 

Oscar Oscar

Creo que es de los cgi. Me he descargado un cgi que escrbie hola y el navegador no lo ejecuta, sino que visualiza como un texto.

 Lo he ejecutado en consola y me indica que no encuentra /usr/local/bin/perl , cuando la ruta del perl es /usr/bin/perl 

 ¿Alguna idea dodne configuro eso? (Fedora core 3)

Hola de nuevo, Oscar,

en el enlace que he puesto antes a los tutoriales de Apache ( http://httpd.apache.org/docs/1.3/howto/cgi.html ), encontrarás información sobre cómo comprobar que el directorio donde se encuentra el script CGI tiene o no habilitada la ejecución de este tipo de scripts. Verás que incluso vienen recomendaciones y ejemplos de scripts sencillos para comprobar el correcto funcionamiento. 

He bajado el script completo ajax_upload.zip, el tema es el sig. 1) A donde apuntan los archivos que deseo bajar 2) Probe subir un archivo pero demora bastante y no veo el archivo quese haya subido correctamente, como tampoco me da el ok como lo hace en la prueba que esta en el link muchas gracias y perdon, soy extremadamente NOVATO en esto Atte Raul Lovato ralsuscri@fibertel.com.ar Argentina

Interesante script!!

necesitas instalar algo en tu server para que funcione? 

El archivo http://www.mysharefile.com/v/1230849/upload_ajax_2.zip.html ya ho está disponible. ¿Alguien puede subirlo de nuevo?. Gracias.

Simplemente, cojonudo. Va muy bien. Asias.

 Chulo

Jesus Jesus

hola, he bajado el script.. y no lo puedo hacer correr, es necesario el apache y el pearl?? gracias

Jose Felix Jose Felix
Lo mejor que he visto hasta el momento,,, tanto el diseño como la funcionabilidad es excelente

hola tengo el script andando, me crea los temporales, anda la barra, peor lo que no logro es copiar el tmp a la carpeta final, probe con rename, y con move_upload_file, pero en ambos casos me dice que el archivo no fue encontrado (el temporal del php)... 

 el upload2 donde esta eso armado que subio alfredo ya no esta disponible por lo que no puedo ver como lo hace.. alguien que me ayuude o ponga online denuevo el archivo de afredo... desde ya mcuhas gracias

ya logre que me funcione en linux, pero quisiera que me funcione en windows tambien, el tema es que la funcion rename no me encuentra el archivo temporal subido... que puedo hacer? alguien lo hizo andar en wndiws?
Zully Zully

Hola, me gustaria saber si alguien tiene el archivo "final" de este script... esta muy bueno y me gustaria tenerlo para probarlo Sonriente

 Si alguien lo tiene me lo puede enviar por mail?? zully.chumpitaz@gmail.com Gracias. Sonriente

114v 114v

Can you make with only php (not CGI)

 Thanks 

Hola, me encanta el script pero no consigo que rule.

A ver, tengo en el servidor PHP 4 con Apache, he visto que se necesita configurar el apache para permitir ejecutar CGI y que además se debe especificar la carpeta que lo ejecuta.

En primer lugar me gustaría saber si alguien me puede explicar como hacer esto pero en español porfa!.

Luego otra cosa: No he entendido bien donde debo colocar los archivos.

Me gustaría si alguien es tan amable de decirme donde colocar cada uno de ellos puesto que en mi cuenta solo tengo una carpeta que se llama cgi-bin y nada más, ni temp ni nada y quería saber si tengo que crearlas yo o que.

Muchas gracias de antemano a la gente que me ayude porque he visto que sois todos unos fieras.

 

Alex Alex
Muy, pero muy bueno, te luciste!!! Burla

HOla a Todos!

Hay algunas cosas que me han pasado al intentar hacer correr este script y que quizas puedan ser de ayuda para muchos.

Una de las cosas que más me complicó , fue el tema de que mi servidor no me dejaba acceso a la carpeta en que subía los archivos el perl, por lo que no podía de ninguna manera a mover los archivos a la carpeta final. A esto lo pude solucionar subiendo los archivos desde el perl directamente a la carpeta donde el php tiene acceso y de alli si moverlo al archiv final (habrá luego que borrar estos archivos temporales que crea el perl y borrar también de vez en cuando los archivos temporales que no fueron completados). VER

use File::Temp qw/ tempfile tempdir /;

$dir = tempdir( CLEANUP => 1 );
($fh, $filename) = tempfile( DIR => $dir );

($fh, $filename) = tempfile( $template, DIR => $dir);
($fh, $filename) = tempfile( $template, SUFFIX => '.dat');

$fh = tempfile();Otra cosa que me tuvo un poco loco es el tema de los permisos del .htaccess que en algunos servidores hay que poner en este .htaccess dentro de la carpeta cgi-bin
<FilesMatch "(upload.cgi)">
SecFilterEngine Off
</FilesMatch>
No olviden ponerle al archivo upload.cgi permiso 0755 que si no no funcionará .
Bueno , espero que sirva el aporte.
Yo lo he adaptado para que funcione con sajax y anda muy bien pero no es grande la variación. si alguien lo requiere solo haganme el pedido que trataré de subirlo. 
 

 

Buenas, no funciona este enlace:

http://www.mysharefile.com/v/1230849/upload_ajax_2.zip.html

Si alguien es tan amable de volver a subir el zip a algún otro sitio o mandarmelo al email les estaré muy agradecido.

Gracias, saludos.

Pongo mi email, que veo que no aparece en el post de más arriba: david(arroba)davidsantiago.net

Gracias

TeLiX TeLiX

Enrique la explicacion que has dado serviria de ayuda si dijeras en que parte del cgi hay que poner eso xD

Llevaba buscando siglos algo asi y por fin lo he encontrado. Lo unico que faltan bastantes explicaciones del proceso y los archivos no estan corregidos. Aun asi me he quedado donde muchos otros, se suben los archivos a la carpeta temporal, la barra se mueve pero desaparecen los archivos y no se como moverlos al destino final.

Si alguien lo puede explicar un poco mejor se lo agradeceria :D

phatscum phatscum

Can someone please email (phatscum()gmail.com)me the updated version of this fine script?

Thanks in advance :)

Maria Maria

SaludosEnfadado :

Vi su demo y esta muy bonito , me encantaria poder implementarlo en mi web pero al momento de extraerlo del zip me sale un archivo sin extension  y no puedo utilizarlo , porfavor quisiera que me digan como puedo utilizar este archivo ,les agradezco de antemano su ayuda , es muy urgente sino me mueroBeso.

cariños y besos

Raul Raul

   Pues lo que todo el mundo pregunta... ¿Dónde podríamos encontrar el upload2.php? No consigo que el php me copie los archivos realmente...

   Gracias!
 

TeLiX TeLiX

Se me olvido pasar por aqui para contar como me fue. Estuve investigando y encontre la solución, lo siento pero no recuerdo en donde :(

Para que copie los archivos solo hay que modificar la parte encargada de acabar la subida en el ajax_process.php

Lo que esta en negrita es lo que he añadido 

case "upload_finish" :
        $xml = new XmlWriter();
        $xml->push('response');
       
        //if download is finished, we delete the temp raw post data file & additional ones
        if ( file_exists(TEMP_DIR.$_REQUEST["sid"]."_signal") )
        {
            $qstr = join("",file("tmp/{$sid}_qstring"));
            parse_str($qstr);
            $k = count($file['name']);
            for($i=0 ; $i < $k ; $i++)
                rename($file['tmp_name'][$i], "ruta_donde_quieres_dejar_el_archivo/".$file['name'][$i]);

            unlink(TEMP_DIR.$_REQUEST["sid"]."_signal");
            unlink(TEMP_DIR.$_REQUEST["sid"]."_qstring");
            unlink(TEMP_DIR.$_REQUEST["sid"]."_flength");
            unlink(TEMP_DIR.$_REQUEST["sid"]."_postdata");
            $xml->element('status', 'ok');
        }
        else    //or return KO status if it doesn't exists
            $xml->element('status', 'ko');
           
        $xml->pop();
        print $xml->getXml();   
       
       
    break;

Bryan Bryan

I think your solution is incredible and I am excited to implement it.  However, when I download the zip file, it was a corrupt file.  Can you repost the files?  Or is there somewhere else I can download it?

Thanks

Jose Manuel Jose Manuel

Saludos, ... Hermano intente descargar el archivo y el mismo se encuentra corrupto, como podria descargarlo de manera segura?

   De antemano mil gracias...!

ed ed

Ok, I have go it working (almost) with a PHP file handling the files after they are uploaded. The trouble is I need the upload.cgi script to upload the files with owner nobody.nobody.

I have tried adding:

chmod 0777, @tmp_filenames;

chown nobody.nobody, @tmp_filenames; 

but the chown doesn't work. Any ideas...

 

En Español

Todo esta functionando, menos la parte que he añadido que mueve el archivo descargado do /tmp a /mi/directorio/final

la razon es que uploads.cgi descarga los archivos a otro usuario envede de nobody.nobody

he intentado añadir  chown nobody.nobody, @tmp_filenames; a uploads.cgi pero no functiona - alguin tiene ideas?

Franz Franz

Hola, se ve que el script funciona de maravilla, pero no he podido bajar el codigo, el zip esta corrupto y en los otros links que encontre en los post estan rotos. Por fa si alguien tiene un link o los script se los agradeceria mucho !

 SALUDOS !

 

Ed Ed

In the end, it was PERL that did not have permission to change the owner or the group of the uploaded files. This meant that PHP could not move / rename or do anything with them.

In the end, my web host disabled suexec from my server, which enabled PERL to create files with 'nobody' as the default group and owner. The script now works.

I have also added some commented code for handling the files after they have been uploaded in ajax_process.php

 

En Espanol

Al final fue PERL que no tenia permiso para cambiar el chown y chgrp del archivo que creo. La solucion fue pedir a mi web host remover 'suexec' - y asi PERL crea los archivos con chown y chgrp a 'nobody'. Ahora, PHP puede mover los imagenes.

Tambien he modificado el codigo en la pagina 'ajax_process.php' para mover a los archivos.

http://pastebin.com/858913 

Fran Fran

no he conseguido bajar el archivo zip!!

¿podias arreglarlo? por favor.

Muchas gracias.

Bryan Bryan

I have this script working about half way and i need some advice from you guys.  I can upload a file, and the 4 files go into the tmp folder.  The progress bar does display but the file size and countdown do not appear.  But when the upload is "complete" it says "upload success".  Why doesnt the countdown appear?  Lastly, the files never get moved out of the tmp folder?  How do i get the tmp files to delete and actually have a useful file on the server?  Perhaps i missed some of this because i am not fluent in spanish.  If anyone can help it would be greatly appreciated. 

Bryan Bryan
i figured out what my problem was.  I did not have the proper permissions set on my tmp folder.  However, I am still missing something.  The 4 files in the tmp folder now get deleted, but i dont have the actual file on the server.  Can someone help me out in regards to what i am missing?
Unxky28 Unxky28

Alguien pordria subir de nuevo el fichero:

http://www.mysharefile.com/v/1230849/upload_ajax_2.zip.html

Ya no esta disponible....en otro servidor GraciasChulo
Juan Juan

Que paso el

Ejemplo en vivo

Podéis ver un ejemplo real en la URL http://www.obolog.com/upload.php

 Llorando Llorando Llorando Llorando Llorando Llorando NO FUNCIONA Llorando Llorando  Llorando Llorando  Llorando Llorando 

Me he bajado el script y no consigo que funcione.. sale la barra de progreso con el "Cargando" pero no hace nada.. y en la demo de ésta web tampoco funciona.. ¿Que ocurre?

P.D. Gracias por el script..tiene muy buena pinta 

Hola, a mi tampoco me funciona, sería de agradecer que el link que no funciona solucionara y si alguien lo tiene, que me lo pase y yo mismo lo colgare.

Un saludo  y gracias
Enlace recibido desde trydobe » Blog Archive » A ...
[...]}#headerimg h1 a, #headerimg h1 a:visited, #headerimg .description { color: #1F1F3F; }trydobeNeedle in the HayA PHP Upload with Status bar solution.Here is a PHP Upload with Status bar.View an ExampleBACKGROUND: When uploading large files to a website using a browser, the lack of an upload progress bar can be the reason that somebody might just quit using your site. The user shouldn’t have to be thinking, “How long do I have to wait? Is it even uploading?” When I decided to implement a an upload status bar for a PHP site, I thought it would be as easy as browsing for an already built utility and simply adding it to the site. I was discouraged to find out that PHP had no native support for gathering statistics on the file while in the process of being uploaded. After some research, I found that there are really only a two options to achieve an actual readout of file progress. Like many soluti[...]
Enlace recibido desde trydobe » Blog Archive » A ...
[...]center; }#headerimg h1 a, #headerimg h1 a:visited, #headerimg .description { color: #1F1F3F; }trydobeby Jeremy DillA PHP Upload with Status bar solution.Here is a PHP Upload with Status bar.View an ExampleBACKGROUND: When uploading large files to a website using a browser, the lack of an upload progress bar can be the reason that somebody might just quit using your site. The user shouldn’t have to be thinking, “How long do I have to wait? Is it even uploading?” When I decided to implement a an upload status bar for a PHP site, I thought it would be as easy as browsing for an already built utility and simply adding it to the site. I was discouraged to find out that PHP had no native support for gathering statistics on the file while in the process of being uploaded. After some research, I found that there are really only a two options to ach[...]
xavier xavier
el script no fuiona ayudame porfa

Tu ejemplo en vivo no me funciona! no se que pasa, estoy navegando con mozilla 2.0.06.

 

Al hacer el upload no pasa nada, solo sale la animacion AJAX y aqui se queda pegado. 

javier javier
mira el ejemplo esta bien pero cuando  envio el archivo me manda al cgi pero como hago par q vaya a la pagina que yo quiero...no se si me ntiendes 


  <form id="file_upload" enctype="multipart/form-data" action="cgi-bin/upload.cgi?sid=<? echo $sid; 
Pero pa mierda sirve este script que puso el webmaster, o por lo menos no en firefox.  Se queda pegado y nunca sube el archivo..
Enlace recibido desde PHP CookBook: MyPHPTube.com ...
[...]m/megaupload/" target="_blank" title="http://www.raditha.com/megaupload/" rel="nofollow">http://www.raditha.com/megaupload/ http://www.obokaman.com/p/descripcion-y-fuentes-del-upload-php-ajax-con-barra-de-progreso-1596 http://labs.beffa.org/w2box/demo/[...]
Miguel Miguel
Alguien ha podido instalarlo sobre windows?

Por favor,  solicito ayuda.
Enlace recibido desde PHP CookBook: MyPHPTube.com ...
[...]m/megaupload/" target="_blank" title="http://www.raditha.com/megaupload/" rel="nofollow">http://www.raditha.com/megaupload/ http://www.obokaman.com/p/descripcion-y-fuentes-del-upload-php-ajax-con-barra-de-progreso-1596 http://labs.beffa.org/w2box/demo/[...]