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

Я сталкиваюсь с очень странной проблемой в моем приложении 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-compress, multipart / x-zip и, конечно, application / zip. С приложением /zip Internet Explorer 8 показывает ошибку XML.

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

Привет,

3 ответа

Решение

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

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

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

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

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 должны быть одинаковыми, по какой-то причине это может быть не так.

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

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

У меня это работало с IE и Firefox.

Другие вопросы по тегам