文档由系统创建并保存到文件夹/web/downloads。我创建了一个视图来显示链接,如果用户单击链接,该链接将允许用户下载文件。(标准点击下载功能)
我是 Symfony2 的新手,并且正在了解整个路由/控制器概念,但是如何在遵守 MVC 的同时创建指向此类文件的链接?是否需要使用控制器设置路由,或者 twig 是否具有允许它的功能等。
附注:我读过诸如如何在Symfony2中创建下载链接之类的问题?但是我不明白他们是否在路由中做了什么或只是添加了链接等。
谢谢
示例实现将是,
创建路由,
download_route:
pattern: /download/{filename}
defaults: { _controller: YourBundle:Controller:download }
然后在您的控制器中,
public function downloadAction($filename)
{
$request = $this->get('request');
$path = $this->get('kernel')->getRootDir(). "/../web/downloads/";
$content = file_get_contents($path.$filename);
$response = new Response();
//set headers
$response->headers->set('Content-Type', 'mime/type');
$response->headers->set('Content-Disposition', 'attachment;filename="'.$filename);
$response->setContent($content);
return $response;
}
要生成下载链接,请查看文档的生成网址部分。
让我们做一个示例。
假设你的项目位于/www/中,所以/www/web/是你的 symfony2 应用程序的文档根目录。现在,您尝试访问的/www/web/中的所有内容都将显示 http://server/。
默认情况下,/www/web/downloads/file.zip 可以在 http://server/downloads/file.zip 访问。
只是将文件的路径添加到 href
属性对我不起作用。
单击时,它只显示文件而不真正下载它。
不过,对我有用的是向我的链接添加一个 download
属性,这是一个 HTML5 属性。 只需添加属性,如下所示:
<a href="path/to/file" download>Download Link</a>
单击链接后,它将下载文件,没有任何服务器端代码。
还可以为 download
属性赋值。
<a href="path/to/file" download="filename.txt">Download Link</a>
download
属性的值将用作下载文件的文件名,而不是存储在服务器上时使用的文件名。
我遵循了Symfony网站上关于文件上传处理的教程。 当我弄清楚如何为文件制作下载链接时,我发现它很有帮助。 我刚刚向Document
实体添加了一个名为 getDownloadFileName()
的方法,该方法仅返回我要分配给 download
属性的文件名。
所以基本上,这就是我在Symfony项目的树枝模板上实现它的方式。
<a href="{{ asset(file.webPath) }}" download="{{ file.downloadFileName }}">
Download Link
</a>
这是我迄今为止想出的最佳解决方案,它允许您从"/var/www/web/"文件夹外部提供下载,这使得文件不是无需运行此用于提供文件的脚本即可访问。
通过这种方式,您可以检查下载者是否有权下载他想要的文件。
在这个例子中,我使用了"/var/www/downloads/",其中存储了我想作为下载的所有文件:
/**
* http://api.symfony.com/2.2/Symfony/Component/HttpFoundation/BinaryFileResponse.html
*/
use Symfony'Component'HttpFoundation'BinaryFileResponse;
class OfflineToolController extends Controller
{
/**
* @return BinaryFileResponse
*/
public function downloadAction()
{
$path = $this->get('kernel')->getRootDir(). "/../downloads/";
$file = $path.'my_file.zip'; // Path to the file on the server
$response = new BinaryFileResponse($file);
// Give the file a name:
$response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT,'my_file_name.zip');
return $response;
}
}
源:文档:http://symfony.com/doc/current/components/http_foundation/introduction.html
(应该适用于 2.2 以上的版本)
不知道这是否适合你,但请记住另一个非常简单的替代方案:
即在您看来:
<a class='north' href="{{ asset('bundles/TP/Resume.pdf') }}" target="_blank" title="Download.pdf"><img src="{{ asset('bundles/TP/images/icn-save.jpg') }}" alt="Download the pdf version" /></a>
它打开文件,用户可以决定是否要打印它,下载它......等