Как реализовать загрузку файла в 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;
    }
}