如何在symfony2中创建下载生成文档的链接?

Dav*_*er' 10 php symfony twig

文档由系统创建并保存到文件夹/ web/downloads.我创建了一个视图来显示链接,允许用户下载文件,如果用户单击链接.(标准点击下载功能)

我是Symfony2的新手,我正在绕过整个路由/控制器概念,但是如何在仍然坚持MVC的同时创建这些文件的链接?是否需要使用控制器设置路由或者树枝具有允许它的功能等.

PS:我读过如何在Symfony2中创建下载链接等问题?但如果他们在路由中做了某些事情或者只是添加了链接等,我就不会得到.

谢谢,

Mun*_*Das 38

样本实施将是,

创建路线,

download_route:
    pattern:  /download/{filename}
    defaults: { _controller: YourBundle:Controller:download }
Run Code Online (Sandbox Code Playgroud)

然后在你的控制器中,

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;
}
Run Code Online (Sandbox Code Playgroud)

要生成下载链接,请选中文档的生成网址部分.

  • @ChristianRiesen,我的方法的另一个用例是阻止浏览器处理文件.例如,您希望为用户提供下载图像或pdf文件的选项.如果安装了adobe插件,浏览器将自动显示图像或在浏览器中打开pdf.在标题中添加"Content-Disposition"将确保浏览器始终提示下载对话框. (2认同)

Chr*_*sen 7

我们来做个样子.

假设您的项目位于/ www /,因此/ www/web /是symfony2应用程序的文档根目录.现在,您尝试访问的所有内容都在/ www/web/over http:// server /将显示.

/www/web/downloads/file.zip 默认情况下可以在http://server/downloads/file.zip访问.


And*_*ndy 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;
    }

}
Run Code Online (Sandbox Code Playgroud)

来源:docs:http://symfony.com/doc/current/components/http_foundation/introduction.html

(应该适用于2.2以上的版本)


sch*_*kxx 5

只是将文件的路径添加到href属性对我来说不起作用.

单击时,它只显示文件而不真正下载它.

对我来说有用的是download在我的链接中添加属性,这是一个HTML5属性.只需像这样添加属性:

<a href="path/to/file" download>Download Link</a>
Run Code Online (Sandbox Code Playgroud)

点击链接后,它将只下载文件,没有任何服务器端代码.

您还可以为download属性指定值.

<a href="path/to/file" download="filename.txt">Download Link</a>
Run Code Online (Sandbox Code Playgroud)

download属性的值将用作下载文件的文件名,而不是存储在服务器上时使用的文件名.

我按照Symfony网站上关于文件上传处理的教程进行了操作.当我弄清楚如何为文件制作下载链接时,我发现它很有用.我刚刚向Document被调用的实体添加了一个方法,它只getDownloadFileName()返回我想要分配给download属性的文件名.

所以基本上,这就是我在Symfony项目的twig模板上实现它的方式

<a href="{{ asset(file.webPath) }}" download="{{ file.downloadFileName }}">
Download Link
</a>
Run Code Online (Sandbox Code Playgroud)