Я возвращаю файл Excel (который отлично работает) в виде потока октетов из C# API, используя FileContentResult(byte[], MediaTypeNames.Application.Octet, "file.xlsx"
а затем я хочу открыть приглашение для загрузки файла из js, и все работает нормально, за исключением того, что файл поврежден
Я пробовал различные решения из этих сообщений, и файл Excel всегда приводил к повреждению.
JavaScript: создать и сохранить файл
Имя файла большого двоичного объекта JavaScript без ссылки
а также FileSaver.js
$.ajax({
url: url,
type: 'POST',
data: formData,
processData: false,
contentType: 'application/json',
success: function (result)
{
saveFile(result);
}
});
Я знаю, что этот файл работает нормально, потому что когда я тестирую его через Swagger, он работает нормально.
Есть идеи?
Обходной путь:
Возвращение base64 этого файла и создание элемента a
на этой странице с атрибутом href
, который имеет значение
data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,
а затем добавьте свой base64
к этому значению, так что
'data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,'+base64
а затем выполните .click()
по этой ссылке
Преобразование Base64, закодированного в XSLX
Вы можете указать имя файла, используя атрибут download = ""
Что сработало для меня, так это добавить responseType: 'arraybuffer'
к ajax:
$.ajax({
url: url,
type: 'POST',
data: formData,
contentType: false,
processData: false,
xhrFields: {
responseType: 'arraybuffer'
},
success: function (data) {
const blob = new Blob([data]);
saveAs(blob, "output.xlsx");
}
});