JAVA返回PDF文件流并進行下載的實現(xiàn)方法
更新時間:2024年02月03日 11:52:00 作者:itHarvie
這篇文章主要給大家介紹了關(guān)于JAVA返回PDF文件流并進行下載的實現(xiàn)方法,PDF文件流下載是通過HTTP協(xié)議將服務(wù)器上的PDF文件以流的方式發(fā)送給客戶端,供客戶端保存到本地磁盤或直接在瀏覽器中打開,需要的朋友可以參考下
首先確保本地存放pdf 保證通過路徑可以拿到文件 我這邊把pdf放在e盤下的目錄
1.前臺方法
原生ajax 發(fā)送請求返回文件流進行下載
function downloadPdf() { //后臺下載文件流地址 (自己定義) let url = prefix + "/result"; let xhr = new XMLHttpRequest(); xhr.open('GET', url, true); xhr.setRequestHeader("content-type", "application/x-www-form-urlencoded"); xhr.responseType = 'blob'; //返回類型blob //定義請求完成的處理函數(shù),請求前也可以增加加載框/禁用下載按鈕邏輯 xhr.onload = function (res) { //請求完成 let blob = this.response; let reader = new FileReader(); reader.readAsDataURL(blob) reader.onload = function (e) { //創(chuàng)建a標簽 模擬點擊事件下載文件流 const object = document.createElement('a'); //下載的pdf名稱 object.download = '阿里巴巴Java開發(fā)手冊終極版v1.3.0.pdf'; object.href = e.target.result; $("body").append(object); // 修復(fù)firefox中無法觸發(fā)click object.click(); $(object).remove(); } } // 發(fā)送ajax請求 xhr.send() }
2.后臺方法
@GetMapping("/result") public void result(HttpServletRequest request, HttpServletResponse response) throws IOException { //你的文件所存放的地址 我這邊放在e盤下 String pdfPath = "E:/阿里巴巴Java開發(fā)手冊終極版v1.3.0.pdf"; response.setCharacterEncoding("utf-8"); response.setContentType("multipart/form-data"); response.setHeader("Content-Disposition", "xxx.pdf"); FileUtils.writeBytes(pdfPath, response.getOutputStream()); File file = new File(pdfPath); if (file.exists()) { DataOutputStream temps = new DataOutputStream(response.getOutputStream()); DataInputStream in = new DataInputStream(new FileInputStream(pdfPath)); byte[] b = new byte[2048]; while ((in.read(b)) != -1) { temps.write(b); temps.flush(); } in.close(); temps.close(); } else { log.error("文件不存在!"); } }
/** * 輸出指定文件的byte數(shù)組 * * @param filePath 文件路徑 * @param os 輸出流 * @return */ public static void writeBytes(String filePath, OutputStream os) throws IOException { FileInputStream fis = null; try { File file = new File(filePath); if (!file.exists()) { throw new FileNotFoundException(filePath); } fis = new FileInputStream(file); byte[] b = new byte[1024]; int length; while ((length = fis.read(b)) > 0) { os.write(b, 0, length); } } catch (IOException e) { throw e; } finally { if (os != null) { try { os.close(); } catch (IOException e1) { e1.printStackTrace(); } } if (fis != null) { try { fis.close(); } catch (IOException e1) { e1.printStackTrace(); } } } }
補充:JAVA下載PDF 到本地 或 返回文件流
@Slf4j public class PDFUtils { /** * * @param fileUrl 文件路徑 * @param saveUrl 文件保存路徑 * @param fileName 文件名稱 * @throws IOException */ public static void downloadPdf(String fileUrl, String saveUrl, String fileName) throws IOException { URL url = new URL(fileUrl); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); //設(shè)置超時間為3秒 conn.setConnectTimeout(5*1000); //防止屏蔽程序抓取而返回403錯誤 conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"); //得到輸入流 InputStream inputStream = conn.getInputStream(); //獲取自己數(shù)組 byte[] getData = readInputStream(inputStream); //文件保存位置 File saveDir = new File(saveUrl); if(!saveDir.exists()){ saveDir.mkdir(); } File file = new File(saveDir+File.separator+fileName); FileOutputStream fos = new FileOutputStream(file); fos.write(getData); if(fos!=null){ fos.close(); } if(inputStream!=null){ inputStream.close(); } System.out.println("info:"+url+" download success"); } /** * 從輸入流中獲取字節(jié)數(shù)組 * @param inputStream * @return * @throws IOException */ public static byte[] readInputStream(InputStream inputStream) throws IOException { byte[] buffer = new byte[1024]; int len = 0; ByteArrayOutputStream bos = new ByteArrayOutputStream(); while((len = inputStream.read(buffer)) != -1) { bos.write(buffer, 0, len); } bos.close(); return bos.toByteArray(); } /** * 下載pdf返回文件流 * @param response 請求頭 * @param pdfName fileName * @param path 路徑 */ public static void toDownload(HttpServletResponse response, String pdfName,String path) { ServletOutputStream out = null; InputStream inputStream = null; try { // 獲取外部文件流 log.info("下載中------invPdfUrl=" +path); URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setConnectTimeout(3 * 1000); //防止屏蔽程序抓取而返回403錯誤 conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"); inputStream = conn.getInputStream(); /** * 輸出文件到瀏覽器 */ int len = 0; // 輸出 下載的響應(yīng)頭,如果下載的文件是中文名,文件名需要經(jīng)過url編碼 response.setContentType("text/html;charset=utf-8"); response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(pdfName, "UTF-8")); response.setHeader("Cache-Control", "no-cache"); out = response.getOutputStream(); byte[] buffer = new byte[1024]; while ((len = inputStream.read(buffer)) > 0) { out.write(buffer, 0, len); } out.flush(); log.info("pdf文件下載完成....."); } catch (Exception e) { log.error("pdf文件下載異常,e = {}", e); e.printStackTrace(); } finally { if (inputStream != null) { try { inputStream.close(); } catch (Exception e) { } } if (out != null) { try { out.close(); } catch (Exception e) { } } } } }
總結(jié)
到此這篇關(guān)于JAVA返回PDF文件流并進行下載的文章就介紹到這了,更多相關(guān)JAVA返回PDF文件流并下載內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot中使用HTTP客戶端工具Retrofit
這篇文章主要為大家介紹了SpringBoot中使用HTTP客戶端工具Retrofit方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06Java基礎(chǔ)開發(fā)之JDBC操作數(shù)據(jù)庫增刪改查,分頁查詢實例詳解
這篇文章主要介紹了Java基礎(chǔ)開發(fā)之JDBC操作數(shù)據(jù)庫增刪改查,分頁查詢實例詳解,需要的朋友可以參考下2020-02-02java天數(shù)計算函數(shù)(當前月天數(shù)、某月總天數(shù)及某月剩余天數(shù))4種方法實現(xiàn)代碼
日常開發(fā)中會遇到關(guān)于日期的計算,比如當月的天數(shù)、兩日期之間的天數(shù)、當月剩余天數(shù)等等,這篇文章主要給大家介紹了關(guān)于java天數(shù)計算函數(shù)(當前月天數(shù)、某月總天數(shù)及某月剩余天數(shù))4種方法實現(xiàn)的相關(guān)資料,需要的朋友可以參考下2023-10-10