Ajax вызов для загрузки файла, возвращенного из службы RESTful

Я новичок в AJAX. Я отправляю запрос на сервер с помощью AJAX. Служба возвращает текстовый файл. Но при возврате данных не появляется окно загрузки. Служба остатка, которая возвращает файл, выглядит следующим образом:

@Path("/examples")
public class ExampleCodesRest {


    @POST
    @Path("/getcode")
    @Produces(MediaType.TEXT_PLAIN)
    public Response getCodes(@Context ServletContext context){

        String in=context.getRealPath("/WEB-INF/reports.jrxml");
        File file=new File(in);

        ResponseBuilder response = Response.ok((Object) file);
        response.header("Content-Disposition",
            "attachment; filename=\"file_from_server.log\"");
        return response.build();

    }
}

Мой вызов AJAX выглядит следующим образом:

 $('a#link').click(function(event){
    event.preventDefault();
    $.ajax({
        url: '/reports/rest/examples/getcode',
        type: 'POST'
    });
}); 

Файл загружается успешно без AJAX. С AJAX он не загружает файл. Пожалуйста, совет.

Ответ 1

Совет прост: вы не можете скачивать файлы через AJAX - это политика безопасности. Я имею в виду, что вы можете загружать данные, но вы не можете сохранить их на диск со стороны JavaScript.

Если вы хотите загрузить файл по клику, вы можете просто добавить href к тегу a. Или откройте новое окно с файлом URL.

Ответ 2

A) у вас нет обратного вызова для получения данных обратно
b) Добавить обратный вызов ошибки к вашему коду, чтобы вы могли увидеть, есть ли ошибки после вызова:

    $.ajax({
    url: '/spaconsole/rest/examples/getcode',
    type: 'POST'
    success: function (data) {
        console.log('ok');
    },
    error: function (xhr) {
      console.log(xhr);
    }
    });

Изменить: это, если вы хотите отобразить текст на странице. Если вы хотите загрузить файл, это не так, вы не можете использовать ajax

Ответ 3

Вы не можете сделать это непосредственно из AJAX, но можете обойти его, имея iframe, который инициирует загрузку. См. Ajax File download Issue для обсуждения.