Laden Sie Dateien in Laravel mit Response :: Download herunter

74

In der Laravel-Anwendung versuche ich, eine Schaltfläche in der Ansicht zu erhalten, mit der der Benutzer Dateien herunterladen kann, ohne zu einer anderen Ansicht oder Route zu navigieren. Jetzt habe ich zwei Probleme: (1) unten: Funktionsauslösung

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

(2) Die Schaltfläche "Herunterladen" sollte den Benutzer nicht zu einem beliebigen Ort navigieren, sondern nur Dateien in derselben Ansicht herunterladen, Meine aktuellen Einstellungen, und eine Ansicht an "/ download" weiterleiten.

Hier ist, wie ich versuche zu erreichen:

Taste:

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

Route :

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

Controller:

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

Antworten:

168

Versuche dies.

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"wird nicht funktionieren, da Sie den vollständigen physischen Pfad angeben müssen.

Update 20/05/2016

Laravel 5, 5.1, 5.2 oder 5. * Benutzer können anstelle der ResponseFassade die folgende Methode verwenden . Meine vorherige Antwort funktioniert jedoch sowohl für Laravel 4 als auch für Laravel 4 (die $headerÄnderung der Array-Struktur in assoziatives Array =>- der Doppelpunkt nach dem Löschen von 'Content-Type') - wenn wir diese Änderungen nicht vornehmen, werden Header falsch hinzugefügt : Der Name des Headers wird mit einer Nummer von 0,1, ...) beginnen.

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

return response()->download($file, 'filename.pdf', $headers);
Anam
quelle
1
Gibt es eine Möglichkeit, einen Dateidownload zurückzugeben UND die Ansicht zu aktualisieren?
Justin
Kann ich die Dateiberechtigungen nur beim Herunterladen ändern? @Anam
Eswara Reddy
@EswaraReddy, meinst du on fly? Das glaube ich nicht.
Anam
Wie kann ich einen beliebigen Dateityp herunterladen?
Itsazzad
4
@ JazzadTusharKhan nur verwendenreturn Response::download($pathToFile);
Anam
39

Das Herunterladen von Dateien ist in Laravel 5 sehr einfach .

Wie @Ashwani erwähnte, ermöglicht Laravel 5 das Herunterladen von Dateien mit response()->download()dem Zurückgeben von Dateien zum Herunterladen. Wir müssen uns nicht mehr mit Headern herumschlagen. Um eine Datei zurückzugeben, gehen wir einfach wie folgt vor:

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

aus dem Controller heraus.


Wiederverwendbare Download Route / Controller

Jetzt erstellen wir eine wiederverwendbare Dateidownloadroute und einen Controller, damit wir jede Datei in unserem public/filesVerzeichnis auf den Server bringen können .

Erstellen Sie den Controller:

php artisan make:controller --plain DownloadsController

Erstellen Sie die Route in app/Http/routes.php:

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

Download-Methode erstellen in 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);
  }
}

Legen Sie jetzt einfach einige Dateien im public/filesVerzeichnis ab und Sie können sie durch Verknüpfen mit /download/filename.ext:

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

Wenn Sie das HTML-Paket von Laravel Collective eingezogen haben, können Sie die HTML-Fassade verwenden:

{!! Html::link('download/filename.ext', 'File Name') !!}
DutGRIFF
quelle
Arbeitete wie ein Zauber, vielen Dank @DutGRIFF, Du hast meinen Tag gerettet. Ich habe dieses Download-Ding 5 Stunden lang ausprobiert, aber es hat nicht funktioniert. Ich habe keine Lösung erhalten, aber als ich Ihre Lösung ausprobiert habe, hat es wie ein Zauber funktioniert. Laravel rockt.
Prasad Patel
27

In der akzeptierten Antwort ist für Laravel 4 das Header-Array falsch aufgebaut. Verwenden:

$headers = array(
  'Content-Type' => 'application/pdf',
);
sebt
quelle
Der Unterschied in der Instanziierung des Arrays ist wahrscheinlich auf eine PHP-Version zurückzuführen, nicht auf eine Laravel-Version;)
ShaneMit
6

Einige dieser Lösungen schlagen vor, auf public_path () der Laravel-Anwendung zu verweisen, um die Datei zu finden. Manchmal möchten Sie den Zugriff auf die Datei steuern oder eine Echtzeitüberwachung der Datei anbieten. In diesem Fall möchten Sie das Verzeichnis privat halten und den Zugriff durch eine Methode in einer Controller-Klasse beschränken. Die folgende Methode sollte dabei helfen:

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

Es gibt auch andere Pfade, die Sie verwenden können. Diese sind in der Dokumentation zu den Hilfsfunktionen von Laravel beschrieben

Kirkland
quelle
Danke für Ihren Beitrag. Ich habe einen HTTP 500-Fehler erhalten, aber dies hat in meinem Fall funktioniert.
Redgren Grumbholdt
5

laravel 5Verwenden Sie diesen Code bei der Verwendung, da Sie keine Header benötigen.

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

Wenn Sie verwenden Fileentry, können Sie die folgende Funktion zum Herunterladen verwenden.

// download file
public function download($fileId){  
    $entry = Fileentry::where('file_id', '=', $fileId)->firstOrFail();
    $pathToFile=storage_path()."/app/".$entry->filename;
    return response()->download($pathToFile);           
}
Ashwani Panwar
quelle
2
Diese Antwort wäre hilfreich, wenn die unnötigen Teile weggelassen oder nur unter der reinen Antwort erweitert würden. Fileentryist eine andere Funktion, die für diese Frage nicht benötigt wird. Antwort bearbeiten und ich werde wegen der Erwähnung von LV5s upvoten response()->download().
DutGRIFF
3

Ich denke, dass Sie verwenden können

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

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

Damit sind Sie sicher, dass es sich um ein PDF handelt.

Ariel Ruiz
quelle
2

// Versuchen Sie dies, um eine beliebige Datei herunterzuladen. Laravel 5. *

// Sie müssen die Fassade "use Illuminate \ Http \ Response;" verwenden.

public function getDownload()
{

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

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

    return response()->download($file);
}
Rohit Ramani
quelle
2
 HTML link click 
<a class="download" href="{{route('project.download',$post->id)}}">DOWNLOAD</a>


// Route

Route::group(['middleware'=>['auth']], function(){
    Route::get('file-download/{id}', 'PostController@downloadproject')->name('project.download');
});

public function downloadproject($id) {

        $book_cover = Post::where('id', $id)->firstOrFail();
        $path = public_path(). '/storage/uploads/zip/'. $book_cover->zip;
        return response()->download($path, $book_cover
            ->original_filename, ['Content-Type' => $book_cover->mime]);

    }
Md.Azizur Rahman
quelle
0

Dies ist ein HTML-Teil

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

Dies ist Route:

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

Das ist Funktion:

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);      
}
Rishi
quelle
0

Wenn Sie die JavaScript-Download-Funktion verwenden möchten, können Sie dies auch tun

 <a onclick=“window.open(‘info.pdf) class="btn btn-large pull-right"><i class="icon-download-alt"> </i> Download Brochure </a>

Denken Sie auch daran, die Datei info.pdf in Ihr öffentliches Verzeichnis Ihres Projekts einzufügen

Atharva Kulkarni
quelle
0

Sie können einfach in Ihrem Controller verwenden: return response()->download($filePath); Happy Coding :)

RashedRahat
quelle
0

HTML href Link klicken:

<a ="{{ route('download',$name->file) }}"> Download  </a>

In der Steuerung:

public function download($file){
    $file_path = public_path('uploads/cv/'.$file);
    return response()->download( $file_path);
}

Auf der Route:

Route::get('/download/{file}','Controller@download')->name('download');
Aminul
quelle