如何使用Java在Jquery ajax调用中下载PDF

我创建了下载PDF文件的服务。

在我的服务器端(Java)上,PDF生成成功。但是我无法在UI端下载该文件(使用Jquery Ajax调用)。

有人可以帮我吗?

$(document).on('click','.orderView',function(event){
    orderId = $(this).attr('data');
    $.ajax({
        type : 'GET',contentType : 'application/json',url : '../service/purchase/generateInventoryPurchasePdf/'+orderId,success : function(response) {
            console.log("Success");
        },error : function(response) {
            console.log("Error :" + response);
        }
    });

}); 

Java代码:

@RequestMapping(value = "/generateInventoryPurchasePdf/{purchaseId}",method = RequestMethod.GET)
public ResponseEntity<ByteArrayResource> generateInventoryPurchasePdf(HttpServletResponse response,@PathVariable("purchaseId") Long purchaseId) throws Exception {

PurchaseOrder purchaseOrder = null;
    purchaseOrder = purchaseService.findByPurchaseOrderId(purchaseId);

    // generate the PDF
    Map<Object,Object> pdfmap = new HashMap<>();
    pdfmap.put("purchaseOrder",purchaseOrder);
    pdfmap.put("purchaseOrderDetail",purchaseOrder.getPurchaseOrderDetail());
    pdfmap.put("vendorName",purchaseOrder.getInvVendor().getName());
    pdfmap.put("vendorAddrs",purchaseOrder.getInvVendor().getVenAddress().get(0));
    File file = util.generatePdf("email/purchasepdf",pdfmap);

    MediaType mediaType = MediaTypeUtils.getMediaTypeForFileName(this.servletContext,file.getName());
    System.out.println("fileName: " + file.getName());
    System.out.println("mediaType: " + mediaType);

    //Path path = Paths.get(file.getabsolutePath() + "/" + file.getName());
    Path path = Paths.get(file.getabsolutePath());
    byte[] data = Files.readAllBytes(path);
    ByteArrayResource resource = new ByteArrayResource(data);

    return ResponseEntity.ok()
            // Content-Disposition
            .header(HttpHeaders.CONTENT_DISPOSITION,"attachment;filename=" + path.getFileName().toString())
            // Content-Type
            .contentType(mediaType) //
            // Content-Lengh
            .contentLength(data.length) //
            .body(resource);
}

mediaUtil类:

public class MediaTypeUtils {

    public static MediaType getMediaTypeForFileName(ServletContext servletContext,String fileName) {

        // application/pdf
        // application/xml
        // image/gif,...
        String mineType = servletContext.getMimeType(fileName);
        try {
            MediaType mediaType = MediaType.parseMediaType(mineType);
            return mediaType;
        } catch (Exception e) {
            return MediaType.APPLICATION_OCTET_STREAM;
        }
    }
}

PDF生成代码:

public File generatePdf(String templateName,Map<Object,Object> map) throws Exception {
    Assert.notNull(templateName,"The templateName can not be null");
    Context ctx = new Context();
    if (map != null) {
        Iterator<Entry<Object,Object>> itMap = map.entryset().iterator();
        while (itMap.hasnext()) {
            Map.Entry<Object,Object> pair = itMap.next();
            ctx.setVariable(pair.getKey().toString(),pair.getvalue());
        }
    }
    String processedHtml = templateEngine.process(templateName,ctx);
    FileOutputStream os = null;
    String fileName = "POLIST";
    try {
        final File outputFile = File.createTempFile(fileName,".pdf",new File(servletContext.getRealPath("/")));

        outputFile.mkdir();
        os = new FileOutputStream(outputFile);
        ITextRenderer renderer = new ITextRenderer();
        renderer.setDocumentFromString(processedHtml);
        renderer.layout();
        renderer.createPDF(os,false);
        renderer.finishPDF();
        System.out.println("PDF created successfully");
        return outputFile;
    } finally {
        if (os != null) {
            try {
                os.close();
            } catch (IOException e) { 
            }
        }
    }
}

我没有收到任何错误,PDF已在服务器端成功生成。但是在用户界面方面无法正常工作。

a198911 回答:如何使用Java在Jquery ajax调用中下载PDF

通过AJAX下载文件并不是真正的逻辑。进行AJAX调用时,从服务器返回的数据将返回到页面的JavaScript代码(在response回调值中),而不是返回给浏览器本身来决定要做什么。因此,浏览器无法启动下载,因为浏览器并不直接控制响应-而是由JavaScript代码控制。

正如您在问题下方的评论中所指出的那样,可以使用一些解决方法,但实际上最好的方法只是使用常规的非AJAX请求下载

例如,您可以将jQuery代码替换为

$(document).on('click','.orderView',function(event){
    orderId = $(this).attr('data');
    window.open('../service/purchase/generateInventoryPurchasePdf/'+orderId);
});

这将从新选项卡下载文档,而无需离开当前页面。

本文链接:https://www.f2er.com/3168355.html

大家都在问