我正在从其他服务器下载文件。我希望将此文件推送给我的用户,而不是将其保存到我的服务器。
换句话说,将它们传递给文件句柄,使它只是通过我的服务器并保存到他们的机器上。我怎样才能做到这一点?到目前为止我有这个:
$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秒之后得到一个空白页面,看起来像下载文件但没有把它给我。
我希望脚本能够立即将标头作为流发送给用户。 出口();
答案 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']]);