Comunidad de diseño web y desarrollo en internet online

¿error? en tutorial de como subir archivos con PHP por FTP

Citar            
MensajeEscrito el 17 Nov 2007 11:45 pm
Hola.

He estado buscando por el buscador (valga la redundancia) y no he encontrado nada, así que inicio este tema nuevo.

Buscando por Google he encontrado el tutorial de cómo subir archivos con PHP por FTP, disponible en esta web en http://www.cristalab.com/tutoriales/112/subir-archivos-con-php-por-ftp. El caso es que aunque no era lo que andaba buscando, me he parado a echarle un vistazo, y hay una cosa que no logro entender de su código.

Inicia todo el tema del FTP a mi juicio bien, pero cuando llega la hora de copiar el archivo al FTP, usa la función copy de PHP que sirve (cómo imagino que todos sabréis :) ) para copiar un archivo de un sitio a otro dentro del mismo servidor. Es por ello que no entiendo el uso de las funciones FTP para luego usar la función copy que nada tiene que ver con el manejo del ftp. En su lugar, habría que utilizar la función ftp_put.

Código actual:

Código :

// Verificamos si ya se subio el archivo temporal
if (is_uploaded_file($remoto)){
   // copiamos el archivo temporal, del directorio de temporales de nuestro servidor a la ruta que creamos
   copy($remoto, $ruta);      
}
// Sino se pudo subir el temporal
else {
   echo "no se pudo subir el archivo " . $local;
}


Código Modificado

Código :

//verificamos que el archivo ha sido realmente subido al servidor (donde está el script php, no el ftp)
if(is_uploaded_file($remoto)
{
  //subimos el archivo subido (desde la carpeta temporal del sistema) al ftp
  if(ftp_put($cid, $local, $remoto, FTP_BINARY))
  {
    echo "el archivo ha sido subido con éxito al destino ftp";
  }
  else
  {
    echo "falló la subida al destino ftp";
  }
}
else
{
  echo "el archivo no ha sido subido normalmente";
}


Por ende, sobraría la parte de:

Código :

// Juntamos la ruta del servidor con el nombre real del archivo
$ruta = "/srv/www/htdocs/boca/" . $local;


Para terminar, a modo de corrección de seguridad, la parte en la que comprueba que el tamaño del archivo no exceda de un tamaño determinado:

Código :

// Verificamos si no hemos excedido el tamaño del archivo
if (!$tama<=$_POST["MAX_FILE_SIZE"]){
echo "Excede el tamaño del archivo...<br />";


Como toda entrada, no podemos tener la certeza de que el usuario nos pase un valor correcto para el tamaño máximo. Un usuario malicioso podría aumentar ese tamaño máximo, con lo que nuestro script quedaría vulnerable. Lo mejor es especificar ese tamaño máximo dentro del script. La modificación podría quedar algo así...

Código :

//verificamos si cumple con el tamaño máximo
$tamano_max = 1048576; //1 MegaByte (en bytes)
if($tama > $tamano_max)
{
  echo "el archivo excede el tamaño máximo";
}


Ruego que si me equivoco en mi planteamiento, lo debatamos aquí para aprender todos. :wink:

Saludos.

Por javierav

22 de clabLevel



Genero:Masculino  

Córdoba (España)

firefox
Citar            
MensajeEscrito el 18 Nov 2007 01:16 am
Gracias javierav. Si, de hecho alguna vez lo platique con Aoyama, que realmente los archivos se subían por http y no por ftp. El ftp de php solo es para transferir archivos entre servidores.

saludos :wink:

Por Dano

BOFH

4273 de clabLevel

14 tutoriales
4 articulos
10 ejemplos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Lugar estratégico para vigilarte

firefox
Citar            
MensajeEscrito el 21 Ago 2008 10:01 pm
Buenas a todos, estoy comiendome el coco con lo del ftp y no soy capaz de que me funcione, el caso es que tal y como estaba el codigo en un comienzo, pero sacandole lo del tamaño de los archivos (me salia siempre que el archivo sobrepasaba el tamaño) me conectaba con el servidor, me decia que todo correcto pero no me almacenaba el archivo.
Con las modificaciones del codigo que comentasteis aqui (ftp_put en vez de copy...), no se si me conecta con el servidor porque al darle a enviar me sale una pantalla en blanco, estoy por creer que es que pongo mal los directorios, pero no doy localizado el fallo, el codigo que tengo es el siguiente:

Código :

<?php
   // Primero creamos un ID de conexión a nuestro servidor
   $cid = ftp_connect("ftp.stratovare.es","21");
   // Luego creamos un login al mismo con nuestro usuario y contraseña
   $resultado = ftp_login($cid, "stratovare","*******");
   // Comprobamos que se creo el Id de conexión y se pudo hacer el login
   if ((!$cid) || (!$resultado)) {
      echo "Fallo en la conexión"; die;
   } else {
      echo "Conectado.";
   }
   // Cambiamos a modo pasivo, esto es importante porque, de esta manera le decimos al 
   //servidor que seremos nosotros quienes comenzaremos la transmisión de datos.
   ftp_pasv ($cid, true) ;
   echo "<br> Cambio a modo pasivo<br />";
   // Nos cambiamos al directorio, donde queremos subir los archivos, si se van a subir a la raíz
   // esta por demás decir que este paso no es necesario. En mi caso uso un directorio llamado boca
   ftp_chdir($cid, "fotos");
   echo "Current directory is now: " . ftp_pwd($conn_id) . "\n"
   echo "Cambiado al directorio necesario";   
   // Tomamos el nombre del archivo a transmitir, pero en lugar de usar $_POST, usamos $_FILES que le indica a PHP
   // Que estamos transmitiendo un archivo, esto es en realidad un matriz, el segundo argumento de la matriz, indica
   // el nombre del archivo
   $local = $_FILES["archivo"]["name"];
   // Este es el nombre temporal del archivo mientras dura la transmisión
   $remoto = $_FILES["archivo"]["tmp_name"];
   // El tamaño del archivo
   $tama = $_FILES["archivo"]["size"];
   echo "<br />$local<br />";
   echo "$remoto<br />";
   echo "subiendo el archivo...<br />";
   // Verificamos si no hemos excedido el tamaño del archivo
   $tamano_max = 1048576; //1 MegaByte (en bytes) 
    if($tama > $tamano_max)
    {
      echo "el archivo excede el tamaño máximo";
   }
   } else {
         //verificamos que el archivo ha sido realmente subido al servidor (donde está el script php, no el ftp)
         if(is_uploaded_file($remoto)
         {
         //subimos el archivo subido (desde la carpeta temporal del sistema) al ftp
            if(ftp_put($cid, $local, $remoto, FTP_BINARY))
            {
               echo "el archivo ha sido subido con éxito al destino ftp";
            }
            else
            {
               echo "falló la subida al destino ftp";
            }
         }
         else
         {
         echo "el archivo no ha sido subido normalmente";
         }
   }
   echo "Ruta: " . $ruta;
   //cerramos la conexión FTP
   ftp_close($cid);
?>


los directorios que tengo son los siguientes:


los archivos php estan en la carpeta 'fotos_prueba'

si teneis tiempo y os apetece ayudar a un inutil necesitado echadle un ojo al codigo, muchas gracias de antemano, y sois unos cracks, a ver si parais de estudiar para darnos un poco de margen a los mortales, jeje

gracias

Por metalium

1 de clabLevel



 

firefox
Citar            
MensajeEscrito el 22 Ago 2008 03:00 am
porq no usas copy y te dejas de rostizar el coco es mas facil mira es algo asi

Código :

$destino="nombrecarpeta";
$prefijo="img_";
copy($_FILES['archivo']['tmp_name'], $destino.'/'.$prefijo.$_FILES['archivo']['name']);   


me parece mejor no se tu

Por talcual

686 de clabLevel



 

Colombia

msie7
Citar            
MensajeEscrito el 22 Ago 2008 10:56 am
Hola.

Si lo que quieres es copiar un archivo dentro del mismo servidor, es decir, que un usuario envíe desde su navegador un archivo a tu servidor A donde corre tu script php y una vez subido reubicarlo en alguna carpeta del sistema de ese servidor, deberías usar la función copy que te comentan. Ahora bien, si lo que quieres es que un usuario envíe un archivo desde su navegador a un servidor A donde esta corriendo tu script php y quieres que ese script suba ese archivo a un servidor B mediante FTP, si deberías usar las funciones de FTP de PHP.

Si realmente necesitas usar las funciones FTP, miraré a fondo el script que has puesto.

Saludos.

Por javierav

22 de clabLevel



Genero:Masculino  

Córdoba (España)

firefox
Citar            
MensajeEscrito el 22 Ago 2008 02:16 pm

javierav escribió:

Hola.

Si lo que quieres es copiar un archivo dentro del mismo servidor, es decir, que un usuario envíe desde su navegador un archivo a tu servidor A donde corre tu script php y una vez subido reubicarlo en alguna carpeta del sistema de ese servidor, deberías usar la función copy que te comentan. Ahora bien, si lo que quieres es que un usuario envíe un archivo desde su navegador a un servidor A donde esta corriendo tu script php y quieres que ese script suba ese archivo a un servidor B mediante FTP, si deberías usar las funciones de FTP de PHP.

Si realmente necesitas usar las funciones FTP, miraré a fondo el script que has puesto.

Saludos.


Señores, varias veces aquí he dicho que el FTP de php, solo funciona entre servidores, para hacer un upload de archivos, no funciona. NO se puede, los archivos se suben por HTTP. Eso que ponen de FTP, lo ponen de adorno, no es necesario, ya que el archivo llega por HTTP y ya el FTP solo lo usan para copiar el archivo, cuando YA ESTA en el servidor.


Saludos

pd. Ojo, con php podrían hacer un servidor FTP, pero el cliente no puede ser un formulario HTML. Los formularios html siempre envian los archivos por HTTP.

Por Dano

BOFH

4273 de clabLevel

14 tutoriales
4 articulos
10 ejemplos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Lugar estratégico para vigilarte

firefox
Citar            
MensajeEscrito el 23 Ago 2008 03:04 pm

Dano escribió:

Señores, varias veces aquí he dicho que el FTP de php, solo funciona entre servidores, para hacer un upload de archivos, no funciona. NO se puede, los archivos se suben por HTTP. Eso que ponen de FTP, lo ponen de adorno, no es necesario, ya que el archivo llega por HTTP y ya el FTP solo lo usan para copiar el archivo, cuando YA ESTA en el servidor.


¿Y quién ha dicho lo contrario? :roll:

Saludos.

Por javierav

22 de clabLevel



Genero:Masculino  

Córdoba (España)

firefox
Citar            
MensajeEscrito el 23 Ago 2008 04:21 pm

javierav escribió:

Dano escribió:

Señores, varias veces aquí he dicho que el FTP de php, solo funciona entre servidores, para hacer un upload de archivos, no funciona. NO se puede, los archivos se suben por HTTP. Eso que ponen de FTP, lo ponen de adorno, no es necesario, ya que el archivo llega por HTTP y ya el FTP solo lo usan para copiar el archivo, cuando YA ESTA en el servidor.


¿Y quién ha dicho lo contrario? :roll:

Saludos.

Sorry, tu si lo expresaste bien. Lo que pasa es que a cada rato vienen y preguntan que como hacen un uploader en php que use FTP(y eso ambos sabemos que no se puede). Pero no había leído a fondo tu post, tu si tienes bien definido el concepto, fue mi error no leer con detenimiento todo tu post, una disculpa man.

Por Dano

BOFH

4273 de clabLevel

14 tutoriales
4 articulos
10 ejemplos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Lugar estratégico para vigilarte

firefox
Citar            
MensajeEscrito el 09 Jun 2010 07:31 am
hola olars yo lo hice de esta manera y resulto altirors

$ruta=$_POST['dirActual'];
$stream=conFtp();//<--la conexion al servidors jejeje :)
if($stream)
{
// cargar un archivo
ftp_chdir($stream,$ruta);
if (ftp_put($stream, $_FILES['archivo']['name'],$_FILES['archivo']['tmp_name'], FTP_ASCII)) {
echo "<script type='text/javascript'>alert('el archivo se ha cargado satisfactoriamente');parent.recargar();</script>";
} else {
echo "<script type='text/javascript'>alert('Hubo un problema durante la transferencia ');</script>";
}
}

Por crash512

0 de clabLevel



 

firefox
Citar            
MensajeEscrito el 19 Oct 2010 01:49 pm
Hola
Bueno, pues leyendo todo el hilo, veo que dicen que con php se podría hacer un Servidor FTP, como pregunto yo???
por mucho yo veo funciones para hacer un Cliente FTP!!!
y la interfaz claramente puede ser html!!

Ahora, coincido en que es no muy saludable usar el fputs cuando se hace el envio desde
un archivo html con campos de tipo file, pues para esa gracia usaria solo el copy,
pero pues depende de la necesidad, se puede hacer uso de fputs

Basandome en esto

Finalmente, pregunto algo, como se podría lograr que el envio de un archivo bastante gigante (150 mb por ej)
se haga por paquetes? es decir, alguna vez me comentaron de multi-hilos pero pues no tengo mucha
idea de ese asunto, ya he modificado la configuración del servidor para que acepte archivos de 200 mb
pero aún así persiste el inconveniente con archivos superiores a 30 mb

Saludos

Por CLAnonimo

Claber

600 de clabLevel

5 tutoriales
1 articulo

 

Este es un usuario anónimo genérico para las cuentas borradas o perdidas.

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.