У меня есть функция экспорта CSV, он работал нормально с Laravel. Но сейчас я хочу вызвать функцию экспорта через ajax и использовать метод post, но у меня нет ответа. Я могу отправить переменную из контроллера laravel в ответ, но не могу отправить файл загрузки.
Вот мой код:
route.php
Route::get('/title/show', 'TitleController@show');
Route::post('/title/show', 'TitleController@exportFromDB');
show.blade.php
<script>
$(document).ready(function () {
$('#exportFromDB').click(function () {
$.ajax({
url: "",
type: "post",
headers: {'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')},
data: {},
success: function (response) {
var a = document.createElement("a");
a.href = response.file;
a.download = response.name;
}
})
})
})
TitleController.php:
$dataExport['Oversea'] = $dataOversea;
$this->titleRepository->export('csv', $properties, $dataExport);
TitleRepository.php
public function export($type, $properties, $data)
{
if (in_array($type, self::EXPORT_TYPE)) {
try {
return Excel::create($properties['_title'], function ($excel) use ($data, $properties) {
$excel->setTitle($properties['_title']);
$excel->setCreator($properties['_creator'])
->setCompany($properties['_company']);
$excel->setDescription($properties['_description']);
$excel->sheet('Sheet', function ($sheet) use ($data) {
foreach ($data as $item) {
$sheet->fromArray($item);
}
});
})->export($type);
} catch (Exception $error) {
throw $error;
}
}
}
Как я могу их исправить? Благодарю
Попробуй это —
Не пишите код для экспорта в свой метод контроллера, вместо этого просто сохраните файл Excel в вашей общей папке.
Ваш метод контроллера должен вернуть имя файла.
На вашем успехе Ajax сделать это —
location.href = путь / к / файлу / property_title.xls
Так замени эту строчку
->export($type);
с
->store($type, 'public/reports/', true);
Я вижу твое значение AJAX NULL
Измените это на
url : "{{ action('TitleController@exportFromDB') }}"
После этого ответом являются данные, которые вы возвращаете в контроллер
success: function (response) {}
Я установил пакет maatwebsite / excel и смог сделать это без написания javascript. Все, что вам нужно сделать, это установить ссылку (или типичную публикацию формы, если вы предпочитаете) на действие, например, так:
public downloadItemsExcel() {
$items = Item::all();
Excel::create('items', function($excel) use($items) {
$excel->sheet('ExportFile', function($sheet) use($items) {
$sheet->fromArray($items);
});
})->export('xls');
}
Это работает как для CSV / Excel файлов. Нет перезагрузки страницы в браузере.
Сначала вы должны изменить метод POST на GET.
Для ajax вы можете сделать это так:
$(document).ready(function () {
$('#exportFromDB').click(function () {
$.get('/title/show, function(data){
window.location = '/title/show=' + data;
});
})
})