Как реализовать загрузку файлов в ASP.NET AJAX - PullRequest
8 голосов
/ 26 августа 2009

Я хотел бы использовать стандартный ответ загрузки файла ASP.NET, например в другом вопросе переполнения стека .

Response.ContentType = "application/octet-stream";
Response.AppendHeader("Content-Disposition","attachment; filename=logfile.txt");
Response.TransmitFile( Server.MapPath("~/logfile.txt") );
Response.End();

Но внутри панели обновления это не работает. Что мне нужно сделать, чтобы получить файл, если событие загрузки инициируется внутри панели обновления?

Ответы [ 4 ]

10 голосов
/ 27 августа 2009

Что ж, я нашел хороший пост в блоге Encosia, в котором описывается решение проблемы загрузки файла ASP.NET AJAX. Это действительно хорошо работает.

http://encosia.com/2007/02/23/ajax-file-downloads-and-iframes/

2 голосов
/ 26 августа 2009

Вы должны иметь это в отдельном aspx, который не использует ajax. Ajax обновляет существующую HTML-разметку на странице на стороне клиента. Здесь вы пытаетесь заменить содержимое ответа на стороне сервера перед отправкой чего-либо клиенту.

Вы можете попробовать это:

Создайте страницу с именем Download.aspx, содержащую код передачи, который у вас уже есть.

На исходной странице у вас есть вызов javascript, который вызывает страницу загрузки следующим образом:

window.location.replace('Download.aspx');
0 голосов
/ 24 октября 2013

Я смог решить эту проблему, вызвав функцию 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;
    }
}
0 голосов
/ 26 августа 2009

Вы можете попытаться создать обработчик для этой работы. Это более безопасно, если вы можете изменить хорошо. Для этой работы вам необходимо зашифровать путь к файлу на вашей странице, где вы поместите ссылку для файла.

<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();

Удачи.

...