![](/img/trans.png)
[英]Downloading a file with content type Content-Type:multipart/mixed
[英]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'
}
之后,創建一個包含content
的Blob
並觸發將其打開(通過window.open
)。
在不更改當前服務器端點的情況下,還有第三種與XMLHttpRequest結合使用的方法。 在第二個選項中,將XMLHttpRequest的response
用作content
。
他們都沒有使用Ember Data。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.