Проблемы с именами файлов и пантомимой - 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.