我无法通过Ajax下载XLS文件
function downloadFile(response) {
var blob = new Blob([response], {type: 'application/vnd.ms-excel'})
var url = URL.createObjectURL(blob);
location.assign(url);
}
$('#export').click(function () {
$.ajax({
type: 'POST',
url : 'factures/engagements/selected/export',
headers: {'X-CSRF-TOKEN': '{{ csrf_token() }}' },
dataType: "json",
data : {
checkboxes : checkboxValues
}
}).done(downloadFile);
});
我的控制器:
public function exportFacturesEngagementSelected(Request $request){
$checkboxes = $request->input('checkboxes');
$collection = collect($checkboxes);
$engagements = EngagementOrder::whereIn('id' , $collection)->get();
$date = Carbon::now('Europe/Paris')->format('d-m-Y H:i:s');
$output = Excel::create('factures_engagements' . $date. '', function($excel) use ($engagements) {
$excel->sheet('Excel', function($sheet) use ($engagements) {
$sheet->loadView('engagements.exportExcelSelected')->with("engagements", $engagements);
});
})->export('xls');
return $output;
}
我仅在控制台网络中获得文件的输出预览,但是在浏览器中什么也没有发生;没有文件下载。我究竟做错了什么?
尝试此
如果您的ajax成功完成
location.href = path/to/file/property_title.xls
更改此行
->export($type);
与
->store($type, 'public/reports/', true);
这些天我用过this package(我的建议),用于将模型的集合转换为XLS并将其导出。据我了解,您想通过AJAX下载文件。我一点也没有,但是我可以分享我的经验来帮助您。这可以处理普通的POST请求,但无论如何都不会刷新页面。因此,这是一个有效的示例:
public function export(Request $request) { $data = $request->get('data'); // get incoming data field return \Excel::download(new ExcelService($data), "custom-file-name-with-extension.xls"); }
namespace App\Services; use App\Models\Item; use Maatwebsite\Excel\Concerns\FromCollection; class ExcelService implements FromCollection { protected $data = null; public function __construct($data) { $this->data = $data; } public function collection() { $items = Item::where('data', $data)->get(); // some query using incoming $data return $items; } }
Route::post('export', 'ItemController@export')->name('export');
<iframe>
技巧下载文件。我猜到了控制器名称,请根据需要进行调整。web.php将路线更改为GET
。
Route::get('factures/engagements/selected/export', 'FactureController@exportFacturesEngagementSelected')->name('export');
根据控制器的要求序列化数据并发出请求。JavaScript函数
function downloadFile() {
var query;
$.each(checkboxValues, function(index,value) {
query += 'checkboxes=' + value + '&';
});
$('<iframe />')
.attr('src', '/factures/engagements/selected/export?' + query)
.hide()
.appendTo('body');
}
并使用控制器中的下载方法。FactureController.php
// ...
->download('xls');