Java后台Controller实现文件下载操作
代码
参数:
1.filePath:文件的绝对路径(d:downloada.xlsx)
2.fileName(a.xlsx)
3.编码格式(GBK)
4.response、request不介绍了,从控制器传入的http对象
代码片.
//控制器@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了
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架构师根本就飘在天空没下来,根本就没想文件上传这一回事
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中配置一个监听
<listener> <listener-class> org.springframework.web.context.request.RequestContextListener </listener-class> </listener>
(2)HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
文件下载(直接用链接下载的不算),这比较简单
1、本地文件下载(即文件保存在本地)
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)
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实现文件下载操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持好吧啦网。
相关文章: