php - from - response helper laravel
Descargar archivos en laravel usando Response:: descargar (7)
En la aplicación Laravel estoy tratando de lograr un botón dentro de la vista que pueda permitir al usuario descargar el archivo sin navegar a ninguna otra vista o ruta. Ahora tengo dos problemas: (1) debajo de la función de arrojar
The file "/public/download/info.pdf" does not exist
(2) El botón Descargar no debe desplazar al usuario a ninguna parte y solo descargar archivos en una misma vista, Mi configuración actual, enrutar una vista para ''descargar''
Así es como estoy tratando de lograr:
Botón:
<a href="/download" class="btn btn-large pull-right"><i class="icon-download-alt"> </i> Download Brochure </a>
Ruta:
Route::get(''/download'', ''HomeController@getDownload'');
Controlador :
public function getDownload(){
//PDF file is stored under project/public/download/info.pdf
$file="./download/info.pdf";
return Response::download($file);
}
// Intenta esto para descargar cualquier archivo. laravel 5. *
// necesita usar la fachada "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);
}
Algunas de estas soluciones sugieren hacer referencia a public_path () de la aplicación Laravel para ubicar el archivo. Algunas veces querrá controlar el acceso al archivo u ofrecer una monitorización en tiempo real del archivo. En este caso, querrá mantener el directorio privado y limitar el acceso mediante un método en una clase de controlador. El siguiente método debería ayudar con esto:
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));
}
Existen otros caminos que también podría usar, descritos en la documentación de las funciones auxiliares de Laravel.
Creo que puedes usar
$file= public_path(). "/download/info.pdf";
$headers = array(
''Content-Type: '' . mime_content_type( $file ),
);
Con esto, puedes estar seguro de que es un pdf.
En la respuesta aceptada, para Laravel 4 el conjunto de encabezados está incorrectamente construido. Utilizar:
$headers = array(
''Content-Type'' => ''application/pdf'',
);
Las descargas de archivos son súper simples en Laravel 5 .
Como @Ashwani mencionó, Laravel 5 permite descargas de archivos con response()->download()
para devolver el archivo para su descarga. Ya no necesitamos meternos con ningún encabezado. Para devolver un archivo simplemente:
return response()->download(public_path(''file_path/from_public_dir.pdf''));
desde dentro del controlador.
Ruta de descarga / controlador reutilizable
Ahora hagamos una ruta de descarga de archivos reutilizable y un controlador para que podamos server cualquier archivo en nuestro directorio public/files
.
Crea el controlador:
php artisan make:controller --plain DownloadsController
Crea la ruta en la app/Http/routes.php
:
Route::get(''/download/{file}'', ''DownloadsController@download'');
Hacer el método de descarga en la 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);
}
}
Ahora simplemente suelta algunos archivos en el directorio public/files
y puede /download/filename.ext
al enlazar a /download/filename.ext
:
<a href="/download/filename.ext">File Name</a> // update to your own "filename.ext"
Si seleccionó el paquete Html de Laravel Collective, puede usar la fachada Html:
{!! Html::link(''download/filename.ext'', ''File Name'') !!}
Mientras usa laravel 5
use este código ya que no necesita encabezados.
return response()->download($pathToFile);
.
Si está utilizando Fileentry
, puede utilizar la siguiente función para descargar.
// download file
public function download($fileId){
$entry = Fileentry::where(''file_id'', ''='', $fileId)->firstOrFail();
$pathToFile=storage_path()."/app/".$entry->filename;
return response()->download($pathToFile);
}
Prueba esto.
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"
no funcionará ya que tiene que dar una ruta física completa.
Actualización 20/05/2016
Laravel 5, 5.1, 5.2 o 5. * los usuarios pueden usar el siguiente método en lugar de Response
Fachada. Sin embargo, mi respuesta anterior funcionará tanto para Laravel 4 como para 5. (la estructura del array $header
cambia a array asociativo =>
- los dos puntos después de que se eliminó ''Content-Type'' - si no hacemos esos cambios, los encabezados serán agregado de manera incorrecta: el nombre del encabezado será el número iniciado a partir de 0,1, ...)
$headers = [
''Content-Type'' => ''application/pdf'',
];
return response()->download($file, ''filename.pdf'', $headers);