Foros del Web » Programando para Internet » PHP »

Subir archivos grandes con FTP

Estas en el tema de Subir archivos grandes con FTP en el foro de PHP en Foros del Web. Necesito que algunos usuarios suban archivos grandes (de más de 10 MB) al servidor, anduve buscando y encontré este Script: ftp.php Código PHP: <? # FUNCIONES FTP ...
  #1 (permalink)  
Antiguo 31/03/2005, 15:59
Avatar de cauly  
Fecha de Ingreso: febrero-2002
Ubicación: Buenos Aires
Mensajes: 726
Antigüedad: 22 años, 1 mes
Puntos: 0
Subir archivos grandes con FTP

Necesito que algunos usuarios suban archivos grandes (de más de 10 MB) al servidor, anduve buscando y encontré este Script:

ftp.php
Código PHP:
<?
# FUNCIONES FTP

# CONSTANTES
# Cambie estos datos por los de su Servidor FTP
define("SERVER","localhost"); //IP o Nombre del Servidor
define("PORT",21); //Puerto
define("USER","usuario"); //Nombre de Usuario
define("PASSWORD","pass"); //Contraseña de acceso
define("PASV",true); //Activa modo pasivo

# FUNCIONES

function ConectarFTP(){
//Permite conectarse al Servidor FTP
$id_ftp=ftp_connect(SERVER,PORT); //Obtiene un manejador del Servidor FTP
ftp_login($id_ftp,USER,PASSWORD); //Se loguea al Servidor FTP
ftp_pasv($id_ftp,MODO); //Establece el modo de conexión
return $id_ftp//Devuelve el manejador a la función
}

function 
SubirArchivo($archivo_local,$archivo_remoto){
//Sube archivo de la maquina Cliente al Servidor (Comando PUT)
$id_ftp=ConectarFTP(); //Obtiene un manejador y se conecta al Servidor FTP
ftp_put($id_ftp,$archivo_remoto,$archivo_local,FTP_BINARY);
//Sube un archivo al Servidor FTP en modo Binario
ftp_quit($id_ftp); //Cierra la conexion FTP
}

function 
ObtenerRuta(){
//Obriene ruta del directorio del Servidor FTP (Comando PWD)
$id_ftp=ConectarFTP(); //Obtiene un manejador y se conecta al Servidor FTP
$Directorio=ftp_pwd($id_ftp); //Devuelve ruta actual p.e. "/home/willy"
ftp_quit($id_ftp); //Cierra la conexion FTP
return $Directorio//Devuelve la ruta a la función
}
?>
el formulario que uso para que se suba el archivo (junto con la funcion de listar los archivos), es este:

index.php

Código PHP:
include('ftp.php'); //Incluye el archivo de funciones
if(!empty($_POST["archivo"])){ //Comprueba si la variable "archivo" se ha definido
SubirArchivo($_POST["archivo"],basename($_POST["archivo"]));
//basename obtiene el nombre de archivo sin la ruta
unset($_POST["archivo"]); //Destruye la variable "archivo"
}

    echo 
"<p>Subir Archivo</p>\n"
         
."<hr />\n"
         
."<form action=\"\" method=\"post\" name=\"form_ftp\" id=\"form_ftp\">\n"
         
."<p>Elegir archivo :\n"
         
."<input name=\"archivo\" type=\"file\" id=\"archivo\" />\n"
         
."<input name=\"Submit\" type=\"submit\" value=\"Subir Archivo\" />\n"
         
."<hr /><p>Lista de Archivos</p>\n"
         
."<table width=\"69%\" border=\"1\" cellspacing=\"0\" cellpadding=\"0\">\n"
         
."<tr><td width=\"48%\" align=\"center\"><p>Nombre</p></td>\n"
         
."<td width=\"22%\" align=\"center\"><p>Tama&ntilde;o</p></td>\n"
         
."<td width=\"30%\" align=\"center\"><p>Fec. Modificaci&oacute;n</p></td>\n"
         
."</tr>\n";

$id_ftp=ConectarFTP(); //Obtiene un manejador y se conecta al Servidor FTP
$ruta=ObtenerRuta(); //Obtiene la ruta actual en el Servidor FTP

echo "<b>El directorio actual es: </b> ".$ruta;


$lista=ftp_nlist($id_ftp,$ruta); //Devuelve un array con los nombres de ficheros
$lista=array_reverse($lista); //Invierte orden del array (ordena array)
while ($item=array_pop($lista)) //Se leen todos los ficheros y directorios del directorio
{
$tamano=number_format(((ftp_size($id_ftp,$item))/1024),2)." Kb";
//Obtiene tamaño de archivo y lo pasa a KB
if($tamano=="-0.00 Kb"// Si es -0.00 Kb se refiere a un directorio
{
$item="<i>".$item."</i>";
$tamano="&nbsp;";
$fecha="&nbsp;";
}else{
$fecha=date("d/m/y h:i:s"ftp_mdtm($id_ftp,$item));
//Filemtime obtiene la fecha de modificacion del fichero; y date le da el formato de salida
}

    echo 
"<tr><td><p>$item</p></td>\n"
         
."<td align=\"right\"><p>$tamano</p></td>\n"
         
."<td align=\"right\"><p>$fecha</p></td>\n"
         
."</tr>\n";
}


    echo 
"</table>\n"
Lo saqué de desarrolloweb, me lista bien los archivos que hay en el directorio raiz, pero cuando eligo algún archivo para subirlo al servidor, me carga la página de nuevo sin marcar ningún error pero no sube ningún archivo.
La dirección de donde lo saqué es esta:
http://www.desarrolloweb.com/articulos/1752.php
  #2 (permalink)  
Antiguo 01/04/2005, 03:08
 
Fecha de Ingreso: julio-2004
Ubicación: Hermosillo, Sonora, México.
Mensajes: 16
Antigüedad: 19 años, 9 meses
Puntos: 0
Si lo que quieres es que te envien archivos a tu sitio, puedes utilizar un script sencillo, no necesitas de tanto codigo, pero pues eso depende de cada uno, te voy a poner un codigo muy simple, pero puedes agregarle más cosas. Como dices que el archivo que se envia no se guarda, puede ser porque el servidor no admite cargar archivos mayores a "x" megabytes, como en mi caso.

Bueno, primero haces un formulario con una pagina .htm:

<html>
<head>
<title>Elegir Archivo</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<form name="form1" method="post" action="recibir.php" enctype="multipart/form-data">
<p>Archivo:
<input type="file" name="archivo">
</p>
<p>
<input type="submit" name="Submit" value="Enviar">
</p>
</form>
</body>
</html>

Despues lo recoges con un archivo .php y lo guardas:

<html>
<head>
<title>Recibir Archivo</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body bgcolor="#FFFFFF" text="#000000">
<?
//Creamos variables para determinar nuestros datos FTP
$ftphost="ftp.iespana.es";
$ftpusuario="usuario";
$ftpclave="clave";
//Nos conectamos con el servidor FTP
$conexion = ftp_connect($ftphost);
ftp_login($conexion, $ftpusuario, $ftpclave);
//Guardamos el archivo en en sitio con su nombre original
ftp_put($conexion, "/$archivo_name", $archivo, FTP_ASCII);
echo "Listo!, el archivo $archivo_name, de tamaño $archivo_size fue guardado.";
?>
</body>
</html>

Pues espero que te hayas guiado un poco. En mi caso, es mas complicado meterse con funciones y ese rollo. Trato de simplificar mis codigos para entenderlos.
  #3 (permalink)  
Antiguo 01/04/2005, 07:44
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Realmente .. si tus archivos están en el mismo servidor que corres PHP (tus scripts) no es necesario que uses FTP para ubicar físicamente el archivo subido en dicho servidor ..

Para eso puedes usar las técicas de Upload HTTP simple:
http://www.php.net/features.file-upload

Ejemplos tienes en las FAQ's. y en cientos de mensajes del foro ..

En cuanto a restricciones del archivo a subir ... PHP. En tu php.ini tienes unas cuantas directivas que definen ese tema .. en el link anterior las describe. Tendrás que ajustarlas a tus necesidades: PHP por defecto sólo adminte archivos de 2 Megabytes (upload_max_filesize o algo así se llama la directiva).

Revisé un poco el código .. y realmente no me explico como puede funcionar haciendo:
Código PHP:
SubirArchivo($_POST["archivo"],basename($_POST["archivo"])); 
en tal caso .. usando $_FILES['archivo']['tmp_name'] y $_FILES['archivo']['name'] respectivamente ... (junto con la codificación del formulario HTML para "multiparte")

Si funciona en "local" .. no quiere decir que funcione de forma remota (el servidor: PHP en un sitio y el "cliente" (tu navegador/usuario) en otro) .. De hecho bajo la misma filosofía podría teóricamente indicar una ruta cualquiera de un archivo del PC cliente y subirlo sin más "automáticamente" .. Eso no es permitido así como así .. (estaríamos todos perdidos!).


Un saludo,

Última edición por Cluster; 01/04/2005 a las 07:57
  #4 (permalink)  
Antiguo 01/04/2005, 09:18
Avatar de cauly  
Fecha de Ingreso: febrero-2002
Ubicación: Buenos Aires
Mensajes: 726
Antigüedad: 22 años, 1 mes
Puntos: 0
Cluster: no lo hice con move_uploaded_file porque en el servidor donde quiero subir los archivos tiene la configuración por defecto que es de 2 MB (tengo que subir archivos de algo más) y esto es para una página de un tío mio que hace bases de datos en access y por ahi necesita que los clientes le suban la base para que él le haga modificaciones.
robertogongora: me anduvo bien el script tuyo.

Voy a hacerles las modificaciones al script que posteee arriba a ver si me funciona (la codificacion multipart/form-data y $_FILES)

Por otro lado, no me funciona en local pòrque no tengo instalado un servidor ftp, pero en el servidor pago anda bien.
Ggracias a los dos :D
  #5 (permalink)  
Antiguo 01/04/2005, 09:46
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
Por otro lado, no me funciona en local pòrque no tengo instalado un servidor ftp, pero en el servidor pago anda bien.
Teóricamente .. donde dice la configuración de acceso a tu servidor FTP .. usas los datos de tu servidor remoto .. debería funcionar (para tus pruebas).

Pregunta:
¿En las pruebas del script de robertogongora: (usando $_FILES['archivo']['name'] o $archivo_name y la codificación del formulario HTML a multiparte) .. has superado las restricciones de PHP (upload_max_filesize) de 2 Megabytes?

Otro detalle de pruebas .. en PHP la configuración de post_max_size está a 50 Megabytes (creo recordad) .. (puedes revisarlo en tu caso partícular haciendo un phpinfo() a tu servidor). Vía FTP (según ejemplo de robertogongora) ¿puedes superar ese limite? (fuera de que le dés más tiempo de ejecución al script si es que lo tienes permitido con set_time_limit() .. por qué subir esos "50Megbaytes" tarda más de 30 segundos (que es lo que por defecto se usa) .. te saltará el script por un error de máximo tiempo de ejecución superado).

Luego hay otras restricciones sobre "memory_limit" (todo refenente a php.ini) que limita la cantidad de datos que puede manejar en memoria un script PHP .. Por ahí podrías tener problemas.

El objetivo de estas pruebas es simplemente determinar que vía "FTP" puedas superar la restricción de "upload_max_filesize" y en que medida afectan las otras restricciones ..

Ya que estás haciendo pruebas .. si quisieras colaborar con los resultados de tus pruebas, sería interesante.

Un saludo,
  #6 (permalink)  
Antiguo 01/04/2005, 10:06
Avatar de cauly  
Fecha de Ingreso: febrero-2002
Ubicación: Buenos Aires
Mensajes: 726
Antigüedad: 22 años, 1 mes
Puntos: 0
con el ejemplo de robertogongora, intenté subir un mp3 de 3,63 MB y despues de un rato de "cargar la página" subió el mp3 pero con 0MB (o sea, solo el nombre del archivo estaba en el servidor, con un archivo de menos de 2MB no tuve problema), por otro lado tardó más de 30 segundos en subir y no tiró el error de que se excedió el tiempo de ejecución del script. post_max_size está en 55MB

Por si querés ver el phpinfo:
http://publicasonline.com/info.php (aunque esa no es la página, es delucchimdb.com.ar está como subdomminio de la anterior, asi que el servidor es el mismo).

Ya decidí que no es viable esto, asi que voy a resolverlo de otra manera (creando una cuenta FTP y los clientes que necesiten subir una base de datos, lo hagan con un cliente FTP), de cualquier manera seguiré intentando esto a ver que puedo sacar de bueno.
  #7 (permalink)  
Antiguo 02/04/2005, 01:43
 
Fecha de Ingreso: julio-2004
Ubicación: Hermosillo, Sonora, México.
Mensajes: 16
Antigüedad: 19 años, 9 meses
Puntos: 0
Pues yo solo intentaba ayudar un poco. La verdad si sabía que se podía poner un límite de espacio para subir un archivo especificando una propiedad, pero yo tenía supuesto que si no se hacía referencia a ésta, no pasaba nada y se podía subir archivos de gran tamaño. Y respecto a la propiedad "upload_max_filesize" del php.ini solo digo que se tiene que acceder a modificar este archivo para aumentar la restricción del tamaño, y no creo que haya una forma de evadir tener que ir a configurar php.ini. Además, como dice Cluster, no se necesita una conexión FTP para subir un archivo en un servidor local, así que puedes hacer todavía más fácil el asunto.
  #8 (permalink)  
Antiguo 14/04/2005, 02:51
 
Fecha de Ingreso: abril-2005
Mensajes: 1
Antigüedad: 19 años
Puntos: 0
hola buenas, echando un vistazo ayer por la red vi vuestros mensajes, yo tengo el mismo problema que claudy, no puedo subir ficheros grandes. Me interesaría saber si Claudy, has conseguido solucionar tu problema y si es así me echases una mano a mi que me trae esto de cabeza. Muchas gracias por todo hasta pronto.
  #9 (permalink)  
Antiguo 14/04/2005, 08:41
Avatar de cauly  
Fecha de Ingreso: febrero-2002
Ubicación: Buenos Aires
Mensajes: 726
Antigüedad: 22 años, 1 mes
Puntos: 0
Vía web no pude subir archivos grandes porque no tengo acceso para modificar php y está configurado para que se suba hasta 2 MB (es un servidor pago que no administro yo)
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:43.