2012-03-23 23 views
13

tengo el siguiente código:Copiar archivo desde un servidor remoto o URL

$file = 'http://3.bp.blogspot.com/-AGI4aY2SFaE/Tg8yoG3ijTI/AAAAAAAAA5k/nJB-mDhc8Ds/s400/rizal001.jpg'; 
$newfile = '/img/submitted/yoyo.jpg'; 

if (copy($file, $newfile)) { 
    echo "Copy success!"; 
}else{ 
echo "Copy failed."; 
} 

y siempre salida "Copia falló"

copy(/img/submitted/yoyo.jpg) [function.copy]: failed to open stream: No such file or directory 

mi directorio se establece en 777.

cualquier ideas? ¡Gracias!

Respuesta

45

Mientras copy() aceptará una URL como la fuente argumento , puede ser que tenga problemas de una URL para el destino .

¿Ha intentado especificar la ruta completa del sistema de archivos al archivo de salida? Supongo que no estás tratando de poner el nuevo archivo en un servidor remoto.

Por ejemplo:

$file = 'http://3.bp.blogspot.com/-AGI4aY2SFaE/Tg8yoG3ijTI/AAAAAAAAA5k/nJB-mDhc8Ds/s400/rizal001.jpg'; 
$newfile = $_SERVER['DOCUMENT_ROOT'] . '/img/submitted/yoyo.jpg'; 

if (copy($file, $newfile)) { 
    echo "Copy success!"; 
}else{ 
    echo "Copy failed."; 
} 

Lo anterior funcionó muy bien para mí.

+1

perfecto, gracias Mark! – Kris

+1

El $ _SERVER ['DOCUMENT_ROOT'] hizo la magia por mí ... Muchas gracias. –

+0

Reemplacé '$ _SERVER ['DOCUMENT_ROOT']' con '__DIR__' y lo puse en funcionamiento. Verifique su versión de PHP para asegurarse de que esté disponible. – johnsnails

4

Si el archivo no es públicamente accesible, entonces no puede copiar un archivo de un servidor sin tener acceso a él.

Puede usar ftp_get() para abrir una conexión FTP y copiar el archivo.

$local_file = 'localname.zip'; // the nam 
$server_file = 'servername.zip'; 
$conn = ftp_connect($ftp_server); 

$login_result = ftp_login($conn, $ftp_user_name, $ftp_user_pass); 

if (ftp_get($conn, $local_file, $server_file, FTP_BINARY)) { 
    echo "Successfully copied"; 
} 
ftp_close($conn); 

Pero, si usted quiere descargar un archivo desde el URL

$fullPath = "filepath.pdf"; 

if ($fd = fopen ($fullPath, "r")) { 
    $fsize = filesize($fullPath); 
    $path_parts = pathinfo($fullPath); 
    $ext = strtolower($path_parts["extension"]); 
    header("Content-type: application/octet-stream"); 
    header("Content-Disposition: filename=\"".$path_parts["basename"]."\""); 
    header("Content-length: $fsize"); 
    header("Cache-control: private"); //use this to open files directly 
    while(!feof($fd)) { 
     $buffer = fread($fd, 2048); 
     echo $buffer; 
    } 
} 
fclose ($fd); 
+0

¿Qué tiene que ver una conexión 'ftp' con la copia de un archivo de un servidor' http'? Además, afortunadamente, cada vez menos proveedores siguen utilizando el protocolo 'ftp' completamente desactualizado. Entonces esta no es una respuesta, lo siento. – arkascha

+0

@arkascha, he reformulado mi respuesta si eso aclara las cosas. Y niego su comentario de declarar mi respuesta como "no una respuesta". Debido a que el FTP todavía se usa ampliamente en el mundo del desarrollo web e incluso si está desactualizado, todavía sería una respuesta que sugiere una implementación obsoleta, pero aún así sería una respuesta. – Starx

+0

El archivo que no se puede acceder públicamente no fue ni la pregunta ni el problema. Usted respondió una pregunta que no fue hecha. Es cierto que, lamentablemente, algunos proveedores de servicios todavía usan el protocolo anterior, aunque existen mejores alternativas, por lo tanto obligan a sus usuarios a presentar credenciales privadas y datos a todos los que escuchan. Pero todavía la pregunta era cómo utilizar la función de copia de php para acceder a un archivo remoto. Que no respondiste en absoluto. – arkascha

6

me encontré con esta función en uno de mi viejo proyecto.

private function download_file ($url, $path) { 

    $newfilename = $path; 
    $file = fopen ($url, "rb"); 
    if ($file) { 
    $newfile = fopen ($newfilename, "wb"); 

    if ($newfile) 
    while(!feof($file)) { 
     fwrite($newfile, fread($file, 1024 * 8), 1024 * 8); 
    } 
    } 

    if ($file) { 
    fclose($file); 
    } 
    if ($newfile) { 
    fclose($newfile); 
    } 
} 
+0

gracias @jonathan, este también funciona para mí. :) – Kris

Cuestiones relacionadas