web-dev-qa-db-ja.com

symfony2で生成されたドキュメントをダウンロードするためのリンクを作成するにはどうすればよいですか?

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

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

PS: Symfony2でダウンロードリンクを作成する方法は? などの質問を読んだことがありますが、ルーティングで何かを行ったのか、リンクを追加しただけなのかわかりません。

ありがとうございました、

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

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

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

7

サンプルの実装は、

ルートを作成し、

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

ダウンロードリンクチェックを生成するために RLの生成 ドキュメントのセクション。

38
Mun Mun Das

ファイルのパスを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のWebサイトで チュートリアル をフォローしました。ファイルのダウンロードリンクを作成する方法を考えていたときに、それが役に立ちました。 getDownloadFileName()というメソッドをDocumentエンティティに追加しました。このメソッドは、download属性に割り当てたいファイル名を返すだけです。

基本的に、これは私のSymfonyプロジェクトのtwigテンプレートに実装した方法です

_<a href="{{ asset(file.webPath) }}" download="{{ file.downloadFileName }}">
Download Link
</a>
_
5
schizoskmrkxx

これは私がこれまでに思いついた最良の解決策であり、「/ 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以降のバージョンで動作するはずです)

5
Andy

これがあなたに合っているかどうかはわかりませんが、これを別の非常に単純な代替案として覚えておいてください。

つまり、あなたの見解では:

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

ファイルが開き、ユーザーはファイルを印刷するか、ダウンロードするかを決定できます...など

0
lio89