栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java后台Controller实现文件下载操作

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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 fileNames = new ArrayList<>();
    //创建一个通用的多部分解析器 
    CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext()); 
      //判断 request 是否有文件上传,即多部分请求 
      if(multipartResolver.isMultipart(request)){
 //转换成多部分request  
 MultipartHttpServletRequest multiRequest =multipartResolver.resolveMultipart(request); 
 MultiValueMap multiFileMap = multiRequest.getMultiFileMap();
 List fileSet = new linkedList<>();
 for(Entry> 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中配置一个监听


    
      org.springframework.web.context.request.RequestContextListener
    
  

(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实现文件下载操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持考高分网。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/131244.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号