Ajax call to download file returned from RESTful s

2019-01-12 08:35发布

问题:

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.

回答1:

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.



回答2:

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



回答3:

You can't do that directly from AJAX, but you can get around it by having an iframe that initiates the download. See Ajax File download Issue for a discussion.



标签: jquery ajax rest