Загрузка файла усекается, если вызывается Response.Close () - PullRequest
2 голосов
/ 16 ноября 2009

Хорошо, у меня есть страница, которая получает файл в виде байта [] от веб-службы, который я затем предоставляю пользователю для сохранения этого файла в диалоговом окне «Сохранить / Отменить». Этот файл может быть в формате xml или cvs. Когда файл загружен, файл является неполным, например, Вот что должен иметь файл:
USD, EUR, евро, 1.2,1.1,11 / 15 / 2009,15: 23: 27
USD, AUD, австралийский, 1.25,1.15,11 / 15 / 2009,15: 23: 27

но при сохранении из браузера он имеет только ::
USD, EUR, евро, 1.2,1.1,11 / 15 / 2009,15: 23: 27
USD, AUD, австралийский, 1.25,1.

вот мой код:

Response.Buffer = true;
Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName); 
Response.AddHeader("Content-Length", MyFile.Length.ToString()); 
FileInfo file = new FileInfo(fileName); 
Response.ContentType = Utility.ReturnExtension(file.Extension.ToLower()); 
Response.BinaryWrite(MyFile); 
Response.Flush(); 
Response.Close(); 
Response.End();

Я уже убедился, что байт [], который я получаю от веб-службы, в порядке, написав файл на моей машине, используя следующий код:

StreamWriter writer = null;
string blah = System.Text.ASCIIEncoding.ASCII.GetString(MyFile);
writer = File.CreateText(Server.MapPath(filePath+fileName));
writer.Write(blah);
writer.Close();
writer.Dispose();

Если я удаляю Close () и End (), тогда весь файл отображается с некоторым HTML-кодом со страницы. Я получаю полный файл (только в формате XML), если сначала создаю / записываю файл на локальном компьютере, а затем выполняю Response.TransmitFile (file).

Я не уверен, что я делаю неправильно. Может быть, это просто что-то очень простое. Любая помощь будет принята с благодарностью

Ответы [ 3 ]

8 голосов
/ 15 августа 2013

Я столкнулся с проблемой, когда CSV-файл усекался в ответе, если я позвонил Response.Close() после Response.Flush().

Мое решение было заменить это:

 try
 {
      response.BinaryWrite(contentBuffer);
 }
 finally
 {
      response.Flush(); 
      response.Close();
 }

С этим:

try
 {
      response.BinaryWrite(contentBuffer);
 }
 finally
 {
      response.End();
 }

Response.End() сбросит весь буферизованный контент для клиента. Попробуйте удалить Response.Close() из вашего обработчика ответа.

1 голос
/ 16 ноября 2009

Попробуйте удалить

Response.AddHeader("Content-Length", MyFile.Length.ToString()); 

И посмотрите, получите ли вы полный файл, когда сделаете это. Если вы это сделаете, то вы получите неверную длину из вашего файла.

0 голосов
/ 16 ноября 2009

Возможно, вы заполняете буфер ответов. Попробуйте отправить без буферизации или, если это не сработает, распределите файл по нескольким вызовам двоичного текста и очищайте буфер после каждого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...