Laravel 5.1, экспорт модели в CSV работает, но не загружается - PullRequest
1 голос
/ 06 мая 2019

Это маршрут для моего контроллера и метод:

Route::post('exportarDireccionTodos','MyController@exportarDireccionTodos');

Я звоню по этому маршруту от нажатия кнопки с JavaScript:

$.ajax({
    url: baseUrl+'exportarDireccionTodos',
    type: 'POST',
    data: {'id': optionsChecked},
    success: function(response) {
        //etc

MyController имеют этот код:

$delimiter=";";
$array = MyModel::findMany($todos)->toArray();
$filename = "direcciones.csv";
header("Content-Transfer-Encoding: UTF-8");
header('Content-Type: application/csv');
header('Content-Disposition: attachment; filename="'.$filename.'";');

$f = fopen('php://output', 'wb');

foreach ($array as $line) {
    fputcsv($f, $line, $delimiter);
}
fclose($f)

return response()->json([
    'status' => 'success',
    'mensaje' => 'Direcciones exportadas a CSV'
]);

Я отправляю id на свою модель, затем создаю CSV-файл, но я не могу его скачать, я просто вижу, что он довольно хорошо сделан в инструментах разработчика XHR, например:

enter image description here

Я пробовал с:

header('Content-Type: application/force-download');

header('Content-Type: text/csv');

И с:

return Response::download($f, $filename, $headers);  <-- here I got an error, Laravel 5.1 doesnt reconigze Response

то же самое с:

return response()->download($f, $filename);

Всегда происходит одно и то же, CSV создан, но не может загрузить. Я пробовал 2 других способа создания CSV, но он всегда хорошо сгенерирован, но не может быть загружен

Ответы [ 2 ]

1 голос
/ 06 мая 2019

Вы пропустили заголовки в вашем последнем звонке

return response()->download($f, $filename, $headers);

Я использую эти заголовки в своем приложении laravel для загрузки файла

$headers = [
        'Content-Type' => 'application/csv',
        "Content-Description" => "File Transfer",
        "Cache-Control" => "public",
        'Content-Disposition' => 'attachment; filename="'.$filename.'"',
];

Возможно, вам удастся временно сохранить файл и создать URL-адрес для загрузки с

$fs = Storage::disk('local')->temporaryUrl($path, now()->addMinutes(5));
0 голосов
/ 06 мая 2019

Ну, проблема в моей логике. Я не могу скачать файл с помощью вызова ajax. Я пытался с Laravel-Excel, но у меня была та же проблема с coruse.

Эта тема исправит мою проблему:

https://github.com/Maatwebsite/Laravel-Excel/issues/848

$response = array(
        'name' => "das",
        'file' => "data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,".base64_encode($archivo) //mime type of used format
    );

и в ajax:

var a = document.createElement("a");
a.href = response.file;
a.download = response.name;
document.body.appendChild(a);
a.click();
a.remove();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...