Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ajax call to download file returned from RESTful service

Tags:

rest

jquery

ajax

I am fairly new to AJAX. I am sending a request to server using AJAX. The service returns a text file. But no download box appears when data is returned. The rest service that returns the file is as follows:

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

    }
}

My AJAX call is as follows:

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

The file downloads successful without AJAX. With AJAX, it doesn't download the file.Please advice.

like image 810
Mono Jamoon Avatar asked Oct 18 '12 12:10

Mono Jamoon


2 Answers

Advice is simple: you cannot download files via AJAX - it's a security policy. I mean you can download the data, but you can't save it to disk from JavaScript side.

If you want to download a file on click, then you can just add href to you a tag. Or open a new window with file's URL.

like image 120
freakish Avatar answered Oct 19 '22 23:10

freakish


A) you don't have a callback to receive data back
b) Add error callback to you code so you can see if there are receiving errors after the call:

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

Edit: This is if you want to display the text in page. If you want to download the file, this is not the way, you cannot use ajax

like image 41
Draykos Avatar answered Oct 19 '22 22:10

Draykos