欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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)文章

最新評論