FTP Upload con PHP

Hoy les presentamos una guía de como implementar Upload de archivos por FTP utilizando PHP. Para ello nos hemos guiado de FTP Upload via cURL en donde esta muy bien explicado.

Que necesitamos?
cURL es una librería PHP muy potente la cual permite enviar y recibir archivos por diferentes protocolos (HTTP, FTP), además soporte envío de datos por POST o GET, incluso permite autenticarse en servidores remotos. Entonces utilizaremos cURL para conectarnos al nuestro FTP y haremos la transferencia del archivo seleccionado.

Creando el Formulario
Lo primero es crear un formulario en donde seleccionaremos el archivo a subir, esto de la siguiente forma:

<form action="" method="post" enctype="multipart/form-data">
Seleccionar archivo: 
<input type="file" name="archivo"  />
<input type="submit" name="enviar" value="Upload" />
<input type="hidden" name="action" value="upload" />
</form>

Creando el Script
El siguiente paso es crear el php que se encargue de subir el archivo, primero verificamos que se haya seleccionado el archivo, luego creamos una variable cURL la cual asignamos con los valores que deseamos enviar y finalmente verificamos que se haya subido correctamente el archivo.

$rpta = "";
if ($_POST["action"] == "upload") {
	$tmpfile = $_FILES['archivo']['tmp_name'];
	$tmpname = $_FILES['archivo']['name'];
	
	$ftpuser = "usuario";
	$ftppass = "password";
	$ftppath = "ftp.dominio.com/path/";
	$ftpurl = "ftp://".$ftpuser.":".$ftppass."@".$ftppath;
	
	if ($tmpname != "") {
		$fp = fopen($tmpfile, 'r');
		$ch = curl_init();
		curl_setopt($ch, CURLOPT_URL, $ftpurl.$tmpname);
		curl_setopt($ch, CURLOPT_UPLOAD, 1);
		curl_setopt($ch, CURLOPT_INFILE, $fp);
		curl_setopt($ch, CURLOPT_INFILESIZE, filesize($tmpfile));
		curl_exec($ch);
		$error = curl_errno($ch);
		curl_close ($ch);
		if ($error == 0) {
			$rpta = 'Archivo subido correctamente.';
		} else {
			$rpta = 'Error al subir el archivo.';
		}
	} else {
		$rpta = 'Seleccionar un archivo.';
	}
}

Como puede ver no es muy complicado este tipo de implementación y tiene la ventaja que podemos enviar archivos mas grandes que con upload de forma normal. No he puesto una versión de este ejemplo funcionando pues quiero evitar que suban archivos no deseados. Finalmente les dejo los archivos fuente de este ejemplo en donde solo deben colocar el usuario, clave y dominio a donde desean subir.

Comentarios Total 33 comentarios

Arcadio
Publicado: 22/11/2007 8:33 am

tremendo ejemplo gracias

ISC: Salvador Carrasco Flores
Publicado: 22/11/2007 1:29 pm

gracias por el codigo de upload la verdad es que me sirvio de mucho estamos en contacto…

Augusto
Publicado: 28/11/2007 7:22 am

Luche y luche y no logre hacerlo funcionar. Me da error en el upload. Tengo acceso escritura el directorio donde se alojarian los archivos, tengo bien la ruta, usuario y password, etc. Alquien me puede ayudar?

unijimpe
Publicado: 28/11/2007 10:58 pm

Augusto fíjate bien a que carpeta estas subiendo. Ahora si lo que deseas es saber que error devuelve, puedes imprimir el error, esto es modificando el if de la forma:

if ($error == 0) {
$rpta = 'Archivo subido correctamente.';
} else {
echo "Error code: " . $error;
$rpta = 'Error al subir el archivo.';
}

Esto te imprimirá un numero que indica que error ha ocurrido, puedes ver la lista de códigos de errores en: cURL Error Codes

Joan Torrent
Publicado: 04/12/2007 5:27 am

Hola buenos días.

He probado el ejemplo y en principio me funciono correctamente con archivos pequeños. Pero utilizando archivo de más tamaño (5MB por ejemplo), me informa de un error «Internal Server Error».

¿Puede ser que el servidor que estoy utilizando tenga algún tipo de limitación a la hora de utilizar el ejemplo?

Muchas gracias. Espero que alguien me pueda ayudar.

Julio Soto
Publicado: 04/12/2007 2:07 pm

Que tal, por mas que intento no me funciona, no me pide el usuario y contraseña.

Hice lo que le dijiste a Augusto, y en error me sale esto: Error code: 10

¿Me pudieras ayudar?

Gracias,

Saludos.

D@NIEL
Publicado: 28/01/2008 10:55 am

Hola a todos, necesito ayuda con respecto a este ejemplo, porq lo ejecuto y me sale el siguiente error:

Method Not Allowed

The requested method PUT is not allowed for the URL /upload/license.txt.
Apache/2.2.6 (Unix) mod_ssl/2.2.6 OpenSSL/0.9.7a mod_bwlimited/1.4 mod_auth_passthrough/2.1 PHP/5.2.5 Server at http://www.tiburones.net Port 80

Porfa necesito ayuda de ustedes Gracias de antemano

Salvador carrasco flores
Publicado: 29/01/2008 2:47 pm

gracias nuevamente por el codigo de upload, la verdad es que a mi no me ha dado ningun tipo de problema…sugiero un debate en linea para compartit conocimientos de php..gracias
les dejo mi correo por si desean algo….
suerte….php

Luis Carlos Ortiz
Publicado: 26/02/2008 2:59 pm

Buenas Tardes, me parece muy interesante el contenido de la pagina, pero tengo un problema con el ftp unload, me sale el error el error numero «6» CURLE_COULDNT_RESOLVE_HOST,agradezco la ayuda de alguno de ustedes pues soy muy nuevo en esto…gracias…

Luiz
Publicado: 13/03/2008 6:11 pm

Me da Este Errooor!!!

Fatal error: Call to undefined function curl_init() in /home/virtual/sitio172322/www/ftpupload.php on line 14

dell6400
Publicado: 13/04/2008 7:36 pm

Debes verificar tu configuración del PHP en el PHP.ini

Saludos

lucio
Publicado: 19/05/2008 12:21 pm

Por favor, alguien me podria decir hasta cuantos megas puedo subir? Se que mi servidor no me deja subir desde una pagina php mas de 8 megas, pero quizás sea distinto desde con el codigo de ftp
gracias

miler
Publicado: 24/07/2008 4:07 pm

a mi si me funciona en un hosting pero cuando lo pongo a funcionar en otro host a la hora que le doy clik en upload con un archivo que pesa 20 megas se cae la web

erfsd
Publicado: 10/08/2008 8:45 pm

no se puede copiar el codigo!!

atxi
Publicado: 12/12/2008 2:55 am

Muy bueno, muchas gracias!

Miguel Coraggio
Publicado: 12/12/2008 11:40 am

me da el siguiente error
Fatal error: Call to undefined function: curl_init() in /var/www/bacigaluppi.com/htdocs/uploadftp/ftpupload.php on line 14

que debo hacer y donde…

Gracias… soy un principiante, de todas maneras en otros sitios que lo he provado ha funcionado correctamente.

Otra vez gracias.

unijimpe
Publicado: 12/12/2008 10:29 pm

Miguel, el mensaje esta indicando que no tienes habilitada la función curl en tu servidor, verifica que este habilitado o solicita que te lo activen a tu proveedor de hosting.

alberto
Publicado: 16/12/2008 4:41 am

Me da error de programacion.
error 500

Juan
Publicado: 22/04/2009 4:13 pm

Hola, ami me sale error: 67… y no me sube nada… que puede ser?

Gracias!

David
Publicado: 26/04/2009 4:40 pm

El error 67 puede darse porque el servidor remoto no tiene activo el puerto, o por permisos del usuario ftp, debes revisar este tema con el proveedor del servicio

Puyet
Publicado: 14/06/2009 1:32 am

muy buen aporte, funciona todo de maravilla, ojala puedan postear y si ya esta posteado indicarme como exportar de php a pdf

Que Ricas Recetas
Publicado: 17/06/2009 10:04 pm

Hola, puedo subir archivos chicos pero cuando intento subir archivos de más de 8MB me dice que subio correctamente pero en realidad no subio nada.
Habra alguna forma de subir archivos más grandes? O es necesario cambiar de servidor?

Muchas gracias.

eliaz_g16@msn.com
Publicado: 15/07/2009 5:08 am

Hola que tal, he usado este ejemplo de Flash Uploader, tengo una pregunta y ojalá puedas auxiliarme, sucede que solicito poner uno o varios campos de texto en el flash y que a la hora de hacer el envio en upload.php poder usar los campos ingresados
$titulo = $_POST[‘titulo’]
y así poder ingresarlo a una base de datos, no tengo mucho conocimiento respectoa action script, entonces quisiera saber de que manera puedo señalar el campo de titulo en el script
quizá la orden seria así…
titulo.text = text.name;
pero no sé en que parte estaría bien colocada

import flash.net.FileReference;

//Variables
var arrTypes:Array = new Array();
var objTypes:Object = new Object();
var listenerUpload:Object = new Object();
var fileUpload:FileReference = new FileReference();

//Tipos de archivos que se pueden subir (en este ejemplo, sólo imágenes)
objTypes.description = «Images (*.jpg, *.jpeg, *.gif, *.png, *.bmp)»;
objTypes.extension = «*.jpg; *.jpeg; *.gif; *.png; *.bmp»;
arrTypes.push(objTypes);

//Listeners
fileUpload.addListener(listenerUpload);

listenerUpload.onSelect = function(file) {
txtarchivo.text = file.name;
txtSize.text = file.size + » bytes»;
txtSizeup.text = «0 bytes»;
txtFin.text = «»;
barra.setProgress(0,file.size);
}

listenerUpload.onProgress = function(file, bytesLoaded, bytesTotal):Void {
txtSizeup.text = bytesLoaded + » bytes»;
barra.setProgress(bytesLoaded,file.size);
}

listenerUpload.onComplete = function(file:FileReference):Void {
txtFin.text = «—> ¡¡Archivo subido correctamente!!»;
}

btExplorar.onRelease = function() {
fileUpload.browse(arrTypes);
}

btEnviar.onRelease = function() {
fileUpload.upload(«upload.php»);
}

AGRADEZCO SU CONTESTACION

Daniel
Publicado: 06/11/2009 2:26 pm

El error se debe ala conexion ftp, es decir, cuando te conectas con una cuenta de ftp ¿Cual es la carpeta en donde inicia? regularmente es www o /public_html, y cuando quieran subir un archivo tienen que indicarle la ruta en donde inicia la conexion ftp y no en donde esta el archivo de subida .php

pablo
Publicado: 09/01/2010 2:04 pm

se puede recibir despues de hacer una subida, ir recibiendo los bytes subidos de un archivo hasta que este se suba completamente para poder hacer asi una barra de status del archivo?
Gracias ;)

Marina
Publicado: 08/05/2010 10:32 pm

Buenas. Tengo 2 preguntas:

1) Se puede hacer una barra de progreso del Upload?

2) Con archivos grandes (3 mb) no me funciona. El código del error es el 26: CURLE_READ_ERROR (26)

There was a problem reading a local file or an error returned by the read callback.

Cómo podría solucionarse?

Gracias!

Marina

Pedro J.
Publicado: 16/08/2010 10:22 am

Hola, por lo que he averiguado, el fichero que intenta enviar este código es el que está en $_FILES[‘archivo’][‘tmp_name’]. el problema es que al seleccionar en el form dicho fichero, si es demasiado grande, al servidor no le llegan los valores adecuados. Ni viene el nombre del fichero en el cliente, ni su tamaño, por lo que el servidor FTP aloca bien el fichero, le da nombre, informa que la trasferencia ha sido correcta, pero el nº de bytes escritos es 0, ya que las variables $_FILES[‘archivo’][‘tmp_name’], y filesize($_FILES[‘archivo’][‘tmp_name’]) devuelven, cadena vacía y 0 respectivemante.
Me temo que es un problema del php para recoger de un form ficheros grandes.
¿No hay ninguna forma de abrir el fichero directamente en el cliente que no sea javascript?¿La única opción es usar dicho Javascript?

Mauricio Moo Aguilar
Publicado: 13/12/2010 1:49 pm

Saludos:

Muchas gracias por la aportación. Tengo una duda…¿es posible subir archivos de un peso mayor o igual de 500 MB?. Definitivamente, la conexión a Internet juega un papel importantísimo, pero me gustaría saber si la clase usada con FTP nos lo permitirá.

Agradezco de antemano la atención

webcron
Publicado: 17/02/2012 7:41 pm

lo estoy probando con buenos resultados… lo tengo asociado a una cuenta de fileserve, y funciona muy bien.
Alguien sabe como agregarle una barra de progreso o un porcentaje de progreso o algun indicador?
saludos

Jossyl Zamora
Publicado: 31/05/2012 7:13 pm

antes que nada esta es unas de mis paginas GUIAS para un buen aprendizaje.

tengo el error code 9 a que se debe?
ademas tengo una duda en este codigo
$ftppath = «ftp.mipagina.com/path/»;

aqui le digo donde sera alojado los archivos??? otra cosa mas que tipo de archivos guarda??? de imagenes?

Gracias de ante mano

raynaud
Publicado: 22/11/2012 4:38 pm

saludso sabe alguien como enmarcarar el servidor, ya que por ejemplo subo el codigo a mi hosting y no funciona porque no conecta con el ftp pero si lo hago desde mi equipo de desarrollo si conecta en el servidor, alguien me podria asesorar?

Diego
Publicado: 19/02/2013 11:42 am

Hola tengo una problema soy nuevo en php y me marca este error, me pueden ayudar

Fatal error: Call to undefined function curl_init()

Dan
Publicado: 13/04/2014 5:16 pm

Lo primero es darte las gracias por ejemplo. Y ahora una pregunta. Dices que de esta forma puedes subir archivos más grandes que con un upload normal. Me interesa esta parte. Me gustaría que razonaras esa afirmación. Si para enviar el fichero por FTP lo coges de un archivo temporal, dicho archivo ha tenido que subirse al server de la forma tradicional, al enviar el formulario. Luego, lo mueves a un server FTP, pero no veo dónde está la ventaja, sinceramente. Otra cosa sería si el fichero se pudiera subir directamente por FTP (sin subirlo previamente al server web). Eso sí sería la caña, pero no es lo que hace este ejemplo.

 

Comentar

En este blog los comentarios están moderados, serán mostrados cuando el administrador los apruebe. Por favor, evita comentarios ofensivos u obscenos por que no serán aprobados.
Si deseas publicar código fuente debes hacerlo entre las etiquedas <code> y </code>, además debes reemplazar los carácteres < por &lt; y > por &gt;.

(Requerido)

(Requerido, no será publicado)

(Requerido)

(Tags aceptados: <a> <em> <strong> <code> <ul> <li>)