ASP.NET XMLHTTPREQUEST загружает файл с помощью обработчика

#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, который может получить файл и отправить его клиенту