Excel файл скачать через веб-интерфейс. Испорчен
Я пытаюсь загрузить файл Excel через Web API (используя Entity Framework). Загрузка работает, но я получаю диалоговое окно с ошибкой о повреждении файла при попытке открыть файл.
Код веб-API, как показано ниже:
public HttpResponseMessage GetValue(int ID, string name)
{
MemoryStream stream;
try {
using (DataContext db = new DataContext()) {
dynamic fileObj = (from c in db.FileList c.ID == IDc).ToList();
stream = new MemoryStream(fileObj(0).File);
HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
result.Content = new StreamContent(stream);
result.Content.Headers.ContentType = new MediaTypeHeaderValue(fileObj(0).FileContentType);
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = name };
return result;
}
} catch (Exception ex) {
return Request.CreateResponse(HttpStatusCode.InternalServerError);
}
}
Он открывает файл с двумя сообщениями об ошибках и следующим сообщением.
Excel завершил проверку и восстановление на уровне файлов. Некоторые части этой книги, возможно, были отремонтированы или выброшены
2 ответа
Пытаюсь решить так же. Я сравнил 2 версии epplus: 4.5.3.3 против 5.2.1. Последний включал в себя код для закрытия потока в процедуре GetAsByteArray. Итак, я просто добавил эти строки в версию 4.5.3.3, и все заработало как часы. Похоже, что поток изначально включал в себя некоторые фрагменты мусора, которые необходимо удалить перед закачкой данных файла в этот поток. Протестировано с веб-приложением NetCore 3.1. Надеюсь, это решит проблему в вашем случае.
if (save)
{
Workbook.Save();
_package.Close();
/* start of added code */
if (_stream is MemoryStream && _stream.Length > 0)
{
CloseStream();
}
/* end of added code */
_package.Save(_stream);
}
У меня была такая же проблема, проблема не в коде веб-API, а в коде на стороне клиента. Для меня я использовал jquery. Следующий код исправил это для меня.
Я создавал каплю из результата, что не требуется, поскольку результат уже является каплей.
window.URL.createObjectURL(result);
Обратите внимание, что я создаю объект сразу после получения результата. Полный код JQuery ниже.
Кредит идет на mgracs здесь
$.ajax({
type: 'POST',
url: url + "/download",
data: data,
xhr: function () {
var xhr = new XMLHttpRequest();
xhr.responseType = 'blob'
return xhr;
},
success: function (result, status, xhr) {
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, '');
}
var link = document.createElement('a');
link.href = window.URL.createObjectURL(result);
link.download = filename;
link.click();
}, error: function (a, b) {
console.log('Error');
}
});