【问题标题】:Download htaccess protected files using PHP and CURL使用 PHP 和 CURL 下载受 htaccess 保护的文件
【发布时间】:2011-02-09 11:45:57
【问题描述】:

我尝试使用 php 和 curl 下载受 htaccess 保护的目录中的文件。这是我的代码:

$username = "MyUsername";
$password = "MyPassword";
$url = "http://www.example.com/private/file.pdf";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
$output = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);

但是这段代码什么也没做……我怎样才能开始下载file.pdf?

谢谢!

另外,如果我回显 $output,我会得到:

Array ( [url] => http://www.example.com/private/file.pdf [content_type] => application/pdf [http_code] => 200 [header_size] => 264 [request_size] => 116 [filetime] => -1 [ssl_verify_result] => 0 [redirect_count] => 0 [total_time] => 0.007898 [namelookup_time] => 0.006777 [connect_time] => 0.006858 [pretransfer_time] => 0.006922 [size_upload] => 0 [size_download] => 27369 [speed_download] => 3465307 [speed_upload] => 0 [download_content_length] => 27369 [upload_content_length] => 0 [starttransfer_time] => 0.007839 [redirect_time] => 0 )

【问题讨论】:

  • “什么都不做”是什么意思? $info 中的输出和返回的错误是什么?
  • 不返回任何错误,在$info中返回200 OK,但下载不启动...

标签: php .htaccess curl file


【解决方案1】:

这里是工作代码,你犯了一个错误:curl_setopt($curl, CURLOPT_BINARYTRANSFER, 1);

$username = "MyUsername";
$password = "MyPassword";
$url = "http://www.example.com/private/file.pdf";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
$output = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=file.pdf");
echo ($output);

【讨论】:

    【解决方案2】:

    似乎缺少一个CURLOPT_BINARYTRANSFER 选项。您粘贴的输出是 $info 而不是 $output 顺便说一句。它显示下载发生了,download_content_length 是 27369。

    【讨论】:

      【解决方案3】:

      如果您尝试下载文件,则应使用CURLOPT_FILE 而不是RETURNTRANSFER = true。这会将下载的数据直接写入系统上的文件,而不会占用 PHP 的内存空间。请记住,PHP 通常在内存限制下运行,您可以通过下载大文件轻松超过它。

      使用RETURNTRANSFER 仅在您要对传输的数据进行内存处理时有用,例如将 HTML 加载到 DOM 系统中进行解析。

      试试这个:

      $ch = curl_init();
      curl_setopt($ch, CURLOPT_URL, $url);
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
      curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
      curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
      curl_setopt($ch, CURLOPT_FILE, "/name/of/file/to/write/to/on/your/machine");
      $output = curl_exec($ch);
      $info = curl_getinfo($ch);
      curl_close($ch);
      

      【讨论】:

      • 把文件复制到服务器就好了,但是我想把文件下载到我的电脑里,或者我的用户电脑里。
      • 这种情况下,完全消除returntransfer即可。默认情况下,curl 会将下载的任何内容输出到客户端。
      【解决方案4】:
      $username = "MyUsername";
      $password = "MyPassword";
      $url = "http://www.example.com/private/file.pdf";
      $ch = curl_init();
      curl_setopt($ch, CURLOPT_URL, $url);
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
      curl_setopt($curl, CURLOPT_BINARYTRANSFER, 1);
      curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
      curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
      $output = curl_exec($ch);
      $info = curl_getinfo($ch);
      curl_close($ch);
      header("Content-Type: application/octet-stream");
      header("Content-Disposition: attachment; filename=file.pdf");
      echo ($output);
      

      此代码有效,刚刚尝试使用 excel、word 和 pdf 文档。

      原始代码中缺少curl_setopt($curl, CURLOPT_BINARYTRANSFER, 1);、标头header("Content-Type: application/octet-stream"); header("Content-Disposition: attachment; filename=file.pdf"); 和回显echo ($output);

      感谢您的回答,特别是对于 CURLOPT_BINARYTRANSFER 选项的 chx!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-02-19
        • 1970-01-01
        • 1970-01-01
        • 2012-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多