1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
| @GetMapping("/foxit") public void foxit(HttpServletRequest request, HttpServletResponse response) { int pdfId = Integer.parseInt(request.getParameter("pdfId"));
//获取文件 String filePath = foxitService.getPdfurl(pdfId); if (filePath == null || "".equals(filePath)) { return; } /* 不分片 response.setContentType("application/pdf"); // 读取路径下面的文件 try { FileCopyUtils.copy(new FileInputStream(filePath),response.getOutputStream()); } catch (IOException e){ e.printStackTrace(); } */ File downloadFile = new File(filePath); if (downloadFile == null){ return; }
// 获取分片起始位置并处理 long downloadSize = downloadFile.length(); long fromPos = 0,toPos = 0; String range = request.getHeader("Range"); String bytes = range.replaceAll("bytes=", ""); String[] ary = bytes.split("-"); fromPos = Long.parseLong(ary[0]); if (ary.length == 2) { toPos = Long.parseLong(ary[1]); } else { return; } if (toPos - fromPos > 131072) return; int size; if (toPos > fromPos) { size = (int) (toPos - fromPos + 1); } else { size = (int) (downloadSize - fromPos + 1); }
/* 响应头 */ // 返回流信息 开始-结束/流总大小 response.setHeader("Content-Range", "bytes " + fromPos + "-" + toPos + "/" + downloadSize); // 返回流大小 response.setHeader("Content-Length", size + ""); response.setContentType("application/pdf"); response.setHeader("Content-Disposition", String.format("inline; filename=\"%s\"", downloadFile.getName())); response.setHeader("Accept-Ranges", "bytes"); response.setHeader("Access-Control-Expose-Headers", "content-range, content-length, accept-ranges");// 坑点,前后端分离时必须添加 // 206 response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT); response.setHeader("Connetion", "keep-alive");
// 返回流内容 downloadSize = size; RandomAccessFile in = null; OutputStream out = null; try { in = new RandomAccessFile(downloadFile, "r"); // 设置下载起始位置 if (fromPos > 0) { in.seek(fromPos); } // 缓冲区大小 int bufLen = (int) (downloadSize < 2048 ? downloadSize : 2048); byte[] buffer = new byte[bufLen]; int num; int count = 0; // 当前写到客户端的大小 out = response.getOutputStream(); while ((num = in.read(buffer)) != -1) { out.write(buffer, 0, num); count += num; //处理最后一段,计算不满缓冲区的大小 if (downloadSize - count < bufLen) { bufLen = (int) (downloadSize - count); if (bufLen == 0) { break; } buffer = new byte[bufLen]; } } response.flushBuffer(); } catch (IOException e) { e.printStackTrace(); } finally { if (null != out) { try { out.close(); } catch (IOException e) { e.printStackTrace(); } } if (null != in) { try { in.close(); } catch (IOException e) { e.printStackTrace(); } }
} }
|