代码
参数:
1.filePath:文件的绝对路径(d:\download\a.xlsx)
2.fileName(a.xlsx)
3.编码格式(GBK)
4.response、request不介绍了,从控制器传入的http对象
代码片.
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 | //控制器 @RequestMapping (UrlConstants.BLACKLIST_TESTDOWNLOAD) public void downLoad(String filePath, HttpServletResponse response, HttpServletRequest request) throws Exception { boolean is = myDownLoad( "D:\\a.xlsx" , "a.xlsx" , "GBK" ,response,request); if (is) System.out.println( "成功" ); else System.out.println( "失败" ); } //下载方法 public boolean myDownLoad(String filePath,String fileName, String encoding, HttpServletResponse response, HttpServletRequest request){ File f = new File(filePath); if (!f.exists()) { try { response.sendError( 404 , "File not found!" ); } catch (IOException e) { e.printStackTrace(); } return false ; } String type = fileName.substring(fileName.lastIndexOf( "." ) + 1 ); //判断下载类型 xlsx 或 xls 现在只实现了xlsx、xls两个类型的文件下载 if (type.equalsIgnoreCase( "xlsx" ) || type.equalsIgnoreCase( "xls" )){ response.setContentType( "application/force-download;charset=UTF-8" ); final String userAgent = request.getHeader( "USER-AGENT" ); try { if (StringUtils.contains(userAgent, "MSIE" ) || StringUtils.contains(userAgent, "Edge" )) { // IE浏览器 fileName = URLEncoder.encode(fileName, "UTF8" ); } else if (StringUtils.contains(userAgent, "Mozilla" )) { // google,火狐浏览器 fileName = new String(fileName.getBytes(), "ISO8859-1" ); } else { fileName = URLEncoder.encode(fileName, "UTF8" ); // 其他浏览器 } response.setHeader( "Content-disposition" , "attachment; filename=" + fileName); } catch (UnsupportedEncodingException e) { logger.error(e.getMessage(), e); return false ; } InputStream in = null ; OutputStream out = null ; try { //获取要下载的文件输入流 in = new FileInputStream(filePath); int len = 0 ; //创建数据缓冲区 byte [] buffer = new byte [ 1024 ]; //通过response对象获取outputStream流 out = response.getOutputStream(); //将FileInputStream流写入到buffer缓冲区 while ((len = in.read(buffer)) > 0 ) { //使用OutputStream将缓冲区的数据输出到浏览器 out.write(buffer, 0 ,len); } //这一步走完,将文件传入OutputStream中后,页面就会弹出下载框 } catch (Exception e) { logger.error(e.getMessage(), e); return false ; } finally { try { if (out != null ) out.close(); if (in!= null ) in.close(); } catch (IOException e) { logger.error(e.getMessage(), e); } } return true ; } else { logger.error( "不支持的下载类型!" ); return false ; } } |
实现效果
1.火狐浏览器效果
2.chrome效果,自动下载
补充知识:文件上传/下载的几种写法(java后端)
文件上传
1、框架已经帮你获取到文件对象File了
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 | public boolean uploadFileToLocale(File uploadFile,String filePath) { boolean ret_bl = false ; try { InputStream in = new FileInputStream(uploadFile); ret_bl=copyFile(in,filePath); } catch (Exception e) { e.printStackTrace(); } return ret_bl; } public boolean copyFile(InputStream in,String filePath) { boolean ret_bl = false ; FileOutputStream os= null ; try { os = new FileOutputStream(filePath, false ); byte [] b = new byte [ 8 * 1024 ]; int length = 0 ; while ((length = in.read(b)) > 0 ) { os.write(b, 0 , length); } os.close(); in.close(); ret_bl = true ; } catch (Exception e) { e.printStackTrace(); } finally { try { if (os!= null ){ os.close(); } if (in!= null ){ in.close(); } } catch (IOException e) { e.printStackTrace(); } } return ret_bl; } } |
2、天了个撸,SB架构师根本就飘在天空没下来,根本就没想文件上传这一回事
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 | public String uploadByHttp(HttpServletRequest request) throws Exception{ String filePath= null ; List<String> fileNames = new ArrayList<>(); //创建一个通用的多部分解析器 CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext()); //判断 request 是否有文件上传,即多部分请求 if (multipartResolver.isMultipart(request)){ //转换成多部分request MultipartHttpServletRequest multiRequest =multipartResolver.resolveMultipart(request); MultiValueMap<String,MultipartFile> multiFileMap = multiRequest.getMultiFileMap(); List<MultipartFile> fileSet = new LinkedList<>(); for (Entry<String, List<MultipartFile>> temp : multiFileMap.entrySet()){ fileSet = temp.getValue(); } String rootPath=System.getProperty( "user.dir" ); for (MultipartFile temp : fileSet){ filePath=rootPath+ "/tem/" +temp.getOriginalFilename(); File file = new File(filePath); if (!file.exists()){ file.mkdirs(); } fileNames.add(temp.getOriginalFilename()); temp.transferTo(file); } } } |
3、神啊,我正在撸框架,请问HttpServletRequest怎么获取!!!!
(1)在web.xml中配置一个监听
1 2 3 4 5 | < listener > < listener-class > org.springframework.web.context.request.RequestContextListener </ listener-class > </ listener > |
(2)HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
文件下载(直接用链接下载的不算),这比较简单
1、本地文件下载(即文件保存在本地)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | public void fileDownLoad(HttpServletRequest request,HttpServletResponse response,String fileName,String filePath) throws Exception { response.setCharacterEncoding( "UTF-8" ); //设置ContentType字段值 response.setContentType( "text/html;charset=utf-8" ); //通知浏览器以下载的方式打开 response.addHeader( "Content-type" , "appllication/octet-stream" ); response.addHeader( "Content-Disposition" , "attachment;filename=" +fileName); //通知文件流读取文件 InputStream in = request.getServletContext().getResourceAsStream(filePath); //获取response对象的输出流 OutputStream out = response.getOutputStream(); byte [] buffer = new byte [ 1024 ]; int len; //循环取出流中的数据 while ((len = in.read(buffer)) != - 1 ){ out.write(buffer, 0 ,len); } } |
2、远程文件下载(即网上资源下载,只知道文件URI)
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 | public static void downLoadFromUrl(String urlStr,String fileName,HttpServletResponse response){ try { urlStr=urlStr.replaceAll( "\\\\" , "/" ); URL url = new URL(urlStr); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); //设置超时间为3秒 conn.setConnectTimeout( 3 * 1000 ); //防止屏蔽程序抓取而返回403错误 conn.setRequestProperty( "User-Agent" , "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)" ); //得到输入流 InputStream inputStream = conn.getInputStream(); response.reset(); response.setContentType( "application/octet-stream; charset=utf-8" ); response.setHeader( "Content-Disposition" , "attachment; filename=" + new String(fileName.getBytes( "GBK" ), "ISO8859_1" )); //获取响应报文输出流对象 //获取response对象的输出流 OutputStream out = response.getOutputStream(); byte [] buffer = new byte [ 1024 ]; int len; //循环取出流中的数据 while ((len = in.read(buffer)) != - 1 ){ out.write(buffer, 0 ,len); } } catch (Exception e) { e.printStackTrace(); } } |
以上这篇Java后台Controller实现文件下载操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持自学编程网。
- 本文固定链接: https://zxbcw.cn/post/197035/
- 转载请注明:必须在正文中标注并保留原文链接
- QQ群: PHP高手阵营官方总群(344148542)
- QQ群: Yii2.0开发(304864863)