Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: ‭lipman en 30 Diciembre 2008, 22:34 pm



Título: Uploader de archivos REMOTO
Publicado por: ‭lipman en 30 Diciembre 2008, 22:34 pm
Buenas, quiero hacerme un uploader de archivos remoto y por lo que he leido se puede hacer con la función copy() pero me da problemas. Por ejemplo, pongo en el servidor (local) esto:

Código
  1. $archivo = "http://es.php.net/images/php_snow_2008.gif";
  2. $directorio = "ejemplo.gif";
  3. copy($archivo, $directorio);

Y funciona, se copia esa imagen en el directorio donde tengo el script como ejemplo.gif.

Sin embargo, si lo subo a un servidor (el de mi web) me da el siguiente error:

Citar
Warning: copy() [function.copy]: URL file-access is disabled in the server configuration in /homepages/44/d217001018/htdocs/prueba/prueba.php on line 10

Warning: copy(http://es.php.net/images/php_snow_2008.gif) [function.copy]: failed to open stream: no suitable wrapper could be found in /homepages/44/d217001018/htdocs/prueba/prueba.php on line 10

¿Que es lo que sucede?

Otra cosa. Me gustaria tambien poner algo así como una barra para saber el progreso y la velocidad a la que va. ¿Cómo podría hacerlo? ¿Cambio de función?

Saludos


Título: Re: Uploader de archivos REMOTO
Publicado por: eLank0 en 31 Diciembre 2008, 01:49 am
Hola,

Podrías usar las funciones FTP de PHP para subir los archivos remotamente:

Código:
<?php

$conn = ftp_connect('servidor');

$log = ftp_login($conn, 'usuario','contraseña');

if (($conn) && ($log))
{

$local = $_FILES['archivo']['nombre_archivo'];

$remoto = $_FILES['archivo']['nombre_archivo_temporal']; //durante la transmision

        if (is_uploaded_file($remoto))
        {
    if(ftp_put($conn, $local, $remoto, FTP_BINARY))
            {
              //Archivo subido correctamente
            }
            else
            {
               //Error al subir el archivo
            }
        }
        else
        {
             //Error
        }

}

ftp_close($conn);

?>

En el ejemplo he supuesto que envias el archivo por formulario.

Es mejor usar funciones específicas para lo que uno quiere hacer, y si ya están hechas pues mucho mejor :)

Salu2


Título: Re: Uploader de archivos REMOTO
Publicado por: WannaBeHacker en 31 Diciembre 2008, 02:12 am
Y lo de la barra de progreso y velocidad pues va a ser que con PHP sólo no, tendría que tirar de AJAX y algún script en perl.
Mira esta página, tal vez te interese:
http://www.codigo-fuente.com/nuevo-ejemplo-barra-de-carga-en-php-y-ajax/


Título: Re: Uploader de archivos REMOTO
Publicado por: ‭lipman en 6 Enero 2009, 03:34 am
Hola,

Podrías usar las funciones FTP de PHP para subir los archivos remotamente:

Código:
<?php

$conn = ftp_connect('servidor');

$log = ftp_login($conn, 'usuario','contraseña');

if (($conn) && ($log))
{

$local = $_FILES['archivo']['nombre_archivo'];

$remoto = $_FILES['archivo']['nombre_archivo_temporal']; //durante la transmision

        if (is_uploaded_file($remoto))
        {
    if(ftp_put($conn, $local, $remoto, FTP_BINARY))
            {
              //Archivo subido correctamente
            }
            else
            {
               //Error al subir el archivo
            }
        }
        else
        {
             //Error
        }

}

ftp_close($conn);

?>

En el ejemplo he supuesto que envias el archivo por formulario.

Es mejor usar funciones específicas para lo que uno quiere hacer, y si ya están hechas pues mucho mejor :)

Salu2

No entiendo lo de:

Código
  1. $local = $_FILES['archivo']['nombre_archivo'];
  2. $remoto = $_FILES['archivo']['nombre_archivo_temporal']; //durante la transmision
  3.  

$local seria, la ruta del archivo que quiero subir no? por ejemplo:

$local = "http://foro.elhacker.net/Themes/converted/images/spanish/search.gif";

y remoto... no entiendo eso de temporal. Si lo que yo quiero es que se suba y se quede ahí xD.

Con lo de respecto a la barra, no me voy a meter en más lenguajes de programación web por ahora asi que prefiero no liarme con eso xD
¿Podría saber la velocidad de subida a la que va a cada instante (o a cada segundos)?

Un saludo y gracias


Título: Re: Uploader de archivos REMOTO
Publicado por: w0lfh4ck en 6 Enero 2009, 05:21 am

No entiendo lo de:

Código
  1. $local = $_FILES['archivo']['nombre_archivo'];
  2. $remoto = $_FILES['archivo']['nombre_archivo_temporal']; //durante la transmision
  3.  

$local seria, la ruta del archivo que quiero subir no? por ejemplo:

$local = "http://foro.elhacker.net/Themes/converted/images/spanish/search.gif";

y remoto... no entiendo eso de temporal. Si lo que yo quiero es que se suba y se quede ahí xD.

Con lo de respecto a la barra, no me voy a meter en más lenguajes de programación web por ahora asi que prefiero no liarme con eso xD
¿Podría saber la velocidad de subida a la que va a cada instante (o a cada segundos)?

Un saludo y gracias

Hola, recuerda que para hacer un upload lo que generalmente se hace es enviar el archivo a subir a la carpeta de temporales.... de ahí el servidor copia o mueve (move_uploaded_file) al directorio que necesites...

El problema tuyo es que no tienes los permisos necesarios para acceder a esa imagen y enviarla a temporales, ya que esa imagen no está en tu máquina...

La forma que te dio el compañero eLank0 es simple, te conectas al FTP agarras la imagen, cierras y te vas....

Lo de los parámetros. La variable global FILE nos brinda 4 datos del archivo que se va a subir

Por ejemplo:
<input type="file" name="imagenes" />

$_FILE["imagenes"]["name"] = Me brinda el nombre del archivo, por ej: casa.jpg
$_FILE["imagenes"]["type"] = El tipo MIME del archivo en este caso "images/jpeg"
$_FILE["imagenes"]["tmp_name"] = La carpeta temporal a la que se encuentra en ese momento, por ej: "tmp/ajdhas545a"
$_FILE["imagenes"]["size"] = El peso del archivo.

Con esos datos validas lo necesario.

Un saludo y espero haber cooperado con tu duda.

;)


Título: Re: Uploader de archivos REMOTO
Publicado por: WHK en 6 Enero 2009, 08:42 am
Citar
Warning: copy() [function.copy]: URL file-access is disabled in the server configuration in /homepages/44/d217001018/htdocs/prueba/prueba.php on line 10

Warning: copy(http://es.php.net/images/php_snow_2008.gif) [function.copy]: failed to open stream: no suitable wrapper could be found in /homepages/44/d217001018/htdocs/prueba/prueba.php on line 10

Eso quiere decir que el servidor está configurado para no acceder a archivos remotos en ciertas funciones como copy, include, requiere_once, fopen, etc pero ahi te dan las alternativas, lo mas práctico sería utilizar sockets.

Busca:
fsockopen
fgets
fputs
fclose
en http://cl.php.net/

Acá lo explican super bién:

http://www.elguruprogramador.com.ar/articulos/introduccion-a-los-sockets-en-php.htm

http://theseismo.wordpress.com/2007/05/07/trabajando-con-sockets-en-php/

http://www.nociondigital.com/webmasters/php-tutorial-sockets-en-php-detalle-181.html


Título: Re: Uploader de archivos REMOTO
Publicado por: Erik# en 6 Enero 2009, 17:27 pm
En un uploader que hice hace meses use la funcion

Código
  1. move_uploaded_file($_FILES['userfile']['tmp_name'],$carpeta . $filename)


Título: Re: Uploader de archivos REMOTO
Publicado por: Karman en 7 Enero 2009, 05:35 am
fijate esta función:

Código
  1. function xwUploadFile($campo,$destino,$nombre,$aiext=null,$filetypes=array('image/jpeg','image/pjpg'),$maxfilesize=250000){
  2.  //Verificamos datos...
  3.  if(($_FILES[$campo]['tmp_name']=="")||($_FILES[$campo]['name']=="")){
  4.    xwShowError(ERROR_BAD_ARGS);
  5.    return null;
  6.  }
  7.  //Verificamos tamaño
  8.  if(($_FILES[$campo]['size'] > $maxfilesize)||(!$_FILES[$campo]['size'])){
  9.    xwShowError(ERROR_INVALID_FILESIZE);
  10.    return null;
  11.  }
  12.  //Verificamos Tipo...
  13.  $validfiletype=false;
  14.  foreach($filetypes as $types)
  15.    if($_FILES[$campo]['type'] == $types)
  16.      $validfiletype=true;
  17.  if(!$validfiletype){
  18.    xwShowError(ERROR_INVALID_FILETYPE);
  19.    return null;
  20.  }
  21.  //Comprobamos exista el archivo temporal en el servidor...
  22.  if(is_uploaded_file($_FILES[$campo]['tmp_name'])){
  23.    //Si no existe la carpeta intentamos crearla...
  24.    if ((!file_exists($destino))&&(!mkdir($destino,644))){
  25.      xwShowError(ERROR_FAIL_CREATEFOLDER);
  26.      return null;
  27.    }
  28.    $nombrearchivo = "$destino/$nombre";
  29.    if($aiext!=null){//generamos nombre de archivo (no utilizaremos el enviado)
  30.     $index=0;$nombrearchivo.=$index.'.'.$aiext;
  31.     while(file_exists($nombrearchivo))
  32.          $nombrearchivo = "$destino/$nombre".(++$index).'.'.$aiext;
  33.     $nombre.=$index.'.'.$aiext;
  34.    }else//utilizamos el nombre de archivo enviado
  35.       if(file_exists($nombrearchivo)){
  36.  xwShowError(ERROR_FILE_EXIST);
  37.  return null;
  38.       }
  39.     //Si todo Ocurrió Correctamente subimos la imagen
  40.     if (!move_uploaded_file($_FILES[$campo]['tmp_name'], $nombrearchivo)){
  41.       xwShowError(ERROR_FAIL_UPLOAD);
  42.       return null;
  43.     }
  44.  }else{
  45.    xwShowError(ERROR_FILE_NOTFOUND);
  46.    return null;
  47.  }
  48.  return $nombre;
  49. }
  50.  

donde xwShowError es una función que imprime el error nada más... y $campo es el campo del formulario donde se ingresa el nombre del archivo...

S2


Título: Re: Uploader de archivos REMOTO
Publicado por: SaXo en 7 Enero 2009, 11:30 am
Hola,

La función usa la estructura $_FILES por lo que se presume que esa función solo va a funcionar si los datos del fichero vienen de un formulario con un campo de tipo file.
 Por motivos de seguridad los formularios solo envían el nombre del fichero.

Actualmente la función file() de php soporta varios tipos de protocolos, como por ejemplo http por lo que es igual de válido realizar estas dos formas para leer un fichero.

file ('/files/ejemplo.gif');
file ('http://host/files/ejemplo.gif');

Lo que hay que hacer es lo mismo que cuando hacemos un stream para descargar ficheros. Leer el fichero y escribirlo en nuestra ubicación.

$archivo = "http://es.php.net/images/php_snow_2008.gif";

$recurso = @fopen($archivo, "r");
if ($recurso) {
   while (!feof($recurso)) {
       $lines[] = fgets($handle, 4096);
   }
   fclose($handle);
}
$d = file('destino','w');
foreach ($lines as $key => $line){
  fwrite($d,$line);
}
fclose($recurso);
fclose($d);


No he probado el código por lo que es probable que no funcione. Pero a modo de ejemplo vale para hacerse una idea de como hacer un stream para obtener ficheros de webs y guardarlos localmente.


Título: Re: Uploader de archivos REMOTO
Publicado por: eLank0 en 13 Enero 2009, 09:54 am
La esquema de SaXo está bien, sólo hay que usar las funciones pertinentes.

S2