Подтвердить что ты не робот

Почему трэш не может скачать файл с помощью ajax-запроса?

В нашем приложении нам необходимо реализовать следующий сценарий:

  • Запрос отправляется от клиента
  • Сервер обрабатывает запрос и генерирует файл
  • Сервер возвращает файл в ответ
  • Клиентский браузер отображает всплывающее диалоговое окно загрузки файлов и позволяет пользователю загружать файл

Наше приложение представляет собой приложение на основе ajax, поэтому нам было бы очень легко и удобно отправлять запрос ajax (например, используя функцию jquery.ajax()).

Но после googilng оказалось, что загрузка файлов возможна только при использовании запроса POST без аякса (как описано в этом популярном потоке SO). Поэтому нам нужно было внедрить более уродливое и более сложное решение, которое требовало построения структуры HTML form с вложенными скрытыми полями.

Может ли кто-нибудь объяснить простыми словами, почему эти запросы ajax не могут использоваться для загрузки файла? Что за механика?

4b9b3361

Ответ 1

Это не о AJAX. Конечно, вы можете скачать файл с AJAX. Однако файл будет храниться в памяти, т.е. Вы не сможете сохранить файл на диск. Это связано с тем, что JavaScript не может взаимодействовать с диском. Это будет серьезная проблема безопасности, и она заблокирована во всех основных браузерах.

Ответ 2

Это можно сделать, используя новую функцию HTML5, называемую Blob. Существует библиотека FileSaver.js, которая может использоваться как оболочка поверх этой функции.

Ответ 3

Тот же вопрос, который я задал себе два дня назад. Был проект с клиентом, написанным с использованием ExtJS, и реализация на стороне сервера была на ASP.Net. Мне нужно перевести серверную часть на Java. Была функция для загрузки XML файла, который генерирует сервер после запроса Ajax от клиента. Мы все знаем, что невозможно загрузить файл после запроса Ajax, просто чтобы сохранить его в памяти. Но... в исходном браузере приложений отображается обычный диалог с открытыми опциями, сохранением и отменой загрузки. ASP.Net каким-то образом изменило стандартное поведение... Мне понадобилось два дня, чтобы снова доказать - нет способа загрузить файл по запросу обычным способом... единственным исключением является ASP.Net... Вот ASP.Net код

public static void WriteFileToResponse(byte[] fileData, string fileName)
    {
        var response = HttpContext.Current.Response;

        var returnFilename = Path.GetFileName(fileName);
        var headerValue = String.Format("attachment; filename={0}", 
            HttpUtility.UrlPathEncode(
                String.IsNullOrEmpty(returnFilename) 
                    ? "attachment" : returnFilename));
        response.AddHeader("content-disposition", headerValue);
        response.ContentType = "application/octet-stream";
        response.AddHeader("Pragma", "public");

        var utf8 = Encoding.UTF8;
        response.Charset = utf8.HeaderName;
        response.ContentEncoding = utf8;
        response.Flush();
        response.BinaryWrite(fileData);
        response.Flush();
        response.Close();
    }

Этот метод был вызван из WebMethod, который, в свою очередь, был вызван из ExtJS.Ajax.request. Это волшебство. Что для меня, я закончил с сервлетом и скрытым iframe...

Ответ 4

вы можете сделать это, используя скрытый iframe на странице загрузки

просто установите src скрытого ifame в вашем ответе на успех ajax и ваша задача выполнена...

  $.ajax({
        type: 'GET',
        url: './page.php',
        data: $("#myform").serialize(),
        success: function (data) {
          $("#middle").attr('src','url');
        },

});