In der Laravel-Anwendung versuche ich, eine Schaltfläche in der Innenansicht zu erstellen, mit der der Benutzer die Datei herunterladen kann, ohne zu einer anderen Ansicht oder Route zu navigieren Jetzt habe ich zwei Probleme: (1) unterhalb der Funktionsausgabe
The file "/public/download/info.pdf" does not exist
(2) Die Download-Schaltfläche sollte den Benutzer nicht zu einem beliebigen Ort navigieren, sondern nur Dateien in derselben Ansicht herunterladen. Meine aktuellen Einstellungen. Routing einer Ansicht zu "/ download".
So versuche ich 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', 'HomeC[email protected]');
Controller:
public function getDownload(){
//PDF file is stored under project/public/download/info.pdf
$file="./download/info.pdf";
return Response::download($file);
}
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 von Response
facade die folgende Methode verwenden. Meine vorherige Antwort wird jedoch sowohl für Laravel 4 als auch für 5 funktionieren. (Die Struktur des $header
-Arrays ändert sich in das assoziative Array =>
- der Doppelpunkt, nachdem 'Content-Type' gelöscht wurde. Wenn Sie diese Änderungen nicht vornehmen, werden die Header hinzugefügt falscher Weg: Der Name der Kopfzeile wird mit einer Nummer von 0,1, ... beginnen.
$headers = [
'Content-Type' => 'application/pdf',
];
return response()->download($file, 'filename.pdf', $headers);
In der akzeptierten Antwort für Laravel 4 ist das Header-Array falsch aufgebaut. Benutzen:
$headers = array(
'Content-Type' => 'application/pdf',
);
Dateidownloads sind in Laravel 5 sehr einfach.
Wie von @Ashwani erwähnt, erlaubt Laravel 5 Dateidownloads mit response()->download()
, die Datei zum Herunterladen zurückzugeben. Wir müssen uns nicht länger mit Kopfzeilen beschäftigen. Um eine Datei zurückzugeben, müssen wir einfach:
return response()->download(public_path('file_path/from_public_dir.pdf'));
aus dem Controller heraus.
Wiederverwendbare Download-Route/Controller
Lassen Sie uns nun eine wiederverwendbare Route und einen Controller für das Herunterladen von Dateien erstellen, sodass wir alle Dateien in unserem Verzeichnis public/files
speichern 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}', '[email protected]');
Downloadmethode in app/Http/Controllers/DownloadsController
erstellen:
class DownloadsController extends Controller
{
public function download($file_name) {
$file_path = public_path('files/'.$file_name);
return response()->download($file_path);
}
}
Nun werden einfach einige Dateien im Verzeichnis public/files
abgelegt, 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 Laravel Collective's Html-Paket abgerufen haben, können Sie die Html-Fassade verwenden:
{!! Html::link('download/filename.ext', 'File Name') !!}
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 sollten Sie das Verzeichnis privat halten und den Zugriff durch eine Methode in einer Controller-Klasse einschrä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 ebenfalls verwenden können, beschrieben auf Laravel's Helper-Funktionsdokumentation
Verwenden Sie bei der Verwendung von laravel 5
diesen Code, da Sie keine Header benötigen.
return response()->download($pathToFile);
.
Wenn Sie Fileentry
verwenden, können Sie die unten stehende 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);
}
Ich denke, dass du verwenden kannst
$file= public_path(). "/download/info.pdf";
$headers = array(
'Content-Type: ' . mime_content_type( $file ),
);
Damit stellen Sie sicher, dass es sich um ein pdf handelt.
// Versuchen Sie dies, um eine Datei herunterzuladen. Laravel 5. *
// Sie müssen Fassade verwenden "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);
}
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 die Route:
Route::get('/download/{id}', 'users\[email protected]')->name('download')->middleware('auth');
Dies 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);
}