developer tip

Response :: download를 사용하여 laravel에서 파일 다운로드

optionbox 2020. 12. 6. 21:27
반응형

Response :: download를 사용하여 laravel에서 파일 다운로드


Laravel 애플리케이션에서 사용자가 다른보기 또는 경로로 이동하지 않고 파일을 다운로드 할 수있는보기 내부 버튼을 얻으려고합니다. 이제 두 가지 문제가 있습니다. (1) 아래 함수 던지기

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

(2) 다운로드 버튼은 사용자를 어디로 든 이동하지 않고 동일한보기, 내 현재 설정에서 파일을 다운로드하고보기를 '/ 다운로드'로 라우팅해야합니다.

내가 달성하려는 방법은 다음과 같습니다.

단추:

  <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파사드 대신 다음 방법을 사용할 수 있습니다 . 그러나 이전 답변은 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는 파일 다운로드허용하여 파일 다운로드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',
);

Quite a few of these solutions suggest referencing the public_path() of the Laravel application in order to locate the file. Sometimes you'll want to control access to the file or offer real-time monitoring of the file. In this case, you'll want to keep the directory private and limit access by a method in a controller class. The following method should help with this:

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

There are other paths that you could use as well, described on Laravel's helper functions documentation


While using laravel 5 use this code as you don`t need headers.

return response()->download($pathToFile); .

If you are using Fileentry you can use below function for downloading.

// download file
public function download($fileId){  
    $entry = Fileentry::where('file_id', '=', $fileId)->firstOrFail();
    $pathToFile=storage_path()."/app/".$entry->filename;
    return response()->download($pathToFile);           
}

// Try this to download any file. laravel 5.*

// you need to use facade "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);
}

I think that you can use

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

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

With this you be sure that is a pdf.


This is html part

 <a href="{{route('download',$details->report_id)}}" type="button" class="btn btn-primary download" data-report_id="{{$details->report_id}}" >Download</a>

This is Route :

Route::get('/download/{id}', 'users\UserController@getDownload')->name('download')->middleware('auth');

This is function :

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

참고URL : https://stackoverflow.com/questions/20415444/download-files-in-laravel-using-responsedownload

반응형