ASP.NET загрузка программного файла - PullRequest
1 голос
/ 01 февраля 2010

Итак, у меня есть страница, на которой я динамически генерирую таблицу и кнопки ссылок внутри большой панели обновления. Каждая кнопка ссылки при нажатии будет вызывать этот метод. Цель состоит в том, чтобы иметь ссылку на файл в моей БД и при щелчке по нему разрешать пользователю открывать / сохранять этот файл. Этот точный метод отлично работает на другой странице моего сайта с такой же настройкой, но на этом я получаю:

Ошибка времени выполнения Microsoft JScript: Sys.WebForms.PageRequestManagerParserErrorException: Не удалось проанализировать сообщение, полученное с сервера. Распространенные причины этой ошибки: изменение ответа путем вызова Response.Write (), фильтров ответа, HttpModules или трассировки сервера. Подробности: Ошибка разбора около '% PDF-1.3 % 1 0 ob '.

public void downloadFile(int fileID)
    {
        using (SurveyDataContext context = new SurveyDataContext())
        {
            try
            {
                var file = context.tblFiles.Single(f => f.FileID == fileID);
                Response.Clear();
                Response.Buffer = true;
                Response.BufferOutput = true;
                Response.ContentType = file.MIMEtype;
                Response.AppendHeader("Content-Disposition", "attachment; filename=\"" + file.FileName.Trim() + "\"");
                Response.AddHeader("Extension", file.FileName.Substring(
                    file.FileName.LastIndexOf('.') + 1).ToLower());
                Response.BinaryWrite(file.FileData.ToArray());

                Response.Flush();
                Response.End();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                Console.WriteLine(e.InnerException);
            }
        }
    }

Что я делаю не так? Я не делаю никаких ответов. Этот метод является единственным, который касается ответа. Есть ли какой-то другой способ, которым я должен делать это?

Ответы [ 6 ]

0 голосов
/ 17 августа 2011

У вас есть UpdatePanel или что-то подобное?

Если это ваш случай, вы можете сделать это при загрузке страницы:

ScriptManager _scriptManager = ScriptManager.GetCurrent(this.Page);
_scriptManager.RegisterPostBackControl(Button1);
0 голосов
/ 01 февраля 2010

Я понял, что я делаю не так ... Мне нужно, чтобы каждая кнопка ссылки имела PostBackTrigger. Как только я это сделал, все работало так, как у меня было.

0 голосов
/ 01 февраля 2010

Я думаю, что проблема вызвана настройкой Response.Buffer и Response.BufferOutput. Один BufferOutput, вероятно, то, что вы хотите.

Если удаление Response.Buffer не работает, я бы попытался немного упростить, задав ContentType = "application / octet-stream" и закомментировав заголовок "Extension" Расширение только для имени файла должно быть достаточно для браузера.

0 голосов
/ 01 февраля 2010

Звонит ли Response.Clear(); до того, как все остальное прояснит? В противном случае вот сообщение в блоге , в котором рассматриваются некоторые другие проблемы.

0 голосов
/ 01 февраля 2010

Смотрите здесь

Возможно, вы указали неверный тип контента

0 голосов
/ 01 февраля 2010

Вы должны попробовать Response.Flush перед Response.End, если это не сработает, у вас есть пример кода здесь http://dotnetperls.com/response-binarywrite-aspnet

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