java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > JAVA返回PDF文件流并下载

JAVA返回PDF文件流并进行下载的实现方法

作者:itHarvie

这篇文章主要给大家介绍了关于JAVA返回PDF文件流并进行下载的实现方法,PDF文件流下载是通过HTTP协议将服务器上的PDF文件以流的方式发送给客户端,供客户端保存到本地磁盘或直接在浏览器中打开,需要的朋友可以参考下

首先确保本地存放pdf 保证通过路径可以拿到文件 我这边把pdf放在e盘下的目录

1.前台方法

原生ajax 发送请求返回文件流进行下载

 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
        //定义请求完成的处理函数,请求前也可以增加加载框/禁用下载按钮逻辑
        xhr.onload = function (res) {
            //请求完成
            let blob = this.response;
            let reader = new FileReader();
            reader.readAsDataURL(blob)
            reader.onload = function (e) {
                //创建a标签 模拟点击事件下载文件流
                const object = document.createElement('a');
                //下载的pdf名称
                object.download = '阿里巴巴Java开发手册终极版v1.3.0.pdf';
                object.href = e.target.result;
                $("body").append(object);    // 修复firefox中无法触发click
                object.click();
                $(object).remove();
            }
        }
        // 发送ajax请求
        xhr.send()
    }

2.后台方法

  @GetMapping("/result")
    public void result(HttpServletRequest request, HttpServletResponse response) throws IOException {
		//你的文件所存放的地址 我这边放在e盘下
        String pdfPath = "E:/阿里巴巴Java开发手册终极版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数组
     * 
     * @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();
        //设置超时间为3秒
        conn.setConnectTimeout(5*1000);
        //防止屏蔽程序抓取而返回403错误
        conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
        //得到输入流
        InputStream inputStream = conn.getInputStream();
        //获取自己数组
        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");
    }
    /**
     * 从输入流中获取字节数组
     * @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;
            // 输出 下载的响应头,如果下载的文件是中文名,文件名需要经过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) {
                }
            }
        }
    }
}

总结 

到此这篇关于JAVA返回PDF文件流并进行下载的文章就介绍到这了,更多相关JAVA返回PDF文件流并下载内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文