Проблемы с именами файлов и пантомимой - ASP.NET Скачать файл (C #) - PullRequest
1 голос
/ 06 октября 2009

Я столкнулся с очень странной проблемой в моем приложении ASP.NET.

Когда пользователь нажимает кнопку, которая загружает файл, Internet Explorer / Chrome / Firefox показывает диалоговое окно сохранения, но имя файла - это имя страницы ASPX (Например, если страница называется Download.aspx, в диалоговом окне загрузки отображается «файл» Download.zip). Иногда при игре с MIME-типом диалог загрузки показывает «Download.aspx». Кажется, вы пытаетесь загрузить страницу, но на самом деле это правильный файл.

Это происходит с расширением ZIP, и вот мой код (я думаю, довольно стандартный):


        this.Response.Clear();
        this.Response.ClearHeaders();
        this.Response.ClearContent();
        this.Response.AddHeader("Content–Disposition", "attachment; filename=" + file.Name);
        this.Response.AddHeader("Content-Length", file.Length.ToString());
        this.Response.ContentType = GETCONTENTYPE(System.IO.Path.GetExtension(file.Name));
        this.Response.TransmitFile(file.FullName);
        this.Response.End();

Функция GetContentType просто возвращает MIME для файла. Я пробовал с application / x-zip-сжатым , multipart / x-zip и, конечно, application / zip . С приложением / zip Internet Explorer 8 показывает ошибку XML.

Любая помощь с очень признательна.

Привет,

Ответы [ 3 ]

2 голосов
/ 06 октября 2009

Я смотрю на то, что я сделал, чтобы обработать подобный механизм, и вот шаги, которые я делаю (жирный элемент, по-видимому, единственное реальное отличие):

Response.Clear();
Response.AddHeader("content-disposition", string.Format("attachment; filename={0}", fileName));
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; // Excel 2007 format
// ... doing work...
Response.AddHeader("Content-Length", outputFileInfo.Length.ToString());
Response.TransmitFile(outputFileInfo.ToString());
HttpContext.Current.Response.End(); // <--This seems to be the only major difference

Хотя this.Response и HttpContext.Current.Response должны совпадать, но по какой-то причине это может быть не так.

1 голос
/ 06 октября 2009

Я думаю, что-то вроде Response.Redirect(ResolveUrl(file.FullName)) вместо Response.TransmitFile(file.FullName) - это то, что вы намеревались. Похоже, вы действительно хотите, чтобы их браузер указывал на файл, а не просто передавал файл в ответ на текущий запрос.

Редактировать : также см. Этот вопрос SO Как получить и загрузить файлы сервера (File.Exists и URL)

Обновление : исходя из ваших отзывов, я думаю это - это то, что вы ищете.

0 голосов
/ 31 октября 2012

Для экспорта в Excel

   Response.AddHeader("content-disposition", string.Format("attachment; filename={0}.xls", fileName));

Это сработало для меня с IE и Firefox.

...