2012-04-12 67 views
8

文件由系統創建並保存到文件夾/ web/downloads。如果用戶點擊鏈接,我創建了一個視圖來顯示允許用戶下載文件的鏈接。 (標準點擊下載功能)如何在symfony2中創建一個下載生成文檔的鏈接?

我是Symfony2的新手,並且正在解決整個路由/控制器的概念,但是如何在創建一個鏈接到這些文件的同時仍然遵守MVC?是否需要設置路由與控制器或枝具有允許它等功能

PS: 我已閱讀的問題,如How to create a download link in Symfony2?但我不明白,如果他們做了一些路由或只是添加鏈接等

謝謝

回答

6

讓我們做一個樣品。

假設您的項目位於/ www /,所以/ www/web /是symfony2應用程序的文檔根目錄。現在,您嘗試訪問的所有內容都將顯示在/ www/web/over http://server/中。

/www/web/downloads/file.zip默認爲http://server/downloads/file.zip

+0

好吧,只是爲了仔細檢查我明白你在說什麼。 我構建了一個正常的鏈接(在視圖內),它只包含href =「/ downloads/filename.extention」,symfony會處理剩下的部分,使其成爲http://server/downloads/filename.extention,然後作品? – ddtpoison777 2012-04-12 12:16:41

+0

在所有的情況下,我用它,是的。 – 2012-04-12 12:22:53

34

樣品實施將是

創建路線,

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

爲了生成下載鏈接檢查DOC的Generating urls部分。

+0

謝謝你使用這個基於控制器的例子。將執行以查看它是如何工作的。 – ddtpoison777 2012-04-12 12:49:34

+0

我將Christian的答案標記爲接受,因爲它是我遇到的問題範圍的適當答案。但是你的回答也是正確的,我們打算在項目的其他領域使用它。再一次感謝你。 – ddtpoison777 2012-04-13 06:21:49

+1

我也贊成這個答案,因爲這是一個選擇。儘管如此,這個問題永遠不能以這種方式解決,如果它只是一個可公開鏈接的文件。只有在公共Web空間之外的文件中使用這種方法時,您不能將它們與別的東西(比如apache中的別名)連接起來,或者當您需要應用邏輯時(訪問限制,IP限制等),你需要控制你的應用程序。 – 2012-04-13 09:42:37

5

這是我想出了迄今爲止最好的解決方案,它可以讓你從你的「/無功/網絡/網絡/」文件夾,這使得該文件不 訪問,無需運行此腳本用來之外提供下載提供文件。

這樣你可以檢查下載器是否有權下載他想要的文件。

在這個例子中,我用 「的/ var/WWW /下載/」 在那裏我存儲的文件,我想作爲一個下載:

/** 
* 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以上的版本上工作)

+0

Symfony的這個版本應該在哪裏工作?我想不是在我的(2.0)。我知道,我與一個很老的... – ElPiter 2015-09-13 17:04:00

+0

不知道這是什麼版本,我認爲2.2根據我的答案的日期,我知道我們使用了當時的最新版本。 – Andy 2015-09-15 11:35:33

4

只需將文件的路徑添加到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實體添加了一個名爲getDownloadFileName()的實體,該實體只返回要分配給download屬性的文件名。

所以基本上,這是我如何實現它在我的Symfony項目的樹枝模板

<a href="{{ asset(file.webPath) }}" download="{{ file.downloadFileName }}"> 
Download Link 
</a> 
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> 

它打開該文件,如果他想打印,下載用戶已經決定...等

相關問題