【问题标题】:Show pdf in new tab doesnt work with jquery and spring mvc在新选项卡中显示 pdf 不适用于 jquery 和 spring mvc
【发布时间】:2017-07-10 18:51:03
【问题描述】:

我想在生成 pdf 后在新选项卡中显示它,我使用的是 JQuery 1.12.3 和 Spring MVC 4。

当我点击我的链接时,我生成了 pdf,我的 ajax 方法显示成功,但我的 pdf 没有显示在新标签中,我忘记了什么?

我已经关注了这个帖子:

Display PDF in a webpage

Open ResponseEntity PDF in new browser tab

Spring - display PDF-file in browser instead of downloading

我尝试删除 ResponseBody 注释,但结果相同

这是我的代码:

HTML:

<a id="3676274" class="bulletinLink" target="_blank" href="#">Bulletin du 2015-04-30</a>

jQuery :

$(".bulletinLink").click(function(e){
    e.preventDefault();
    var id = $(this).attr('id');

    var oAjax;
    var sUrl = sUrlBase + '/generatePdf/'+id;

    oAjax = $.ajax({
            url: sUrl,
            type: 'GET',
            cache: false,
            data : '',
            async : false
    });

    oAjax.done(function(transport) {
        alert("success");
    });
    oAjax.fail(function(transport) {
        alert("fail");
    });
});

Java:

@RequestMapping(value = "/generatePdf/{id}", method = RequestMethod.GET)
@ResponseBody
public final ResponseEntity<byte[]> generateWithResponseBody(@PathVariable("id") final int idBulletin
            ,final HttpServletRequest httpRequete, final HttpServletResponse httpReponse) throws ApplicationException
{
...
HttpHeaders headers = new HttpHeaders();
headers.setContentType( MediaType.parseMediaType( "application/pdf" ) );
String filename = "spring_tutorial.pdf";
headers.setContentDispositionFormData( filename, filename );
headers.setCacheControl("must-revalidate, post-check=0, pre-check=0");
ResponseEntity<byte[]> response = new ResponseEntity<byte[]>(out.toByteArray(), headers, HttpStatus.OK);
return response;
}

【问题讨论】:

    标签: java jquery spring spring-mvc pdf


    【解决方案1】:

    问题是你需要将文件添加到HttpServletResponse,并且不需要在你的方法中返回任何值,所以使用void,将文件添加到响应中,浏览器会正确处理它

    @RequestMapping(value = "/generatePdf/{id}", method = RequestMethod.GET)
    @ResponseBody
    public final void generateWithResponseBody(@PathVariable("id") final int idBulletin
                ,final HttpServletRequest httpRequete, final HttpServletResponse reponse) throws ApplicationException
    {
        //Here retrieve your PDF file
        if(file != null) {
            String mimeType = URLConnection.guessContentTypeFromName(file.getName());
            if (mimeType == null) {
                logger.debug("mimetype is not detectable, will take default");
                mimeType = "application/pdf";
            }
            logger.debug("mimetype : {}", mimeType);
            response.setContentType(mimeType);
            response.setHeader("Content-Disposition", String.format("attachment; filename=\"%s\"", file.getName()));
            response.setContentLength((int) file.length());
            InputStream inputStream = new BufferedInputStream(new FileInputStream(file));
            FileCopyUtils.copy(inputStream, response.getOutputStream());
        }
    }
    

    【讨论】:

      【解决方案2】:

      我已经像这样在没有 Ajax 的情况下更改了我的 jquery 函数,并且知道它的工作原理:

      window.open(sUrl);
      

      另外,为了在选项卡中显示我的 pdf 而不要下载它,我在控制器中删除了这条指令:

      headers.setContentDispositionFormData( filename, filename );
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多