Laravelアプリケーションでは、ユーザーが他のビューやルートに移動せずにファイルをダウンロードできるようにするビュー内のボタンを達成しようとしています。2つの問題があります。
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);
}
これを試して。
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
facadeの代わりに次のメソッドを使用できます。ただし、私の以前の答えはLaravel 4または5の両方で機能します($header
配列構造は連想配列=>
に変更されます-'Content-Type'が削除された後のコロン-変更しない場合ヘッダーは間違った方法で追加されます:ヘッダーの名前は0,1、...から始まる番号になります)
$headers = [
'Content-Type' => 'application/pdf',
];
return response()->download($file, 'filename.pdf', $headers);
Laravel 5では、ファイルのダウンロードは非常に簡単です。
@Ashwaniが述べたように、Laravel 5では、 file downloads with 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') !!}
受け入れられた回答では、Laravel 4の場合、ヘッダー配列は正しく構築されていません。つかいます:
$headers = array(
'Content-Type' => 'application/pdf',
);
これらのソリューションのかなりの数は、Laravelアプリケーションのpublic_path()を参照してファイルを見つけることを推奨しています。ファイルへのアクセスを制御したり、ファイルのリアルタイム監視を提供したい場合があります。この場合、ディレクトリをプライベートに保ち、コントローラークラスのメソッドによってアクセスを制限する必要があります。これには次の方法が役立ちます。
public function show(Request $request, File $file) {
// Perform validation/authentication/auditing logic on the request
// Fire off any events or notifiations (if applicable)
return response()->download(storage_path('app/' . $file->location));
}
Laravelのヘルパー関数のドキュメント で説明されている他のパスも使用できます
laravel 5
を使用している間は、ヘッダーが不要なのでこのコードを使用します。
return response()->download($pathToFile);
。
Fileentry
を使用している場合、以下の機能を使用してダウンロードできます。
// download file
public function download($fileId){
$entry = Fileentry::where('file_id', '=', $fileId)->firstOrFail();
$pathToFile=storage_path()."/app/".$entry->filename;
return response()->download($pathToFile);
}
使えると思います
$file= public_path(). "/download/info.pdf";
$headers = array(
'Content-Type: ' . mime_content_type( $file ),
);
これを使用すると、それがpdfであることを確認してください。
//これを試して、任意のファイルをダウンロードします。 laravel 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);
}
これはhtmlパーツです
<a href="{{route('download',$details->report_id)}}" type="button" class="btn btn-primary download" data-report_id="{{$details->report_id}}" >Download</a>
これはルートです:
Route::get('/download/{id}', 'users\UserController@getDownload')->name('download')->middleware('auth');
これは機能です:
public function getDownload(Request $request,$id)
{
$file= public_path(). "/pdf/"; //path of your directory
$headers = array(
'Content-Type: application/pdf',
);
return Response::download($file.$pdfName, 'filename.pdf', $headers);
}