从url下载文件到服务器,这是动态生成的

时间:2014-06-11 14:51:05

标签: php curl download fopen

我需要从url下载一个zip文件到我的服务器,这是动态生成的,这意味着url中没有扩展名。 zip文件将由网址生成。我们需要将该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文件的文件,但我无法下载没有扩展名的文件。我一直在努力想出这个问题,必须有办法,任何建议都非常感激。

提前谢谢。

1 个答案:

答案 0 :(得分:1)

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

出于这个原因,我建议您查看cURL library。它提供了一组功能,使您可以轻松执行上述所有任务。这是一个模仿您的DownloadFile函数的代码段,但它遵循重定向:

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