【问题标题】:PHP Pass File Handle to user so that file downloads & saves to their machinePHP将文件句柄传递给用户,以便文件下载并保存到他们的机器上
【发布时间】:2010-10-07 01:48:23
【问题描述】:

我正在从另一台服务器下载文件。我希望将此文件推送给我的用户,而不是将其保存到我的服务器。

换句话说,将文件句柄传递给他们,这样它就可以通过我的服务器并保存到他们的机器上。我怎样才能做到这一点?到目前为止我有这个:

$handle = fopen($_GET['fileURL'], 'r');
$filename = stream_get_contents($handle);

我如何将它推送给用户,也许使用标题?

感谢您的帮助和指导。

编辑

我有标题:

header("Pragma: public"); // required
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false);
header("Content-Type: $ctype");
header("Content-Disposition: attachment; filename=\"".basename($filename)."\";" );
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($filename));
readfile("$filename");

只是它不推送标题。我只是在大约 15 秒后得到一个空白页面,看起来像是在下载文件但没有给我。

我希望脚本立即将标头作为流发送给用户。 出口();

【问题讨论】:

    标签: php file http-headers save filestream


    【解决方案1】:

    你可以试试这个

    $filetype = mime_content_type($filename);
    header('Content-type: '.$filetype);
    header('Content-Disposition: attachment; filename="'.$filename.'"');
    

    为您的编辑更新:

    您是否禁用了错误,因为这听起来像是标头已发送错误?

    error_reporting(E_ALL | E_STRICT);
    

    【讨论】:

      【解决方案2】:

      使用readfile()时不必使用fopen();

      只需将文件名包含在 readfile() 中,如下所示:

      readfile($_GET['fileUrl']);
      

      虽然这在安全方面非常危险,因为用户可以指定文件服务器上的任何文件。如果您只有几个文件希望别人能够下载,也许您应该将它们存储在一个数组(或数据库,最好)中

      这是一个数组示例:

      $files = array('file1.jpg', 'file2.png', 'file3.pdf');
      //assume $_GET['file_id'] == 0, 1 or 2
      
      if (file_exists($files[$_GET['file_id']]))
          readfile($files[$_GET['file_id']]);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-26
        • 2015-10-20
        • 2011-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多