欢迎来到飞鸟慕鱼博客,开始您的技术之旅!
当前位置: 首页知识笔记正文

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();} 
标签:
声明:无特别说明,转载请标明本文来源!