Как реализовать загрузку файла в ASP.NET AJAX
Я хотел бы использовать стандарт ASP.NET ответ на загрузку файла, например в другом вопросе переполнения стека.
Response.ContentType = "application/octet-stream";
Response.AppendHeader("Content-Disposition","attachment; filename=logfile.txt");
Response.TransmitFile( Server.MapPath("~/logfile.txt") );
Response.End();
но внутри панели обновления это не работает. Что мне нужно сделать, чтобы я получил файл, если событие загрузки запускается внутри панели обновления?
4 ответов
Ну, я нашел хороший пост в блоге на Encosia, который описывает решение этого ASP.NET проблема загрузки файла AJAX. Это работает очень хорошо.
http://encosia.com/2007/02/23/ajax-file-downloads-and-iframes/
вам нужно иметь это в отдельном aspx, который не использует ajax. Ajax обновляет существующую разметку html на странице на стороне клиента. Здесь вы пытаетесь заменить содержимое responce на стороне сервера перед отправкой чего-либо клиенту.
вы можете попробовать это:
есть страница под названием Download.aspx
который содержит код передачи, который у вас уже есть.
на исходной странице у вас есть вызов javascript, который вызывает страницу загрузки, например это:
window.location.replace('Download.aspx');
вы можете попробовать сделать обработчик для этой работы.Это более безопасно, если вы можете изменить хорошо. Для этой работы необходимо зашифровать путь к файлу на странице, где вы разместили ссылку на файл.
<a href=\"Downloads.ashx?f={0}\" target=\"_blank\">Your link to file</a>
//{0} -> Encrypted file path
//target = _blank force browser to download file in another window
есть много методов шифрования в здесь
в своем проводник страница, вам нужно расшифровать путь к файлу в оригинальный, чтобы вы могли прочитать его с помощью System.IO
библиотеки.
context.Response.ContentType = ""; //-->MimeType for your file's extension
вы можете указать свой тип MimeType Реестра, если MIME-тип статического изображения.
string mimeType = Registry.GetValue(string.Format(@"HKEY_CLASSES_ROOT\.{0}",
Path.GetExtension(decryptedfilePath)), "Content Type", null).ToString();
//Then everything is ready for download
byte[] buffer = File.ReadAllBytes(decryptedfilePath);
context.Response.OutputStream.Write(buffer, 0 , buffer.Length);
context.Response.Flush();
Удачи.
я смог решить эту проблему, вызвав функцию javascript, которая вызывает __doPostBack без _ _ EVENTTARGET.
function GxGridView_Export(exportLink, exportType) {
var containingGrid = $(exportLink).closest("table .GxGridViewWithSlider");
__doPostBack('', containingGrid.attr('id') + "###" + exportType);
}
сетка на стороне сервера затем анализирует _ _ EVENTARGUMENT и отображает файл экспорта.
var eventArg = Page.Request.Form["__EVENTARGUMENT"];
if (!string.IsNullOrEmpty(eventArg) && eventArg.Contains("###"))
{
var eventParams = eventArg.Split(new string[] { "###" }, StringSplitOptions.RemoveEmptyEntries);
if (eventParams.Length == 2 && eventParams[0] == this.ClientID)
{
ExportGrid(eventParams[1]);
return;
}
}