springboot 文件,springboot文件到本地指定目录
墨初 知识笔记 126阅读
SpringBoot实现文件下载的几种方式 1. 将文件以流的形式一次性读取到内存通过响应输出流输出到前端1.1 下载文件 2. 将输入流中的数据循环写入到响应输出流中而不是一次性读取到内存通过响应输出流输出到前端3. 下载网络文件到本地4. 网络文件获取到服务器后经服务器处理后响应给前端
1. 将文件以流的形式一次性读取到内存通过响应输出流输出到前端
/*** param path 想要下载的文件的路径* param response* 功能描述 下载文件:*/RequestMapping(/download)public void download(String path, HttpServletResponse response) {try {// path是指想要下载的文件的路径File file new File(path);log.info(file.getPath());// 获取文件名String filename file.getName();// 获取文件后缀名String ext filename.substring(filename.lastIndexOf(.) 1).toLowerCase();log.info(文件后缀名 ext); // 将文件写入输入流FileInputStream fileInputStream new FileInputStream(file);InputStream fis new BufferedInputStream(fileInputStream);byte[] buffer new byte[fis.available()];fis.read(buffer);fis.close(); // 清空responseresponse.reset();// 设置response的Headerresponse.setCharacterEncoding(UTF-8);//Content-Disposition的作用告知浏览器以何种方式显示响应返回的文件用浏览器打开还是以附件的形式下载到本地保存//attachment表示以附件方式下载 inline表示在线打开 Content-Disposition: inline; filename文件名.mp3// filename表示文件的默认名称因为网络传输只支持URL编码的相关支付因此需要将文件名URL编码后进行传输,前端收到后需要反编码才能获取到真正的名称response.addHeader(Content-Disposition, attachment;filename URLEncoder.encode(filename, UTF-8));// 告知浏览器文件的大小response.addHeader(Content-Length, file.length());OutputStream outputStream new BufferedOutputStream(response.getOutputStream());response.setContentType(application/octet-stream);outputStream.write(buffer);outputStream.flush();} catch (IOException ex) {ex.printStackTrace();}}
1.1 下载文件 RequestMapping(getFile)ResponseBodypublic void getFile(HttpServletResponse response) throws Exception{ File readFile new File(/home/ssx/Music/CloudMusic/夜曲-.flac); //字节流-用于读文件 这里只是demo用的非缓冲流。实际项目可以用BufferedInputStream。 此功能是读取图片所以用的字节流。如果是文本的话可以用字符流效率高具体类看下面注释// BufferedReader bufferedReader new BufferedReader(new FileReader(readFile));//字符流 FileInputStream fileInputStream new FileInputStream(readFile);//字节流 //设置文件下载方式 response.setHeader(content-disposition,attachment;filename URLEncoder.encode(夜曲-.flac,utf-8)); //获取servlet响应输出字节流// PrintWriter writer response.getWriter();//字符流 ServletOutputStream outputStream response.getOutputStream(); //字节流 //流数据交换每次交换10k数据大小 1024k 1m byte[] bytes new byte[1024*10]; int read; do { read fileInputStream.read(bytes); outputStream.write(bytes,0,read); }while (-1 ! read); //关闭资源 IOUtils.closeQuietly(fileInputStream); IOUtils.closeQuietly(outputStream);}
2. 将输入流中的数据循环写入到响应输出流中而不是一次性读取到内存通过响应输出流输出到前端 /*** param path 指想要下载的文件的路径* param response* 功能描述 下载文件:将输入流中的数据循环写入到响应输出流中而不是一次性读取到内存*/RequestMapping(/downloadLocal)public void downloadLocal(String path, HttpServletResponse response) throws IOException {// 读到流中InputStream inputStream new FileInputStream(path);// 文件的存放路径response.reset();response.setContentType(application/octet-stream);String filename new File(path).getName();response.addHeader(Content-Disposition, attachment; filename URLEncoder.encode(filename, UTF-8));ServletOutputStream outputStream response.getOutputStream();byte[] b new byte[1024];int len;//从输入流中读取一定数量的字节并将其存储在缓冲区字节数组中读到末尾返回-1while ((len inputStream.read(b)) > 0) {outputStream.write(b, 0, len);}inputStream.close();}
3. 下载网络文件到本地 /*** param path 下载后的文件路径和名称* param netAddress 文件所在网络地址* 功能描述 网络文件下载到服务器本地*/RequestMapping(/netDownloadLocal)public void downloadNet(String netAddress, String path) throws IOException {URL url new URL(netAddress);URLConnection conn url.openConnection();InputStream inputStream conn.getInputStream();FileOutputStream fileOutputStream new FileOutputStream(path); int bytesum 0;int byteread;byte[] buffer new byte[1024];while ((byteread inputStream.read(buffer)) ! -1) {bytesum byteread;System.out.println(bytesum);fileOutputStream.write(buffer, 0, byteread);}fileOutputStream.close();}
4. 网络文件获取到服务器后经服务器处理后响应给前端 /*** param netAddress* param filename* param isOnLine* param response* 功能描述 网络文件获取到服务器后经服务器处理后响应给前端*/RequestMapping(/netDownLoadNet)public void netDownLoadNet(String netAddress, String filename, boolean isOnLine, HttpServletResponse response) throws Exception { URL url new URL(netAddress);URLConnection conn url.openConnection();InputStream inputStream conn.getInputStream(); response.reset();response.setContentType(conn.getContentType());if (isOnLine) {// 在线打开方式 文件名应该编码成UTF-8response.setHeader(Content-Disposition, inline; filename URLEncoder.encode(filename, UTF-8));} else {//纯下载方式 文件名应该编码成UTF-8response.setHeader(Content-Disposition, attachment; filename URLEncoder.encode(filename, UTF-8));} byte[] buffer new byte[1024];int len;OutputStream outputStream response.getOutputStream();while ((len inputStream.read(buffer)) > 0) {outputStream.write(buffer, 0, len);}inputStream.close();}
标签: