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');
                }
            });
Другие вопросы по тегам