JAVA返回PDF文件流并進(jìn)行下載的實現(xiàn)方法
首先確保本地存放pdf 保證通過路徑可以拿到文件 我這邊把pdf放在e盤下的目錄
1.前臺方法
原生ajax 發(fā)送請求返回文件流進(jìn)行下載
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標(biāo)簽 模擬點擊事件下載文件流
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();
}
}
}
}補(bǔ)充: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文件流并進(jìn)行下載的文章就介紹到這了,更多相關(guān)JAVA返回PDF文件流并下載內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Boot 整合mybatis 使用多數(shù)據(jù)源的實現(xiàn)方法
這篇文章主要介紹了Spring Boot 整合mybatis 使用多數(shù)據(jù)源的實現(xiàn)方法,需要的朋友可以參考下2018-03-03
springboot調(diào)用C#封裝的DLL文件中函數(shù)的實現(xiàn)那
本文主要介紹了在Spring Boot中集成C# DLL,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-07-07
Mybatis日期格式自動轉(zhuǎn)換需要用到的兩個注解說明
這篇文章主要介紹了Mybatis日期格式自動轉(zhuǎn)換需要用到的兩個注解說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08
在Java項目中實現(xiàn)CI/CD持續(xù)集成與持續(xù)部署
這篇文章主要為大家介紹了在Java項目中實現(xiàn)CI/CD持續(xù)集成與持續(xù)部署詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06

