POST to server, receive PDF, deliver to user w/ jQuery

前端 未结 7 1513
逝去的感伤
逝去的感伤 2020-11-27 04:01

I have a link that the user clicks to get a PDF. In jQuery, I create a POST ajax call to the server to get the PDF. The PDF comes to me with the correct content headers et

7条回答
  •  伪装坚强ぢ
    2020-11-27 04:32

    I had the same problem but on top use an RESTFUL webservice for this and have an complex data object which i must post.

    My solution: like the jQuery Plugin i build a temp formular and submit it. But i send the data object as an parameter with json content (i use here AngularJS but it should work with jQuery.param() too.)

    Javascript:

    $('
    ' + "" + '
    ').appendTo('body').submit().remove();

    on the server side we use a CXF REST Service with an JACKSON Provider:

    Spring Config:

    
        
            
        
        
            
            
        
    
    

    in the controller i extracted the param and converted it back to an Java Pojo:

    package de.controller;
    
    import javax.ws.rs.Consumes;
    import javax.ws.rs.FormParam;
    import javax.ws.rs.POST;
    import javax.ws.rs.Path;
    import javax.ws.rs.Produces;
    import javax.ws.rs.core.MediaType;
    import javax.ws.rs.core.Response;
    
    import org.codehaus.jackson.map.ObjectMapper;
    import org.springframework.beans.factory.annotation.Autowired;
    
    
    @Path(Constants.PRINT_PATH)
    @Consumes({ MediaType.APPLICATION_JSON, "application/x-www-form-urlencoded"})
    @Produces("application/pdf; charset=UTF-8")
    public class PrintRestController {
    
        @Autowired
        private PrintService printService;
    
        @POST
        @Produces("application/pdf")
        @Path("/pdf")
        public Response getPDF(@FormParam("data") String data) {
            return printService.getPDF(json2Versicherung(data));
        }
    
        private Versicherung json2Versicherung(String data) {
            Versicherung lVersicherung = null;
            try {
                ObjectMapper mapper = new ObjectMapper();
                lVersicherung = mapper.readValue(data, Versicherung.class);
            } catch(Exception e) {
                LOGGER.error("PrintRestController.json2Versicherung() error", e);
            }
            return lVersicherung;
        }
    }
    

    in the PrintService i build the pdf binary and the response:

    @Override
    public Response getPDF(Versicherung pVersicherung) {
        byte[] result = ... //build the pdf from what ever
    
    
        ResponseBuilder response = Response.ok((Object) result);
        response.header("Content-Disposition", "inline; filename=mypdf.pdf");
        return response.build();
    }
    

    This solution works for all browsers (even for IE9 which can't handle data url's) and on tablets and smartphone and it have no problems with popupblockers

提交回复
热议问题