Загрузка файла Excel через веб-API. Получение коррупции

Я пытаюсь загрузить файл excel через веб-API (используя платформу Entity). Загрузка работает, но я получаю диалоговое окно с ошибкой о повреждении файла при попытке открыть файл.

Код веб-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 завершил проверку и восстановление на уровне файлов. Некоторые части этой книги могли быть отремонтированы или удалены.

введите здесь описание изображения

введите здесь описание изображения


person user2739418    schedule 18.06.2015    source источник
comment
Опубликовать код загрузки файла. И примечание: возвращая InternalServerError при исключении в ненужном, это поведение веб-API по умолчанию.   -  person ranquild    schedule 19.06.2015
comment
Вы когда-нибудь решали это?   -  person Corpsekicker    schedule 28.01.2016
comment
Да. Я решил это. Ошибка в коде, загружающем файл на SQL Server. Загрузка прошла правильно. Итак, исправил загрузку, и все было в порядке. У вас есть похожая проблема? Код могу выложить, если найду.   -  person user2739418    schedule 01.02.2016
comment
У меня та же проблема. Я создаю файл excel с помощью EPPlus. Если я создаю его в консольном приложении и сохраняю в файловой системе, Excel работает нормально. Если я отправлю тот же поток, что и HttpResponseMessage в веб-API, я получу то же предупреждение о восстановлении. После того, как вы нажмете «Да», Excel откроется нормально. Но я хочу удалить это предупреждение.   -  person NLV    schedule 31.08.2016
comment
Возможно ошибка при загрузке! Можете ли вы вставить код для загрузки (веб-API)? У меня сейчас нет старого кода, так как он был сделан для одного клиента   -  person user2739418    schedule 02.09.2016
comment
Пять с половиной лет спустя... У меня та же проблема. Я создаю файл Excel на лету с помощью EPPlus в моем контроллере веб-API, а затем загружаю его с помощью HttpResponseMessage. Я получаю 14 КБ из ожидаемых 22 КБ. Если я сначала сохраню файл в файловой системе, с файлом все в порядке. Проблема, похоже, заключается в фрагментации ответа и/или gzip.   -  person Greg M.    schedule 05.03.2021


Ответы (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);
}

person Lukan    schedule 11.04.2021

У меня была такая же проблема, проблема не в коде веб-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');
                }
            });
person JenonD    schedule 13.04.2020