93

Laravelアプリケーションでは、ユーザーが他のビューやルートに移動せずにファイルをダウンロードできるようにするビュー内のボタンを実現しようとしています今、2つの問題があります:(1)以下の関数スロー

The file "/public/download/info.pdf" does not exist

(2) ダウンロード ボタンは、ユーザーをどこにもナビゲートせず、同じビューでファイルをダウンロードするだけにする必要があります。私の現在の設定では、ビューを '/download' にルーティングします。

私が達成しようとしている方法は次のとおりです。

ボタン:

  <a href="/download" class="btn btn-large pull-right"><i class="icon-download-alt"> </i> Download Brochure </a>

ルート :

Route::get('/download', 'HomeController@getDownload');

コントローラー:

public function getDownload(){
        //PDF file is stored under project/public/download/info.pdf
        $file="./download/info.pdf";
        return Response::download($file);
}
4

12 に答える 12

196

これを試して。

public function getDownload()
{
    //PDF file is stored under project/public/download/info.pdf
    $file= public_path(). "/download/info.pdf";

    $headers = array(
              'Content-Type: application/pdf',
            );

    return Response::download($file, 'filename.pdf', $headers);
}

"./download/info.pdf"完全な物理パスを指定する必要があるため、機能しません。

2016 年 5 月 20 日更新

Laravel 5、5.1、5.2、または 5.* のユーザーは、Responseファサードの代わりに次のメソッドを使用できます。ただし、以前の回答は Laravel 4 または 5 の両方で機能します ($header配列構造が連想配列に変更されます。 =>「Content-Type」の後のコロンが削除されました。これらの変更を行わないと、ヘッダーが間違った方法で追加されます。 : ヘッダーの名前は、0,1,... から始まる番号になります)

$headers = [
              'Content-Type' => 'application/pdf',
           ];

return response()->download($file, 'filename.pdf', $headers);
于 2013-12-06T04:08:34.410 に答える
46

ファイルのダウンロードは、Laravel 5では非常にシンプルです。

@Ashwani が述べたように、Laravel 5 では、ファイルをダウンロードresponse()->download()てダウンロード用のファイルを返すことができます。ヘッダーをいじる必要はもうありません。ファイルを返すには、次のようにします。

return response()->download(public_path('file_path/from_public_dir.pdf'));

コントローラー内から。


再利用可能なダウンロード ルート/コントローラー

次に、再利用可能なファイル ダウンロード ルートとコントローラーを作成して、public/filesディレクトリ内の任意のファイルをサーバーにアップロードできるようにします。

コントローラーを作成します。

php artisan make:controller --plain DownloadsController

でルートを作成しますapp/Http/routes.php

Route::get('/download/{file}', 'DownloadsController@download');

でダウンロード方法を作るapp/Http/Controllers/DownloadsController

class DownloadsController extends Controller
{
  public function download($file_name) {
    $file_path = public_path('files/'.$file_name);
    return response()->download($file_path);
  }
}

ディレクトリにいくつかのファイルをドロップするだけで、以下public/filesにリンクすることでそれらをサーバー化できます/download/filename.ext

<a href="/download/filename.ext">File Name</a> // update to your own "filename.ext"

Laravel Collective の Html パッケージを取り込んだ場合は、Html ファサードを使用できます。

{!! Html::link('download/filename.ext', 'File Name') !!}
于 2016-01-26T16:28:17.333 に答える
28

受け入れられた回答では、Laravel 4 のヘッダー配列が正しく構築されていません。使用する:

$headers = array(
  'Content-Type' => 'application/pdf',
);
于 2014-02-19T17:44:07.480 に答える
2

// これを試して任意のファイルをダウンロードします。ララベル 5.*

// ファサードを使用する必要があります "use Illuminate\Http\Response;"

public function getDownload()
{

//PDF file is stored under project/public/download/info.pdf

    $file= public_path(). "/download/info.pdf";   

    return response()->download($file);
}
于 2016-08-08T03:45:55.150 に答える