2012-04-12 4 views
8

ドキュメントはシステムによって作成され、/ web/downloadsフォルダに保存されます。私はユーザーがリンクをクリックすると、ファイルをダウンロードすることができるリンクを表示するためのビューを作成しました。 (標準のクリックしてダウンロードする機能)symfony2で生成されたドキュメントをダウンロードするためのリンクを作成するには?

私はSymfony2を初めて使っていて、ルーティング/コントローラ全体のコンセプトを取り入れていますが、MVCを遵守しながら、どのようにそのようなファイルへのリンクを作成しますか?コントローラとのルーティングを設定する必要がありますか、それを可能にする機能があります。

PS: How to create a download link in Symfony2?などの質問がありますが、ルーティングに何かやった

ありがとう、

答えて

6

サンプルを作ってみましょう。

あなたのプロジェクトは/ www /にありますので、/ www/web /はsymfony2アプリケーションのドキュメントルートです。今アクセスしようとするものはすべて、/ www/web/http://server/を超えて表示されます。

/www/web/downloads/file.zipにはデフォルトでhttp://server/downloads/file.zipにアクセスできます。

+0

ok、ちょうど私があなたが言っていることを理解していることを確認する。 単純にhref = "/ downloads/filename.extention"を持つ通常のリンクを(ビュー内に)構築し、symfonyは残りの部分を処理してhttp://server/downloads/filename.extentionとして出力します作品ですか? – ddtpoison777

+0

私はそれを使用したすべての場合、はい。 –

34

サンプル実装は

は、ドキュメントのダウンロードリンクチェックGenerating urlsセクションを生成するために、あなたのコントローラで

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

をルートを作成し、なります。

+0

このコントローラを使用していただきありがとうございます。どのように動作するか見るために実装されます。 – ddtpoison777

+0

クリスチャンの答えは、私が持っていた問題のスコープにとって適切なものであったので、私はそれを認めました。しかし、あなたの答えも正しいですし、プロジェクトの他の分野でもそれを使うつもりです。もう一度ありがとうございます。 – ddtpoison777

+1

私はこの回答をupvotedしました。この問題は、単に公にリンク可能なファイルであれば、このように解決すべきではありません。パブリックウェブスペースの外側にあるファイル(Apacheのエイリアスなど)にリンクできないファイルや、適用されるロジック(アクセス制限、IP制限など)が必要な場合にのみ、このアプローチを使用してくださいアプリケーションの内部を制御する必要があります。 –

5

これはこれまでに思いついた最善の解決策です。このスクリプトを実行することなく、 にアクセスできないファイルを "/ var/www/web /"フォルダの外部からダウンロードすることができますファイルを提供する。

この方法で、ダウンローダが必要なファイルをダウンロードする権限を持っているかどうかを確認できます。

/** 
* 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

は(はず私は "の/ var/www /のダウンロードは/" 私はダウンロードとして提供したいすべてのファイルを保存する場所を使用この例では

上記のバージョンでの作業)

+0

Symfonyのどのバージョンがこれで動作するはずですか?私は私の中ではないと思う(2.0)。私は知っている、私は非常に古いものと一緒に働いています... – ElPiter

+0

これはどんなバージョンであったかわからない、私は私の答えの日付によると2.2と思います。 – Andy

4

ファイルのパスをhref属性に追加するだけでは機能しませんでした。

クリックすると、実際にダウンロードすることなくファイルが表示されます。

HTML5属性のリンクにdownloadという属性を追加していますが、私にとってはうまくいきました。

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

それがファイルを開くと、彼はそれをダウンロードし、それを印刷したい場合、ユーザが決定している...など

関連する問題