首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用Ajax下载并打开PDF文件

使用Ajax下载并打开PDF文件
EN

Stack Overflow用户
提问于 2010-01-04 21:42:20
回答 17查看 356.7K关注 0票数 112

我有一个可以生成PDF的action类。适当地设置了contentType

代码语言:javascript
复制
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。我不知道如何将此流传送到浏览器。我试了几种方法,但都不管用。

代码语言:javascript
复制
$.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));
    }
});

上面的代码给出了错误:

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

EN

回答 17

Stack Overflow用户

回答已采纳

发布于 2010-01-04 21:45:12

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

为了帮助您更多地了解服务器端代码,您需要更多地了解所使用的语言,并发布代码尝试的摘录。

票数 46
EN

Stack Overflow用户

发布于 2014-12-19 18:22:32

下面是我是如何让它工作的

代码语言:javascript
复制
$.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();
  }
});
代码语言:javascript
复制
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

使用download.js更新答案

代码语言:javascript
复制
$.ajax({
  url: '<URL_TO_FILE>',
  success: download.bind(true, "<FILENAME_TO_SAVE_WITH_EXTENSION>", "<FILE_MIME_TYPE>")
});

票数 129
EN

Stack Overflow用户

发布于 2012-02-24 22:01:07

我真的不认为过去的答案中有任何一个发现了原始海报的问题。他们都假设了一个GET请求,而发帖者试图发布数据并获得下载作为响应。

在寻找更好的答案的过程中,我们找到了这个jQuery Plugin for Requesting Ajax-like File Downloads

在其“核心”中,它创建了一个“临时”HTML表单,其中包含作为输入字段的给定数据。此表单将附加到文档并发布到所需的URL。在此之后,表单再次被删除:

代码语言:javascript
复制
jQuery('<form action="'+ url +'" method="'+ (method||'post') +'">'+inputs+'</form>')
    .appendTo('body').submit().remove()

更新Mayur的答案与我提到的jQuery插件相比,看起来非常有希望,也非常简单。

票数 31
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1999607

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档