Foros del Web » Programando para Internet » PHP »

ftp_fget - no trae el archivo completo

Estas en el tema de ftp_fget - no trae el archivo completo en el foro de PHP en Foros del Web. Hola a todos, nuevo en php, sepan disculpar si incurro en alguna brutalidad. Tengo el siguiente problema: El objetivo es copiar de una carpeta a ...
  #1 (permalink)  
Antiguo 07/01/2012, 08:36
 
Fecha de Ingreso: febrero-2003
Ubicación: Costa Rica
Mensajes: 133
Antigüedad: 21 años, 2 meses
Puntos: 0
ftp_fget - no trae el archivo completo

Hola a todos, nuevo en php, sepan disculpar si incurro en alguna brutalidad.

Tengo el siguiente problema:
El objetivo es copiar de una carpeta a otra un archivo y utilizo la siguiente funcion

function get($file,$destination) {
// $this->mode = Binary (1) or ASCII (0), está en 1
// $this->connection (la conexión)

$ok=true;
$fp = fopen($destination . $file, "a+");
$ok = ftp_fget($this->connection, $fp, "$file", $this->mode, filesize($destination . $file));

fclose($fp);
return $ok;
}

todo lo hace muy bien, solo que al archivo resultante (el copiado en el otro directorio), siempre le faltan algunos "bytes" (un cacho)...
Alguna sugerencia?
Desde ya gracias. Saludos cordiales.
  #2 (permalink)  
Antiguo 07/01/2012, 12:55
Avatar de gildus  
Fecha de Ingreso: agosto-2003
Mensajes: 1.495
Antigüedad: 20 años, 8 meses
Puntos: 105
Respuesta: ftp_fget - no trae el archivo completo

Holas,

Estas usando FTP_ASCII o FTP_BINARY ?.

Que retorna la variable $ok ?. Haz intentado algo como esto? :

Código PHP:
Ver original
  1. $ok = ftp_fget($this->connection, $fp, $file, $this->mode, 0);



Saludos
__________________
.: Gildus :.
  #3 (permalink)  
Antiguo 08/01/2012, 03:29
 
Fecha de Ingreso: febrero-2003
Ubicación: Costa Rica
Mensajes: 133
Antigüedad: 21 años, 2 meses
Puntos: 0
Respuesta: ftp_fget - no trae el archivo completo

Hola gildus, gracias por responder.
Está usando "// $this->mode = Binary (1) or ASCII (0), está en 1" (al principio lo digo) aunque también lo he probado en ascii.
El retonro de $ok es verdadero. Como digo, la transferencia se hace correctamente, solo que el archivo resultante no es igual al de origen.

Si, el código está integrado a otro proceso que luego trabaja con ese archivo producto del pasaje, pero he hecho un procesito aparte para probar esto solamente (fuera del proceso grande) y se produce la misma situación.

Saludos.
  #4 (permalink)  
Antiguo 08/01/2012, 09:41
Avatar de gildus  
Fecha de Ingreso: agosto-2003
Mensajes: 1.495
Antigüedad: 20 años, 8 meses
Puntos: 105
Respuesta: ftp_fget - no trae el archivo completo

No se porque inicializas $ok con true, deberia de ser false para luego confirmarlo con el mismo proceso ftp_fget.

El archivo de escritura abrelo solo para escritura:

Código PHP:
Ver original
  1. $fp = fopen($destination . $file, "w");

Mas o menos:
Código PHP:
Ver original
  1. function get($file,$destination)
  2. {
  3.  
  4.     // $this->mode = Binary (1) or ASCII (0), está en 1
  5.     // $this->connection (la conexión)
  6.  
  7.    $ok = false;
  8.  
  9.    if($this->connection) {
  10.  
  11.     $fp = fopen($destination . $file, "w");
  12.     $ok = ftp_fget($this->connection, $fp, $file, $this->mode, 0);
  13.     fclose($fp);
  14.  
  15.     }
  16.  
  17.     return $ok;
  18.  
  19. }


deberias tambien comprobar en el if si estas logeado porseacaso.

Saludos
__________________
.: Gildus :.
  #5 (permalink)  
Antiguo 09/01/2012, 06:30
 
Fecha de Ingreso: febrero-2003
Ubicación: Costa Rica
Mensajes: 133
Antigüedad: 21 años, 2 meses
Puntos: 0
Respuesta: ftp_fget - no trae el archivo completo

Hola Gildus, supongo que la inicialización del $ok, no es muy importante, lo importante es como queda luego de ftp_fget y el hecho es que si pasa el archivo, dejando $ok en true, el problema es que al archivo le pasa algunos bytes de menos...
También he probado la grabación con w, w+ y como uso php 5... c y también c+ y no se cual mas, pero todos igual, con el archivo resultante con un pedazo menos.
Rspecto al 0 (donde comenzará a grabar, estoy usando filesize($destination . $file) que esta en 0) también lo he probado (sin filesize... porbé directamente con 0) con el mismo resultado.

Igual, muchas gracias por tu respuesta. Saludos.
  #6 (permalink)  
Antiguo 09/01/2012, 07:02
Avatar de gildus  
Fecha de Ingreso: agosto-2003
Mensajes: 1.495
Antigüedad: 20 años, 8 meses
Puntos: 105
Respuesta: ftp_fget - no trae el archivo completo

Es muy raro que baje incompleto el archivo. En todo caso asegurate de que te muestre todos los warning o errores que capaz no los vez:

ini_set('error_reporting', E_ALL);
ini_set('display_errors', TRUE);

Y luego podria depurar con un die o un echo en cada paso que haces en tu funcion. Tambien podrias revisar los logs si no logras ver algun warning o error.

En todo caso si logras solucionarlo nos avisas.

Saludos
__________________
.: Gildus :.
  #7 (permalink)  
Antiguo 09/01/2012, 07:36
 
Fecha de Ingreso: febrero-2003
Ubicación: Costa Rica
Mensajes: 133
Antigüedad: 21 años, 2 meses
Puntos: 0
Respuesta: ftp_fget - no trae el archivo completo

Eso eso Gildus, iré por ese lado, veré warnigs a ver que encuentro.
Si he hecho un echo... (jeje) a cada paso, porque el proceso entero es bastante larguillo. Pero por allí no he resuelto nada, aparentemente todo bien a cada paso.

Si, a mi también me resulta muy extraño esto, por ejemplo pasa un txt bien, aparentemente bien, porque si comprobas el pasado con el original no son iguales. Sucede que se abre con un block de notas igual y aparentemente el archivo fue pasado correctamente, pero no... Entonces he probado con otro tipo de archivo, por ejemplo un zip y allí esos bytes de menos no permiten a un winzip (por ejemplo) abrirlo, ni siquiera lo reconoce.
Por lo que pude observar, los bytes que se come son del final del archivo y en cada caso es distinto, y me parece que tiene que ver con el tamaño del archivo, cuanto mas grande es, mas bytes se come...

Bueno, gracias por tu indicación, probaré y luego posteo el resultado.
Saludos.
  #8 (permalink)  
Antiguo 10/01/2012, 11:54
 
Fecha de Ingreso: febrero-2003
Ubicación: Costa Rica
Mensajes: 133
Antigüedad: 21 años, 2 meses
Puntos: 0
De acuerdo Respuesta: ftp_fget - no trae el archivo completo

Bueno, lo resuelvo pero pero...
En realidad no he podido hacer funcionar ftp_fget . Las sentencias originales:

$fp = fopen($destination . $file, "a+");
$ok = ftp_fget($this->connection,$fp,"$file", $this->mode, filesize($destination . $file));

Y como lo lo pude hacer funcionar lo he cambiado por algo así:

// Iniciar
$ret = ftp_nb_get($this->connection, $destination . $file, "$file", $this->mode, filesize("$file"));
while ($ret == FTP_MOREDATA) {
//echo "."; // Haga lo que quiera
$ret = ftp_nb_continue($this->connection); // Continuar la descarga...
}
if ($ret != FTP_FINISHED) {
//echo "Hubo un error al descargar el archivo...";
exit;
} else {
//echo "Todo ok !!!";
$ok=true;
}


en síntesis, cambié un ftp_fget por un ftp_nb_get (los recodemos que los comandos que contienen el "nb" recupera el archivo de forma asincrónica, de modo que la rutina puede realizar otras operaciones mientras el archivo está siendo descargado) que aunque no son lo mismo, para este caso funciona bien.

Espero que a alguien le sea útil esta situación, pero Gildus, nos quedamos como el chiste del pescado...
Porque ¿conoces el chiste del pescado no?, ha bueno, si no lo conoces, quedate con la espina.... jaja (así me quedé yo también, con la espina de por que no funciona ese bendito ftp_fget...)

Saludos y gracias. Y si no hay otra opinión: caso cerrado...

Etiquetas: completo
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 11:19.