10

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

我是 Symfony2 的新手,并且正在了解整个路由/控制器的概念,但是如何在仍然遵守 MVC 的同时创建指向此类文件的链接?是否需要使用控制器设置路由,或者 twig 是否具有允许它的功能等。

PS:我已经阅读了诸如如何在 Symfony2 中创建下载链接之类的问题?但我不知道他们是否在路由中做了某些事情或只是添加了链接等。

谢谢,

4

5 回答 5

39

示例实现将是,

创建路线,

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;
}

要生成下载链接,请检查文档的生成 urls部分。

于 2012-04-12T12:38:00.130 回答
7

让我们做一个样本。

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

/www/web/downloads/file.zip 默认可以通过http://server/downloads/file.zip访问。

于 2012-04-12T11:55:28.237 回答
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;
    }

}

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

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

于 2013-12-18T12:36:31.547 回答
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 网站上关于文件上传处理的教程进行操作。当我弄清楚如何为文件创建下载链接时,我发现它很有帮助。Document我刚刚向被调用的实体添加了一个方法,getDownloadFileName()它只返回我想要分配给download属性的文件名。

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

<a href="{{ asset(file.webPath) }}" download="{{ file.downloadFileName }}">
Download Link
</a>
于 2015-02-03T09:08:04.630 回答
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>

它打开文件,用户可以决定是否要打印它,下载它......等等

于 2015-08-12T17:41:28.717 回答