繁体   English   中英

有效负载(空内容类型)禁止错误| 从ember的服务器下载pdf文件时

[英]Payload (Empty Content-Type) Forbidden Error | While downloading a pdf file from the server in ember

目标:希望通过生成以下URL从服务器下载PDF文件: http:// localhost:4200 / bookStore / secured / rest / books / 14119

在book.js中的路线中执行以下行时,将生成URL。

return this.store.findRecord('book', bookId);

但是我收到403禁止错误。 错误的详细信息:

Error: Ember Data Request GET /bookStore/secured/rest/books/14119 returned a 403
Payload (Empty Content-Type)
Forbidden
    at new AdapterError (-private.js:3170)
    at Class.handleResponse (rest.js:594)
    at ajaxError (rest.js:956)
    at Class.hash.error (rest.js:623)
    at fire (jquery.js:3317)
    at Object.fireWith [as rejectWith] (jquery.js:3447)
    at done (jquery.js:9274)
    at XMLHttpRequest.<anonymous> (jquery.js:9514)

我需要将内容类型设置为“ application / pdf”吗? 如果是,那么请建议如何设置。

下面是JS代码:

路线\\ book.js

actions: {
    pdfClick(bookId) {
      return this.store.findRecord('book', bookId);
   }
}

template \\ book.hbs

<button {{action "pdfClick" book.bookId}}>PDF</button>

在服务器端,接收和响应请求的代码如下:

@GET
@Path("/{bookId}")
@Produces("application/pdf")
public Response bookExport(@PathParam("bookId") long bookId) {
   //Code
}

根据服务器端代码,我们正在从服务器获取PDF文件。 使用PostMan已成功测试。

您似乎正在尝试使用Ember Data下载PDF文件。 尽管Ember Data主要用于处理JSON数据,所以在这种情况下这可能不是最合适的选择。 您仍然可以继续将Ember Data用于其他所有内容,但是对于下载PDF,我建议仅使用它来生成正确的URL。

您应该能够大致像这样生成URL:

let url = this.store.adapterFor('book').urlForFindRecord(bookId, 'book');

要不就:

let url = `http://localhost:4200/bookStore/secured/rest/books/${bookId}`;

如果您根本不想使用Ember Data。

最后下载PDF,您可以使用:

document.location.assign(url);

或将您的按钮转换为链接:

<a href={{url}}>Download PDF</a>

您正在向http://localhost:4200/bookStore/secured/rest/books/14119 ,但这是Ember开发服务器。 如果使用余烬数据,则可以在适配器中自定义主机。 有关如何执行此操作,请参阅文档的本部分

请注意,Ember Data不知道如何自动处理PDF文件。 如果您只想下载它,建议您直接使用<a href="location of pdf file"链接到它。

您想要检索二进制(pdf)作为对rest调用的响应。 您有几种不同的选择:

第一个与TBienek的<a href={{url}}>Download PDF</a> 我认为这是一种简单的跨浏览器解决方案。 这将消除休息电话的需要。

第二个方法是在json对象中发送pdf字节,例如:

{
  content:'<base64 encoded byte arr>',
  filename:'<string>,
  contentType: 'application/pdf'
}

之后,创建一个包含contentBlob并触发将其打开(通过window.open )。

在不更改当前服务器端点的情况下,还有第三种与XMLHttpRequest结合使用的方法。 在第二个选项中,将XMLHttpRequest的response用作content

他们都没有使用Ember Data。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM