Как вы передаете файл zip нажатием кнопки изображения в asp.net? - PullRequest
3 голосов
/ 06 марта 2009

Моя проблема: когда пользователь нажимает кнопку изображения на странице aspx, кодовое поле создает zip-файл, а затем я пытаюсь передать этот zip-файл пользователю.

Для потоковой передачи файла я использую следующий код:

FileInfo toDownload = new FileInfo(fullFileName);
if (toDownload.Exists)
{
   Response.Clear();
   Response.ContentType = "application/zip";
   Response.AppendHeader("Content-Disposition", "attachment;filename=" +
             toDownload.Name);
   Response.AppendHeader("Content-Length", toDownload.Length.ToString());
   Response.TransmitFile(fullFileName);
   HttpContext.Current.ApplicationInstance.CompleteRequest();
}

Когда я пытаюсь выполнить это, я получаю следующую ошибку на странице:

Sys.WebForms.PageRequestManagerParserErrorException: не удалось проанализировать сообщение, полученное с сервера. Распространенными причинами этой ошибки являются изменения ответа путем вызова Response.Write (), фильтров ответа, HttpModules или трассировки сервера. Подробности: Ошибка разбора рядом с 'PK ...'.

PK - это первые два символа в zip-файле, которые идентифицируют его как zip-файл, поэтому я знаю, что он пытается отправить zip-файл в браузер. Однако создается впечатление, что браузер пытается интерпретировать и / или визуализировать zip-файл, в то время как я хочу, чтобы он отображал параметр загрузки файла.

Идеи

РЕДАКТИРОВАТЬ: Вот ссылка на сообщение от парня, который написал выше сообщение об ошибке.

Ответы [ 3 ]

2 голосов
/ 06 марта 2009

Например, вот как я отправляю PDF клиенту в одном из моих приложений (вам нужно будет заполнить / изменить некоторые из пропущенных объявлений переменных):

        byte[] rendered = uxReportViewer.LocalReport.Render("PDF", null, out mimeType, out encoding, out extension, out streamIds, out warnings);

        Response.Buffer = true;
        Response.Clear();
        Response.ClearHeaders();
        Response.ContentType = mimeType;
        Response.CacheControl = "public";
        Response.AddHeader("Pragma", "public");
        Response.AddHeader("Expires", "0");
        Response.AddHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
        Response.AddHeader("Content-Description", "Report Export");
        Response.AddHeader("Content-Disposition", "attachment; filename=\"" + filename + "." + extension + "\"");

        Response.BinaryWrite(rendered);
        Response.Flush();
        Response.End();

Вы бы изменили тип содержимого и преобразовали свой zip-файл в байтовый массив, а затем, я думаю, вы можете заполнить остальные.

1 голос
/ 06 марта 2009

Я наконец решил проблему и также заметил, что, возможно, я не дал достаточно информации в вопросе: кнопка изображения находится внутри панели обновления.

Решением было создание PostBackTrigger для элемента управления:

<Triggers>
    <asp:PostBackTrigger ControlID="ibDownload" />
</Triggers>
0 голосов
/ 06 марта 2009

Парень, вы не используете DotNetZip для создания zip-файлов? Что если вы не создали zip-файл на диске, а только в памяти? В этом примере для этого используется DotNetZip.

    Response.Clear();
    Response.BufferOutput = false;
    String ReadmeText= "This is content that will appear in a file " + 
                       "called Readme.txt.\n" + 
                       System.DateTime.Now.ToString("G") ; 
    string archiveName= String.Format("archive-{0}.zip", 
                                      DateTime.Now.ToString("yyyy-MMM-dd-HHmmss")); 
    Response.ContentType = "application/zip";
    Response.AddHeader("content-disposition", "attachment; filename=" + archiveName);

    using (ZipFile zip = new ZipFile())
    {
        // add an entry from a string: 
        zip.AddEntry("Readme.txt", "", ReadmeText);
        zip.AddFiles(filesToInclude, "files");
        zip.Save(Response.OutputStream);
    }
    // Response.End();  // no - see http://stackoverflow.com/questions/1087777
    HttpContext.Current.ApplicationInstance.CompleteRequest();
...