@GetMapping("/downLoadFile") public void downLoadFile(String urls,HttpServletResponse response) throws Exception{ if(StringUtils.isNotBlank(urls)){ String savePath = rootUrl+"/"+"网络文件"; File directory = new File(savePath); if (!directory.exists()) { directory.mkdir(); } String[] fileArr = urls.split(","); URL url = null; HttpURLConnection conn = null; InputStream is = null; File file = null; FileOutputStream fileOutputStream = null; byte[] data = null; String fileName = ""; String[] fileNameArr = null; for(int i = 0;i < fileArr.length;i++){ url = new URL(fileArr[i]); conn = (HttpURLConnection)url.openConnection(); conn.setConnectTimeout(10 * 1000);// 连接超时时间为10秒 is = conn.getInputStream();// 通过输入流获取图片数据 fileNameArr = fileArr[i].split("\\/"); fileName = fileNameArr[fileNameArr.length-1]; file = new File(savePath+"/"+fileName); fileOutputStream = new FileOutputStream(file); data = readInputStream(is); fileOutputStream.write(data); fileOutputStream.close(); } ZipUtil.zip(savePath);// 压缩生成的word文档 String zipFileName = savePath+".zip"; File zipFile = new File(zipFileName); BufferedInputStream bins = new BufferedInputStream(new FileInputStream(zipFile)); response.setCharacterEncoding("UTF-8"); response.setHeader("content-Type", "application/x-download"); response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(zipFile.getName(), "UTF-8")); ServletOutputStream out = null; try { // 这边直接压缩并且在浏览器下载 out = response.getOutputStream(); int bytesRead = 0; byte[] buffer = new byte[8192]; while ((bytesRead = bins.read(buffer, 0, 8192)) != -1) { out.write(buffer, 0, bytesRead); } out.flush(); bins.close(); out.close(); File delZipFile = new File(zipFileName); if (delZipFile != null && delZipFile.isFile() && delZipFile.exists()) { delZipFile.delete();// 删除压缩文件 } File delFiles = new File(savePath); FileUtil.deleteFiles(delFiles);// 删除发票文件 } catch (IOException e) { e.printStackTrace(); } } }
private static byte[] readInputStream(InputStream inStream) throws Exception { ByteArrayOutputStream outStream = new ByteArrayOutputStream(); //创建一个Buffer字符串 byte[] buffer = new byte[6024]; //每次读取的字符串长度,如果为-1,代表全部读取完毕 int len; //使用一个输入流从buffer里把数据读取出来 while ((len = inStream.read(buffer)) != -1) { //用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度 outStream.write(buffer, 0, len); } //关闭输入流 inStream.close(); //把outStream里的数据写入内存 return outStream.toByteArray(); }