Uploader de archivos REMOTO

Iniciado por ‭lipman, 30 Diciembre 2008, 22:34 PM

0 Miembros y 1 Visitante están viendo este tema.

‭lipman

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 (php) [Seleccionar]
$archivo = "http://es.php.net/images/php_snow_2008.gif";
$directorio = "ejemplo.gif";
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:

CitarWarning: 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

eLank0

#1
Hola,

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

<?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$remotoFTP_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

WannaBeHacker

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/

‭lipman

Cita de: eLank0 en 31 Diciembre 2008, 01:49 AM
Hola,

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

<?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$remotoFTP_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 (php) [Seleccionar]
$local = $_FILES['archivo']['nombre_archivo'];
$remoto = $_FILES['archivo']['nombre_archivo_temporal']; //durante la transmision


$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

w0lfh4ck

Cita de: lipman en  6 Enero 2009, 03:34 AM

No entiendo lo de:

Código (php) [Seleccionar]
$local = $_FILES['archivo']['nombre_archivo'];
$remoto = $_FILES['archivo']['nombre_archivo_temporal']; //durante la transmision


$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.

;)
<?="w0lfh4cK";?>

WHK

#5
CitarWarning: 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

Erik#

En un uploader que hice hace meses use la funcion

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

Karman

#7
fijate esta función:

Código (php) [Seleccionar]

function xwUploadFile($campo,$destino,$nombre,$aiext=null,$filetypes=array('image/jpeg','image/pjpg'),$maxfilesize=250000){
  //Verificamos datos...
  if(($_FILES[$campo]['tmp_name']=="")||($_FILES[$campo]['name']=="")){
    xwShowError(ERROR_BAD_ARGS);
    return null;
  }
  //Verificamos tamaño
  if(($_FILES[$campo]['size'] > $maxfilesize)||(!$_FILES[$campo]['size'])){
    xwShowError(ERROR_INVALID_FILESIZE);
    return null;
  }
  //Verificamos Tipo...
  $validfiletype=false;
  foreach($filetypes as $types)
    if($_FILES[$campo]['type'] == $types)
      $validfiletype=true;
  if(!$validfiletype){
    xwShowError(ERROR_INVALID_FILETYPE);
    return null;
  }
  //Comprobamos exista el archivo temporal en el servidor...
  if(is_uploaded_file($_FILES[$campo]['tmp_name'])){
    //Si no existe la carpeta intentamos crearla...
    if ((!file_exists($destino))&&(!mkdir($destino,644))){
      xwShowError(ERROR_FAIL_CREATEFOLDER);
      return null;
    }
    $nombrearchivo = "$destino/$nombre";
    if($aiext!=null){//generamos nombre de archivo (no utilizaremos el enviado)
    $index=0;$nombrearchivo.=$index.'.'.$aiext;
    while(file_exists($nombrearchivo))
          $nombrearchivo = "$destino/$nombre".(++$index).'.'.$aiext;
    $nombre.=$index.'.'.$aiext;
    }else//utilizamos el nombre de archivo enviado
       if(file_exists($nombrearchivo)){
 xwShowError(ERROR_FILE_EXIST);
  return null;
       }
     //Si todo Ocurrió Correctamente subimos la imagen
     if (!move_uploaded_file($_FILES[$campo]['tmp_name'], $nombrearchivo)){
       xwShowError(ERROR_FAIL_UPLOAD);
       return null;
     }
  }else{
    xwShowError(ERROR_FILE_NOTFOUND);
    return null;
  }
  return $nombre;
}


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

SaXo

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.

eLank0

La esquema de SaXo está bien, sólo hay que usar las funciones pertinentes.

S2