2012-03-23 15 views
13

ho il seguente codice:Copiare il file da un server remoto o l'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."; 
} 

ed è sempre uscita "Copia non riuscita"

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

mia directory è impostato su 777.

qualsiasi idee? Grazie!

risposta

45

Mentre copy() accetterà un URL, la fonte argomento , si potrebbe avere problemi di un URL per la destinazione di .

Avete provato a specificare il percorso completo del file system nel file di output? Suppongo che tu non stia cercando di mettere il nuovo file su un server remoto.

Ad esempio:

$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."; 
} 

È possibile che questo ha funzionato bene per me.

+1

perfetto, grazie Marco! – Kris

+1

$ _SERVER ['DOCUMENT_ROOT'] ha fatto la magia per me ... Grazie mille. –

+0

Ho sostituito '$ _SERVER ['DOCUMENT_ROOT']' con '__DIR__' e ho funzionato. Controlla la tua versione di PHP per assicurarti che sia disponibile. – johnsnails

4

Se il file non è accessibile pubblicamente, non è possibile copiare un file da un server senza averne accesso.

È possibile utilizzare ftp_get() per aprire una connessione FTP e copiare il file.

$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); 

Ma, se volete scaricare un file da 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

Che cosa deve fare una connessione 'ftp' con la copia di un file da un server' http'? Inoltre, fortunatamente sempre meno provider utilizzano ancora il protocollo 'ftp' completamente obsoleto. Quindi questa non è una risposta, mi dispiace. – arkascha

+0

@arkascha, ho riformulato la mia risposta se questo chiarisce le cose. E nego il tuo commento di dichiarare la mia risposta come "non una risposta". Perché FTP è ancora ampiamente utilizzato nel mondo dello sviluppo web e anche se fosse obsoleto, sarebbe comunque una risposta che suggerisce un'implementazione obsoleta, ma sarebbe comunque una risposta. – Starx

+0

Il file non accessibile pubblicamente non era né la domanda né il problema. Hai risposto a una domanda che non è stata fatta. È vero che purtroppo alcuni fornitori di servizi usano ancora il vecchio protocollo, anche se esistono alternative migliori, costringendo i propri utenti a presentare credenziali e dati privati ​​a tutti coloro che ascoltano. Ma ancora la domanda era come usare la funzione di copia di php per accedere a un file remoto. A cui non hai risposto affatto. – arkascha

6

ho trovato questa funzione in uno dei miei vecchio progetto.

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

grazie a @jonathan, anche questo funziona per me. :) – Kris

Problemi correlati