簡體   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