一尘不染

Symfony2-强制文件下载

php

当用户单击下载链接时,我正在尝试下载文件。

在控制器中:

    $response = new Response();
    $response->headers->set('Content-type', 'application/octect-stream');
    $response->headers->set('Content-Disposition', sprintf('attachment; filename="%s"', $filename));
    $response->headers->set('Content-Length', filesize($filename));

    return $response;

这将打开对话框以保存文件,但它表示文件为0字节。并将其更改为:

        $response = new Response();
        $response->headers->set('Content-type', 'application/octect-stream');
        $response->headers->set('Content-Disposition', sprintf('attachment; filename="%s"', $filename));
        $response->headers->set('Content-Length', filesize($filename));
        $response->headers->set('Content-Transfer-Encoding', 'binary');
        $response->setContent(readfile($filename));

        return $response;

我得到了一堆奇怪的字符,而不是文件下载对话框。

最后,将“ setContent”行切换为:

    $response->setContent(file_get_contents($filename));

它返回一个PHP错误:

致命错误:允许的内存大小…

关于如何实现这一目标的任何线索?我以前在PHP(没有MVC)中做过,但是我不知道通过Symfony2可以做些什么…

也许解决方案是在PHP.INI中设置memory_limit,但是我认为这不是最佳实践。


阅读 344

收藏
2020-05-26

共1个答案

一尘不染

首先,感谢大家的答复。我终于在没有X-SendFile的情况下解决了这个问题(这可能是最佳实践)。无论如何,对于那些无法使X-Sendfile
apache模块正常工作(共享主机)的人,这是一个解决方案:

// Generate response
$response = new Response();

// Set headers
$response->headers->set('Cache-Control', 'private');
$response->headers->set('Content-type', mime_content_type($filename));
$response->headers->set('Content-Disposition', 'attachment; filename="' . basename($filename) . '";');
$response->headers->set('Content-length', filesize($filename));

// Send headers before outputting anything
$response->sendHeaders();

$response->setContent(file_get_contents($filename));

return $response;

希望这可以帮助!

2020-05-26