Что я имею?
У меня есть страница ASP.NET, которая позволяет пользователю загружать файл a
на нажатии кнопки. Пользователь может выбрать файл, который он хочет от списка доступных файлов (RadioButtonList) и нажимает на кнопку загрузки для загрузки его. (Я не должен предоставлять ссылку для каждого файла, который может быть загружен - это - требование).
Что я хочу?
Я хочу, чтобы пользователь загрузил несколько файлов один за другим путем установки необходимого переключателя и нажатия на кнопку.
С какой проблемой я сталкиваюсь?
Я могу загрузить файл впервые правильно. Но, после загрузки, если я выбираю некоторый другой файл и нажимаю на кнопку для загрузки его, событие щелчка кнопки не отправляет назад, и второй файл не будет загружен.
Я использую следующий код на событии нажатия кнопки:
protected void btnDownload_Click(object sender, EventArgs e)
{
string viewXml = exporter.Export();
Response.Clear();
Response.AddHeader("Content-Disposition", "attachment; filename=views.cov");
Response.AddHeader("Content-Length", viewXml.Length.ToString());
Response.ContentType = "text/plain";
Response.Write(viewXml);
Response.End();
}
Я делаю что-то не так здесь?
Та же проблема может копироваться в IE6, IE7 и Chrome. Я думаю, что этой проблемой является независимый браузер.
Удалите Response.End ()
и позвольте ответу завершиться естественным образом в экосистеме ASP.NET.
Если это не сработает, я бы рекомендовал поместить кнопку в отдельный
и отправить необходимые данные в отдельный обработчик HTTP. Настройте обработчик HTTP для экспорта XML вместо веб-страницы.
Навскидку, то, что вы делаете, должно сработать. Раньше я успешно делал подобное, хотя использовал повторитель и кнопки LinkButton.
Единственное отличие, которое я вижу, это то, что вы используете Response.Write ()
, а не Response.OutputStream.Write ()
, и что вы пишете текстовый, а не двоичный, но, учитывая указанный вами ContentType
, это не должно быть проблемой. Кроме того, я вызываю Response.ClearHeaders ()
перед отправкой информации и Response.Flush ()
после (до моего вызова Response.End ()
).
Если это поможет, вот очищенная версия того, что у меня хорошо работает:
// called by click handler after obtaining the correct MyFileInfo class.
private void DownloadFile(MyFileInfo file)
{
Response.Clear();
Response.ClearHeaders();
Response.ContentType = "application/file";
Response.AddHeader("Content-Disposition", "attachment; filename=\"" + file.FileName + "\"");
Response.AddHeader("Content-Length", file.FileSize.ToString());
Response.OutputStream.Write(file.Bytes, 0, file.Bytes.Length);
Response.Flush();
Response.End();
}
Вы можете рассмотреть возможность передачи файла двоичным способом, возможно, вызвав System.Text.Encoding.ASCII.GetBytes (viewXml);
и передача результата в Response.OutputStream.Write ()
.
Небольшое изменение кода:
protected void btnDownload_Click(object sender, EventArgs e)
{
string viewXml = exporter.Export();
byte [] bytes = System.Text.Encoding.ASCII.GetBytes(viewXml);
// NOTE: you should use whatever encoding your XML file is set for.
// Alternatives:
// byte [] bytes = System.Text.Encoding.UTF7.GetBytes(viewXml);
// byte [] bytes = System.Text.Encoding.UTF8.GetBytes(viewXml);
Response.Clear();
Response.ClearHeaders();
Response.AddHeader("Content-Disposition", "attachment; filename=views.cov");
Response.AddHeader("Content-Length", bytes.Length.ToString());
Response.ContentType = "application/file";
Response.OutputStream.Write(bytes, 0, bytes.Length);
Response.Flush();
Response.End();
}