вероятно. Но я решил эту проблему с помощью непосредственного создания XMLHttpRequest. Рабочий код в комментарии ниже.
я проблема с получением файла Excel и открытием окна загрузки в браузере после получения ответа (при успешном использовании метода ajax) с этим файлом. Я получил соответствующийContent-Type and Content-Disposition headers
Я пытался использоватькапля в JS, и я не мог добиться того, что я хочу - простая загрузка файлов.
Я выполнил несколько версий моего AJAX, одна из них ниже. Я разработал ajax, который возвращает файл Excel, который я не смог открыть должным образом, потому что он поврежден (несмотря на расширение .xlsx).
Может быть, проблема в неподходящем типе данных, используемом в конструкторе Blob?
Я попытался использовать «xhr.response» вместо «data» из аргументов метода успеха, но это тоже не сработало. Я проверил заголовки ответа в инструментах разработчика в Chrome, и они установлены правильно.
Важно то, что все книги Excel, созданные на стороне сервера, являются правильными, потому что они работали в предыдущей версии, когда данные отправлялись в URL, а не в записи AJAX.
Метод контроллера на стороне сервера Java / Spring ниже:
response.reset();
response.setContentType("application/vnd.ms-excel");
response.addHeader("Content-Disposition","attachment;filename=\"" + className + " " + title + ".xlsx\"");
try (ServletOutputStream output = response.getOutputStream()){
workbook.write(output);
output.flush();
} catch (Exception e) {
throw new RuntimeException(e);
}
Мой Ajax, чтобы скачать файл и открыть окно загрузки:
$.ajax({
url: myUrl,
type: 'POST',
data: myData,
success: function(data, status, xhr) {
var contentType = 'application/vnd.ms-excel';
var filename = "";
var disposition = xhr.getResponseHeader('Content-Disposition');
if (disposition && disposition.indexOf('attachment') !== -1) {
var filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/;
var matches = filenameRegex.exec(disposition);
if (matches != null && matches[1]) filename = matches[1].replace(/['"]/g, '');
}
console.log("FILENAME: " + filename);
try {
var blob = new Blob([data], { type: contentType });
var downloadUrl = URL.createObjectURL(blob);
var a = document.createElement("a");
a.href = downloadUrl;
a.download = filename;
document.body.appendChild(a);
a.click();
} catch (exc) {
console.log("Save Blob method failed with the following exception.");
console.log(exc);
}