10

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

私は Symfony2 を初めて使用し、ルーティング/コントローラーの概念全体を回避していますが、MVC に準拠しながら、そのようなファイルへのリンクを作成するにはどうすればよいでしょうか? コントローラーでルーティングを設定する必要がありますか、それとも小枝にはそれを可能にする機能がありますか?

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

ダウンロード リンクの生成については、ドキュメントの「URL の生成」セクションを確認してください。

于 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 Web サイトのチュートリアルに従いました。ファイルのダウンロード リンクを作成する方法を考えていたときに役立ちました。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 に答える