使用Ajax下载并打开PDF文件

2022-08-30 05:29:03

我有一个生成PDF的操作类。已正确设置。contentType

public class MyAction extends ActionSupport 
{
   public String execute() {
    ...
    ...
    File report = signedPdfExporter.generateReport(xyzData, props);

    inputStream = new FileInputStream(report);
    contentDisposition = "attachment=\"" + report.getName() + "\"";
    contentType = "application/pdf";
    return SUCCESS;
   }
}

我通过Ajax调用来调用它。我不知道如何将此流传送到浏览器。我尝试了一些东西,但没有任何效果。action

$.ajax({
    type: "POST",
    url: url,
    data: wireIdList,
    cache: false,
    success: function(response)
    {
        alert('got response');
        window.open(response);
    },
    error: function (XMLHttpRequest, textStatus, errorThrown) 
    {
        alert('Error occurred while opening fax template' 
              + getAjaxErrorString(textStatus, errorThrown));
    }
});

上面给出了错误:

您的浏览器发送了此服务器无法理解的请求。


答案 1

以下是我如何让它工作

$.ajax({
  url: '<URL_TO_FILE>',
  success: function(data) {
    var blob=new Blob([data]);
    var link=document.createElement('a');
    link.href=window.URL.createObjectURL(blob);
    link.download="<FILENAME_TO_SAVE_WITH_EXTENSION>";
    link.click();
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

使用下载更新了答案.js

$.ajax({
  url: '<URL_TO_FILE>',
  success: download.bind(true, "<FILENAME_TO_SAVE_WITH_EXTENSION>", "<FILE_MIME_TYPE>")
});

答案 2

你不一定需要Ajax来做这件事。只要一个链接就足够了,如果你在服务器端代码中设置了 to。这样,如果这是你主要关心的问题,父页面就会保持打开状态(否则你为什么不必要地选择Ajax呢?)。此外,没有办法很好地同时处理这个问题。PDF 不是字符数据。它是二进制数据。你不能做这样的事情。您希望为此使用全新的请求。因为这是完全合适的。<a>content-dispositionattachment$(element).load()<a href="pdfservlet/filename.pdf">pdf</a>

为了在服务器端代码方面为您提供更多帮助,您需要详细了解所使用的语言,并发布代码尝试的摘录。