0

有没有办法提供文件的直接链接并强制浏览器使用 PHP 下载它?

例如http://www.website.com/directory/file.jpg

我们在这里处理的是巨大的文件,特别是 Chrome 似乎在渲染图像时遇到了问题,所以用户在直接访问文件时看到的只是一个空白屏幕。即使他们仍然可以在空白屏幕上单击鼠标右键并下载文件,这也令人困惑。

我们曾经从 PHP 输出文件,但遇到了内存问题,因此转而提供直接链接。这些文件高达约 5GB,它们并非全是图像。我们有 zip、PDF、PSD 等。

目前,该文件是通过一个 PHP 脚本请求的,该脚本接受文件的 ID 并获取其 URL。然后 PHP 脚本将用户重定向到文件的完整 URL。

我们如何确保强制下载并且我们不会遇到较大文件的内存问题?

谢谢

4

3 回答 3

3

只需使用X-Sendfile,但您需要先配置它...使用XSendFilePath

if (file_exists($file)) {
    header("X-Sendfile: $file");
    header("Content-Type: application/octet-stream");
    header(sprintf("Content-Disposition: attachment; filename=\"%s\"", basename($file)));
    exit();
}

注意*$file在验证和提供文件之前,请确保已正确转义

XSendFilePath仅适用于其他服务器的 Apache 请参阅:缓存 HTTP 响应时它们由 PHP 动态创建

于 2013-07-09T09:35:59.930 回答
0

您需要设置headers强制下载

        $file = 'upload_directory_path/'.$image_name;

        if (file_exists($file)) {
            header('Content-Description: File Transfer');
            header('Content-Type: application/octet-stream');
            header('Content-Disposition: attachment; filename='.basename($file));
            header('Content-Transfer-Encoding: binary');
            header('Expires: 0');
            header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
            header('Pragma: public');
            header('Content-Length: ' . filesize($file));
            ob_clean();
            flush();
            readfile($file);
            exit;
        }
于 2013-07-09T09:18:46.173 回答
0
<?php 
//file path
$file = 'monkey.gif';

if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.basename($file));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    ob_clean();
    flush();
    readfile($file);
    exit;
}
于 2013-07-09T09:19:14.973 回答