【问题标题】:Copy file from remote server or URL [duplicate]从远程服务器或 URL 复制文件 [重复]
【发布时间】:2012-04-08 07:01:06
【问题描述】:

我有以下代码:

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

它总是输出“复制失败”

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

我的目录设置为 777。

有什么想法吗?谢谢!

【问题讨论】:

    标签: php file copy


    【解决方案1】:

    如果文件不可公开访问,则您无法从服务器复制文件而无法访问它。

    您可以使用ftp_get()打开FTP连接并复制文件。

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

    但是,如果你想从 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);
    

    【讨论】:

    • ftp 连接与从http 服务器复制文件有什么关系?此外,幸运的是,越来越少的供应商仍然使用完全过时的ftp 协议。所以这不是答案,抱歉。
    • @arkascha,如果可以解决问题,我已经改写了我的答案。我否认您将我的答案声明为“不是答案”的评论。因为 FTP 在 Web 开发世界中仍然被广泛使用,即使它已经过时,它仍然是一个暗示过时实现的答案,但仍然是一个答案。
    • 不能公开访问的文件既不是问题也不是问题。你回答了一个没有被问到的问题。确实不幸的是,尽管存在更好的替代方案,但一些服务提供商仍然使用旧协议,从而迫使他们的用户向所有收听的人提供私人凭据和数据。但问题仍然是如何使用 php 的复制功能来访问远程文件。你根本没有回答。
    • @arkascha 问题的标题是Copy file from remote server or URL,我的回答确实回答了这两个问题。
    • 确实如此。但是标题不是问题,并且完全可以在这里使用 ftp 协议是一个疯狂的猜测。即使,或者如果 OP 想要将文件发送给客户端(你从哪里得到的?),问题的内容仍然表明 OP 提出了其他问题。无论如何,我们在这里可能有不同的看法。这就是我评论的全部内容。
    【解决方案2】:

    我在我的一个旧项目中发现了这个功能。

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

    【讨论】:

    • 感谢@jonathan,这个也适用于我。 :)
    【解决方案3】:

    虽然copy() 将接受一个 URL 作为 source 参数,但它可能对 destination 的 URL 有问题。

    您是否尝试过指定输出文件的完整文件系统路径?我假设您没有尝试将新文件放到远程服务器上。

    例如:

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

    以上方法对我来说效果很好。

    【讨论】:

    • $_SERVER['DOCUMENT_ROOT'] 为我创造了奇迹……非常感谢。
    • 我用__DIR__ 替换了$_SERVER['DOCUMENT_ROOT'] 并让它工作了。检查您的 PHP 版本以确保它可用。
    • 为我工作,谢谢。
    • 它有效,但只能通过浏览器而不是通过 plesk cron 作业。
    猜你喜欢
    • 1970-01-01
    • 2022-01-28
    • 2022-01-17
    • 2018-10-06
    • 2017-09-22
    • 2019-01-20
    • 2015-06-16
    • 2011-05-09
    • 1970-01-01
    相关资源
    最近更新 更多