PHP Pass文件句柄给用户,以便文件下载&保存到他们的机器上

时间:2009-02-12 00:45:44

标签: php file http-headers save filestream

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

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

$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秒之后得到一个空白页面,看起来像下载文件但没有把它给我。

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

2 个答案:

答案 0 :(得分:4)

你可以试试这个

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

您的编辑更新:

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

error_reporting(E_ALL | E_STRICT);

答案 1 :(得分:0)

使用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']]);