Я хочу обеспечить динамическую загрузку файлов. Эти файлы могут быть созданы на лету на сервере, поэтому они представлены как byte [] и не существуют на диске. Я хочу, чтобы пользователь заполнил форму ASP.NET, нажал кнопку загрузки и вернул нужный файл.
Вот как выглядит мой код формы ASP.NET:
public partial class DownloadService : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void submitButtonClick(object sender, EventArgs e)
{
if (EverythingIsOK())
{
byte[] binary = GenerateZipFile();
Response.Clear();
Response.ContentType = "application/zip";
Response.ContentEncoding = System.Text.Encoding.UTF8;
Response.BinaryWrite(binary);
Response.End();
}
}
...
}
Я ожидал, что этот фрагмент кода просто сработает. Я очищаю Respone, вставляю сгенерированный zip-файл и бинго. Тем не менее, это не так. В браузере появляется следующее сообщение:
Страница XML не может быть отображена Невозможно просмотреть ввод XML с помощью таблицы стилей. Исправьте ошибку и нажмите кнопку «Обновить» или повторите попытку позже. В текстовом содержимом обнаружен недопустимый символ. Ошибка обработки ресурса 'http: // localhost: 15900 / mywebsite / DownloadS ...
Что я делаю неправильно?





Вот небольшая модификация, которую вам нужно сделать:
Response.Clear();
Response.ContentType = "application/x-zip-compressed";
Response.BinaryWrite(binary);
Response.End();
Да, я знаю, что есть тип содержимого application / zip. Я говорю о том, что вы должны вместо этого использовать application / x-zip-compressed, если хотите, чтобы ваше приложение правильно работало в IE.
Фактически, в некоторых случаях IE пытается быть умным и использует функцию FindMimeFromData, чтобы угадать тип mime, игнорируя тот, который указан в заголовке Content-Type.
@Darin: Означает ли это, что я должен использовать «image / pjpeg» для jpeg вместо «image / jpeg» и «image / x-png» вместо «image / png»? Плюс у меня есть вопрос. Разве я не могу использовать "" application / octet-stream "для всех типов ?? или я должен определить тип контента для каждого типа? Спасибо
Это моя (рабочая) реализация:
Response.Clear();
Response.ContentType = mimeType;
Response.AddHeader("Content-Disposition", String.Format("attachment; filename=\"{0} {1} Report for Week {2}.pdf\"", ddlClient.SelectedItem.Text, ddlCollectionsDirects.SelectedItem.Text, ddlWeek.SelectedValue));
Response.BinaryWrite(bytes);
Response.Flush();
Response.End();
mimeType похож на ваше приложение / zip (кроме PDF). Основными отличиями являются переданная дополнительная информация заголовка и вызов Flush для объекта Response.
На самом деле существует тип контента под названием appliaction / zip.