【问题标题】:Download a file to server from url , which is generated dynamically从动态生成的 url 下载文件到服务器
【发布时间】:2014-06-11 14:51:04
【问题描述】:

我需要从 url 下载一个 zip 文件到我的服务器,它是动态生成的,这意味着 url 中不会有扩展名。 zip 文件将由 url 生成。我们需要将该 zip 文件保存在服务器中。

我试过了。

function DownloadFile($reportDownloadUrl, $downloadPath) {
    $reader = fopen(urldecode($reportDownloadUrl), 'rb') or die("url cannot open");
    if (!file_exists($downloadPath)) { 
            die('File does not exist');
    }
    $writer = fopen($downloadPath, 'wb') or die("cannot open file");
    if (!$reader) {
        throw new Exception("Failed to open URL " . $reportDownloadUrl . ".");
    }
    if (!$writer) {
      fclose($reader);
      throw new Exception("Failed to create ZIP file " . $downloadPath . ".");
    }
    $bufferSize = 10 * 1024;
    while (!feof($reader)) {
        if (false === ($buffer = fread($reader, $bufferSize))) {
          fclose($reader);
          fclose($writer);
          throw new Exception("Read operation from URL failed.");
        }
        if (fwrite($writer, $buffer) === false) {
          fclose($reader);
          fclose($writer);
          $exception = new Exception("Write operation to ZIP file failed.");
        }
    }
    fclose($reader);
    fflush($writer);
    fclose($writer);
}

通过使用它,我可以下载扩展名为 .zip 文件的文件,但我无法下载没有扩展名的文件。我一直在努力解决这个问题,一定有办法,任何建议都非常感谢。

提前谢谢你。

【问题讨论】:

    标签: php curl download fopen


    【解决方案1】:

    您的代码无法下载没有扩展名的 URL 可能有几个原因。您的代码旨在从直接链接中读取,但有时可能会在此之前进行重定向,或者文件可能无法直接访问,除非您发送某些 cookie、用户代理、引荐来源网址等。

    因此,我建议您查看cURL library。它提供了一组功能,可让您轻松执行所有上述任务。这是一个模仿您的 DownloadFile 函数的 sn-p,但它遵循重定向:

    function DownloadFile($reportDownloadUrl, $downloadPath) {
    {
        $ch = curl_init($reportDownloadUrl);
        $fh = fopen($downloadPath, 'ab');
        if($fh === false)
            throw new Exception('Failed to open ' . $downloadPath);
    
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        curl_setopt($ch, CURLOPT_FILE, $fh); // file handle to write to
    
        $result = curl_exec($ch);
        if($result === false) // it's important to check the contents of curl_error if the request fails
            throw new Exception('Unable to perform the request : ' . curl_error($ch));
    }
    

    cURL 包含许多很酷的选项,例如恢复文件下载、上传数据、使用代理等。您可以在手册中阅读所有相关信息:http://php.net/curl-setopt

    关于您的代码的更多信息:

    • if(!$reader) 和 if(!$writer) 检查是多余的,因为如果 fopen() 调用失败,脚本将会终止
    • 你没有抛出 $exception

    【讨论】:

      猜你喜欢
      • 2011-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多