El problema es el mismo que se describe aquí Descarga de Laravel Excel usando Controller

Pero simplemente no puedo creer que no exista un método para lidiar con las descargas de Excel en Laravel sin usar otro recurso. Ya pude manejar las descargas instantáneas en el controlador con response() para archivos PDF.

¿Quizás los encabezados estén mal? Mi código:

public function getFile($file) {
    $path = storage_path('app/excel/exports/' . $file);

    $headers = array('Content-Type' => File::mimeType($path));

    return response()->download($path, $file, $headers);
}

Entonces, el archivo de Excel se crea y se guarda correctamente en mi carpeta de almacenamiento (ocurre antes del código anterior). Luego utilizo un método axios.get para descargar el archivo con la función anterior.

Encabezados que obtengo:

Accept-Ranges: bytes Cache-Control: public Conexión: mantener vivo Content-Disposition: adjunto; filename = "test_file.xlsx" Longitud del contenido: 7066 Tipo de contenido: application / vnd.openxmlformats-officedocument.spreadsheetml.sheet

Pero haga lo que haga o intente cambiar, la descarga no se iniciará.

1
Mango D 24 feb. 2018 a las 13:33

2 respuestas

La mejor respuesta

Logré solucionarlo.

Parece que no es posible resolver esto con una simple solicitud axios.get a la ruta. En su lugar, necesitaba abrir la ruta directamente con un enlace.

No funcionó con:

HTML <button @click="downloadExcel()">Download Table as Excel File</button>

downloadExcel() {
    axios.get('/customers/export');
}

Solución simple (en lugar de simplemente usar axios.get):

<a :href="/customers/export"><button>Download Table as Excel File</button></a>

Por lo tanto, también sería posible abrir la ruta después de la solicitud axios con:

downloadExcel() {
    let newWindow = window.open();
    axios.get('/customers/export')
       .then(response => {
         newWindow.location = 'http://' + window.location.hostname + '/customers/export';
       });
}
1
Mango D 25 feb. 2018 a las 10:47

Puedes probar con estos dos encabezados.

return response()->download($path, $file, [
     'Content-Type' => 'application/vnd.ms-excel',
     'Content-Disposition' => "attachment; filename='Report.xls'"
]);

Gracias

1
Pratik Mehta 24 feb. 2018 a las 12:54