Почему загруженный файл больше входного потока? - PullRequest
0 голосов
/ 05 марта 2019

Я пишу метод C #, чтобы получить MemoryStream и загрузить его в виде файла в браузере.Я загружаю файл .xlsx с помощью FileStream и копирую его в MemoryStream

using (FileStream fs = new FileStream(Filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
    docStream = new MemoryStream();
    fs.CopyTo(docStream);
}

Затем я передаю docStream в класс OpenXML

using (SpreadsheetDocument spreadSheet = SpreadsheetDocument.Open(docStream, true))

и обновляю содержимое с помощью классов и методов OpenXML.Наконец, я передаю docStream методу DownloadStream, но размер загруженного файла превышает размер потока.

public class Utility
{
    public static void DownloadStream(MemoryStream inputStream, string filename)
    {
        byte[] bytes = inputStream.ToArray();

        HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=" + filename);
        HttpContext.Current.Response.AddHeader("Content-Length", bytes.Length.ToString());
        HttpContext.Current.Response.ContentType = "application/octet-stream";
        HttpContext.Current.Response.BinaryWrite(bytes);
    }
}

Я установил точку останова и проверил, что inputStream.Lentgh равно 17112 байт.Я также подтвердил, что bytes.Length является 17112.

Когда я проверяю загружаемый файл (который является .xslx), его размер составляет 25983 байт.

Также, когда я открываю файл, я получаю предупреждение о том, что файл может быть поврежден, ноExcel может починить его.

1 Ответ

0 голосов
/ 05 марта 2019

Мне удалось решить проблему, найдя похожую проблему в SO.Это не было связано с кодированием.

Проблема была в том, что мне нужно было добавить:

HttpContext.Current.Response.End();

к моему методу DownloadStream после BinaryWrite.

public static void DownloadStream(MemoryStream inputStream, string filename)
{
    byte[] bytes = inputStream.ToArray();

    HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=" + filename);
    HttpContext.Current.Response.AddHeader("Content-Length", bytes.Length.ToString());
    HttpContext.Current.Response.ContentType = "application/octet-stream";
    HttpContext.Current.Response.BinaryWrite(bytes);
    HttpContext.Current.Response.End(); // This is the key
}
...