От руки, то, что вы делаете, должно работать. Я успешно делал подобное в прошлом, хотя я использовал повторитель и кнопки LinkButtons.
Единственное, что я вижу, отличается от того, что вы используете 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();
}