web-dev-qa-db-ja.com

Response :: downloadを使用してlaravelのファイルをダウンロードします

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);
}
58
star18bit

これを試して。

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);
129
Anam

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') !!}
26
DutGRIFF

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

$headers = array(
  'Content-Type' => 'application/pdf',
);
26
sebt

これらのソリューションのかなりの数は、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のヘルパー関数のドキュメント で説明されている他のパスも使用できます

4
Kirkland

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);           
}
3
Ashwani Panwar

使えると思います

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

$headers = array(
        'Content-Type: ' . mime_content_type( $file ),
    );

これを使用すると、それがpdfであることを確認してください。

2
Ariel Ruiz

//これを試して、任意のファイルをダウンロードします。 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);
}
2
rohit ramani

これは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);      
}
0
Rishi