文档由系统创建并保存到文件夹/ web / downloads。我创建了一个视图来显示链接,允许用户下载文件,如果用户单击链接。 (标准点击下载功能)
我是Symfony2的新手并且正在绕过整个路由/控制器概念,但是如何在仍然坚持MVC的同时创建指向这些文件的链接?是否需要使用控制器设置路由或者树枝具有允许它的功能等。
PS: 我已经阅读了诸如How to create a download link in Symfony2?之类的问题,但如果他们在路由中做了某些事情或者只是添加了链接等,我就无法得到。
谢谢,
答案 0 :(得分:37)
示例实现将是,
创建路线
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;
}
用于生成文档的下载链接检查Generating urls部分。
答案 1 :(得分:7)
我们来做一个样本。
假设您的项目位于/ www /,因此/ www / web /是symfony2应用程序的文档根目录。现在,您尝试访问的所有内容都将显示在/ www / web / over http://server/中。
默认情况下,/www/web/downloads/file.zip可以http://server/downloads/file.zip访问。
答案 2 :(得分:5)
这是我到目前为止提出的最佳解决方案,它允许您从“/ 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;
}
}
源: docs:http://symfony.com/doc/current/components/http_foundation/introduction.html
(应该适用于2.2以上的版本)
答案 3 :(得分:5)
只是将文件的路径添加到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网站上关于文件上传处理的tutorial。当我弄清楚如何为文件制作下载链接时,我发现它很有用。我刚刚向名为Document
的{{1}}实体添加了一个方法,它只返回我想要分配给getDownloadFileName()
属性的文件名。
基本上,这是我在Symfony项目的树枝模板上实现它的方式
download
答案 4 :(得分:0)
不知道这是否适合你,但请记住另一个超简单的替代方案:
即。在你看来:
<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>
它打开文件,用户决定是否要打印,下载...等等。