【问题标题】:Download Remote File to Server with PHP使用 PHP 将远程文件下载到服务器
【发布时间】:2011-06-14 18:59:46
【问题描述】:

过去两天我一直在四处寻找并尝试了所有方法,但仍然无法正常工作。我觉得这应该是一件相对简单的事情。

我要做的就是将远程文件从 URL 下载到我服务器上的目录。

所以,例如,如果

$_url = http://www.freewarelovers.com/android/download/temp/1306495040_Number_Blink_1.1.1.apk

和$_dir = /www/downloads/

那么当一切都说完了我想要1306495040_Number_Blink_1.1.1.apk in /www/downloads/

我试过copy()函数,我试过了

file_put_contents("$_dir.$_file_name", file_get_contents($_url));

并得到以下错误:

file_get_contents(): failed to open stream: HTTP request failed!

【问题讨论】:

  • 如果你告诉我们哪些是错误呢?
  • 哇!你说没有错误。 -1
  • 如果你不懂 PHP,那么你怎么能假设哪些细节是相关的和不相关的呢?
  • “我改变了什么真的很重要吗?”是的!如果您更改某些内容并开始表现不同,那么对于故障排除而言,这是非常重要的信息。
  • @yes123,再次尝试be nice。谢谢!

标签: php file download


【解决方案1】:

应该这样做:

set_time_limit(0);

$url = 'http://www.freewarelovers.com/android/download/temp/1306495040_Number_Blink_1.1.1.apk';
$file = fopen(dirname(__FILE__) . '/downloads/a.apk', 'w+');

$curl = curl_init();

// Update as of PHP 5.4 array() can be written []
curl_setopt_array($curl, [
    CURLOPT_URL            => $url,
//  CURLOPT_BINARYTRANSFER => 1, --- No effect from PHP 5.1.3
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_FILE           => $file,
    CURLOPT_TIMEOUT        => 50,
    CURLOPT_USERAGENT      => 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)'
]);

$response = curl_exec($curl);

if($response === false) {
    // Update as of PHP 5.3 use of Namespaces Exception() becomes \Exception()
    throw new \Exception('Curl error: ' . curl_error($curl));
}

$response; // Do something with the response.

【讨论】:

  • 谢谢,这是我收到的第一个有用的评论。不幸的是,我仍然遇到同样的问题。看起来我没有得到整个文件(139 KB 中只有大约 4 KB)。并且error.log没有错误。
  • 我不这么认为。超时设置为 60 秒,整个页面的打开速度比这快。任何其他想法可能是什么?
  • 在开头添加这个:set_time_limit(0); ini_set('display_errors',true);
  • 由于您添加了 PHP5.4 的更新,我认为您可以删除 CURLOPT_BINARYTRANSFER 行,因为它没有效果。 From PHP 5.1.3, this option has no effect: the raw output will always be returned when CURLOPT_RETURNTRANSFER is used.http://php.net/manual/en/function.curl-setopt.php
  • 如果你设置curl_init($url),那么你不需要设置CURLOPT_URL。或者,如果您更喜欢在选项数组中设置它,那么您可以改为使用curl_init()。没必要两者都做。
【解决方案2】:
$url  = 'http://www.example.com/a-large-file.zip';
$path = '/path/to/a-large-file.zip';

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$data = curl_exec($ch);

curl_close($ch);

file_put_contents($path, $data);

它使用卷曲

$url 是文件地址

$path 是保存文件的位置和名称

我希望它有效

【讨论】:

    【解决方案3】:

    自 PHP 5.1.0 起,file_put_contents() 支持通过将流句柄作为 $data 参数传递来逐段写入:
    无需使用卷曲

    file_put_contents("Tmpfile.zip", fopen("http://someurl/file.zip", 'r'));
    

    【讨论】:

    • 这是所有 curl 不必要地建立你的记忆的最佳解决方案。当你尝试构建大文件时,你肯定会出错。
    【解决方案4】:

    使用 curl 从远程服务器下载文件,如下所示。

    $url = "http://path/toserver/filename";
    $destination = "uploads/filename";    
    $fp = fopen ($destination, 'w+');
      $ch = curl_init();
      curl_setopt( $ch, CURLOPT_URL, $url );
      curl_setopt( $ch, CURLOPT_BINARYTRANSFER, true );
      curl_setopt( $ch, CURLOPT_RETURNTRANSFER, false );
      curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );
    
      curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, 10 );
      curl_setopt( $ch, CURLOPT_FILE, $fp );
      curl_exec( $ch );
      curl_close( $ch );
      fclose( $fp );
    

    参考 http://www.tricksofit.com/2014/04/download-file-from-remote-server-in-php

    【讨论】:

      【解决方案5】:

      file_put_contents 需要一个文件名,而不是目录名。

      【讨论】:

      • 他将 $_url 传递给 get_contents。你在说什么
      • 可能是错字。 OP 肯定只是将一个目录传递给 file_put_contents,这可能是事情发生的地方。
      • 我认为他的意思是file_put_contents
      • 谢谢@Marc B,我错了。
      • @Corey 很高兴您将该代码包含在原始问题中。 叹息
      【解决方案6】:

      把它分成不同的阶段:

      $raw = file_get_contents($_url);
      ... check if $raw has anything useful in it
      file_put_contents($_dir, $raw);
      ... check if the file showed up
      

      在 file_get_contents 中获取失败,或者在 file_put_contents 中写入失败,或者您正在下载的文件太大并且超出了 PHP 的默认 memory_limit。

      【讨论】:

      • 在我写它的时候,没有额外的信息。如果您要投反对票,请至少检查“错误”答案是否出现在问题的最新更改之后。
      • 否,但它有助于诊断。在一行上做这一切只会给你“x在Y行失败”。
      • 在这种情况下就足够了 :) failed to open stream: HTTP request failed! 无论如何我会在你的 cmets 但已经过了 40 分钟后关闭我的 -1
      【解决方案7】:

      您可能没有启用 fopen 包装器,因此 file_get_contents 可能无法正常工作。尝试使用curl 或Snoopy 之类的库。

      【讨论】:

        【解决方案8】:

        通过验证...

        先验证文件是否存在:

        function doesUrlExists($url) {
            $ch = curl_init($url);
            curl_setopt($ch, CURLOPT_NOBODY, true);
            curl_exec($ch);
            $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        
            if($code == 200){
                $status = true;
            }else{
                $status = false;
            }
            curl_close($ch);
            return $status;
        }
        

        然后放文件内容(带laravel存储类):

         if(!doesUrlExists($url_file)) {
             die('The remote file is not accessible. Please check the URL.');
         }
        
         Storage::disk('local')
                  ->put($file_destintation, fopen($url_file, 'r'));
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-06-03
          • 1970-01-01
          • 2018-07-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-11-18
          相关资源
          最近更新 更多