web-dev-qa-db-fra.com

Copier un fichier depuis un serveur distant ou une URL

J'ai le code suivant:

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

et il affiche toujours "Échec de la copie"

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

mon répertoire est défini sur 777.

des idées? Merci!

20
Kris

Alors que copy() acceptera une URL comme argument source, il se peut que l'URL soit émise pour la destination .

Avez-vous essayé de spécifier le chemin d'accès complet du système de fichiers au fichier de sortie? Je suppose que vous n'essayez pas de mettre le nouveau fichier sur un serveur distant.

Par exemple:

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

Ce qui précède a bien fonctionné pour moi.

58
Mark Biek

J'ai trouvé cette fonction dans l'un de mes anciens projets.

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);
  }
 }
6
Athiwat Chunlakhan

Si le fichier n'est pas accessible au public, vous ne pouvez pas copier un fichier à partir d'un serveur sans y avoir accès.

Vous pouvez utiliser ftp_get () pour ouvrir une connexion FTP et copier le fichier.

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

Mais, si vous souhaitez télécharger un fichier à partir de l'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);
3
Starx