#asp.net #xmlhttprequest
#asp.net #xmlhttprequest
Вопрос:
пытаюсь реализовать загрузку файла с помощью xmlhttprequest… Но я не получаю диалоговое окно с файлом или какой-либо ответ. Я отладил обработчик, ошибки нет.
function download(id)
{
try
{
var xmlHttp=new XMLHttpRequest();
xmlHttp.open("GET","DownloadFileHandler.ashx?id=" id,false);
xmlHttp.send();
xmlHttp.onreadystatechange=function()
{
//if request has been entertained and response is returned from server
if(xmlHttp.readyState==4)
{
alert("aq");
}
}
}
catch (ex)
{
alert("Browser does not support ajax");
}
}
}
мой обработчик
context.Response.AppendHeader("content-disposition", "attachment; filename=" name);
context.Response.ContentType = type;
context.Response.WriteFile(path);
context.Response.End();
Комментарии:
1. Не работает асинхронно…
2. Загрузка файла представляет собой двоичный http-запрос. AJAX поддерживается XMLHttpRequest. Они несовместимы. Поскольку щелчок должен быть инициирован, лучше всего указать URL-адрес, указывающий на обработчик .ashx, который может извлечь файл и выполнить доставку извне.
Ответ №1:
Итак, очевидно, что AJAX использует HTTP-запросы на основе XML. Это другой протокол, чем запрос на загрузку файла. Загрузка файла представляет собой двоичный http-запрос.
Во-первых, хотя объект XMLHttpRequest может преобразовывать данные в XML, вы также можете получить полные данные, будь то двоичные или нет. Вы можете разобрать его на все, что захотите.
Во-вторых, это не другой протокол. Протоколом является HTTP. HTTP передает данные и выполняет согласование содержимого в обоих случаях.
В-третьих, HTTP GET-запросы (один и тот же тип запроса в обоих случаях) могут возвращать двоичные или текстовые данные, полностью независимые от способа генерации запроса. Запрос может быть сгенерирован с помощью тега, или пользователя, нажимающего на ссылку, или XMLHttpRequest, а тип содержимого (двоичный или текстовый) полностью не зависит от того, как был сгенерирован запрос.
Настоящая причина, по которой вы не можете загрузить файл с помощью XMLHttpRequest, но вместо этого вынуждены использовать специфические для браузера расширения, такие как NSIWEBBROWSERP persist, заключается в том, что браузеры решили не обращать внимания на заголовок Content-Disposition при чтении данных, возвращаемых из XMLHttpRequest, как они делают при чтении данных для страницы верхнего уровня (или — вы можете запустить загрузку, получив данные через невидимый iframe)
Лично я считаю, что это плохой выбор веб-браузеров, потому что в нем нет дополнительной безопасности, только неудобства для разработчиков. Нет способа отправить заголовки Accept: или глаголы, отличные от GET, путем отправки запросов с элементом IFRAME или IMG, поэтому вы не можете контролировать согласование содержимого. Вместо этого вам нужно экранировать протокол HTTP в GET parameters, что я нахожу печальным и не требующим ОТДЫХА.
Для получения дополнительной информации о NSIWEBBROWSERP, смотрите https://developer.mozilla.org/en/Code_snippets/Downloading_Files
Ответ №2:
Обратите внимание, что в вашем коде у вас есть:
var xmlHttp=new XMLHttpRequest();
Итак, очевидно, что AJAX использует HTTP-запросы на основе XML. Это другой протокол, чем запрос на загрузку файла. Загрузка файла представляет собой двоичный http-запрос.
Вроде как говорить на двух разных языках, когда нет переводчика. Не работает…
Итак, одним из решений является создание ссылки, которая указывает на обработчик .ashx, который может получить файл и отправить его клиенту