Java後臺返回PDF檔案預覽下載

白澤上樹發表於2020-12-30

Java後臺返回PDF檔案預覽下載

開始的程式碼的系統程式碼為:

ResponseEntity<byte[]> onePdf = s3Wrapper.download(contractEntity.getContractUrl());
                out.write(onePdf.getBody());
                response.setContentType("application/pdf");
                response.setHeader("Content-Disposition", "attachment; filename=" + Encodes.urlEncode(contractEntity.getContractName()));

一開始沒有看出來程式碼是有問題的,pdf流在response設定頭資訊時已經返回了,相當於最後兩段設定頭的程式碼沒呼叫,在使用HttpServletResponse物件時要考慮到程式碼前後的關係,避免出錯。

把設定頭的程式碼放在流輸出之前還是有問題,呼叫介面時發現pdf檔案直接下載了,沒有達到預覽的效果。檢查了半天之後發現是attachment屬性的問題,

參考如下:
Content-Disposition的使用方法
一、作用:

1)希望某類或者某已知MIME型別的檔案(比如:*.gif;txt;.htm)能夠在訪問時彈出"檔案下載對話方塊"

2)希望客戶端下載時以指定檔名顯示

3)希望某檔案直接顯示而不是彈出檔案下載對話方塊

二、使用語句:

response.setHeader(“Content-disposition”, “attachment;filename=” +filename);

Content-disposition:屬性名

attachment:表示以附件方式下載,如果要在頁面中開啟,可以改為inline.

注意:filename如果是中文會出現亂碼:解決辦法:

1、將filename 替換為 new String(filename.getBytes(), “ISO8859-1”);
2、將filename 替換為 URLEncoder.encode(filename, “utf-8”);

最後的程式碼語為

ResponseEntity<byte[]> onePdf = s3Wrapper.download(contractEntity.getContractUrl());

                response.setContentType("application/pdf");
                response.setHeader("Content-Disposition", "inline; filename=" + Encodes.urlEncode(contractEntity.getContractName()));

                out.write(onePdf.getBody());

pdf檔案可以正常預覽並且下載,問題解決。

在這裡插入圖片描述

如果需要解決java介面返回pdf時修改檔名稱問題:
參考:java介面返回pdf時修改檔名稱問題

相關文章