java浏览器文件打包下载过程解析

 更新时间:2019年10月31日 10:16:06   作者:故城归人  
这篇文章主要介绍了java浏览器文件打包下载过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

最近,在项目中遇到了需要将一系列的图片打包下载的需求,借鉴了网上的一些通用方法,就顺便分享出来实现的方法,不太记得借鉴的是哪位兄弟的博客了,总之万分感谢,进入正题,实现打包下载的基本功能:

1.controller层代码:

/**
   * 图片压缩打包
   */
  @RequestMapping(value = "/zipFile")
  public void compressionFile(HttpServletRequest request, HttpServletResponse response,String busiId) throws Exception{
    //业务代码,根据前台传来的ID查询到资源表的图片list
    SubMetaData subMetaData = subMetaDataService.findByBusiId(busiId);
    if (subMetaData != null) {
      List<SubMetaDataAtt> list = subMetaDataAttService.findByDataId(subMetaData.getDataId());
      if (list.size() > 0){
        subMetaDataAttService.downloadAllFile(request,response,list);
      }
    }
  }

2.service层通用的文件打包下载

/**
   * 将多个文件进行压缩打包,解决文件名下载后的乱码问题
   *
   */
  public void downloadAllFile(HttpServletRequest request, HttpServletResponse response, List<SubMetaDataAtt> list) throws UnsupportedEncodingException{
    String downloadName = "附件图片.zip";
    String userAgent = request.getHeader("User-Agent");
    // 针对IE或者以IE为内核的浏览器:
    if (userAgent.contains("MSIE") || userAgent.contains("Trident")) {
      downloadName = java.net.URLEncoder.encode(downloadName, "UTF-8");
    } else {
      // 非IE浏览器的处理:
      downloadName = new String(downloadName.getBytes("UTF-8"), "ISO-8859-1");
    }
//经过上面的名称处理即可解决文件名下载后乱码的问题
    response.setContentType("multipart/form-data");
    response.setCharacterEncoding("UTF-8");
    response.setHeader("Content-Disposition", String.format("attachment; filename=\"%s\"", downloadName));
    //response.setHeader("Content-Disposition", "attachment;fileName=" + downloadName);
    OutputStream outputStream = null;
    ZipOutputStream zos = null;
    try {
      outputStream = response.getOutputStream();
      zos = new ZipOutputStream(outputStream);
      // 将文件流写入zip中,此方法在下面贴出
      downloadTolocal(zos,list);
    } catch (IOException e) {
      logger.error("downloadAllFile-下载全部附件失败",e);
    }finally {
      if(zos != null) {
        try {
          zos.close();
        } catch (Exception e2) {
          logger.info("关闭输入流时出现错误",e2);
        }
      }
      if(outputStream != null) {
        try {
          outputStream.close();
        } catch (Exception e2) {
          logger.info("关闭输入流时出现错误",e2);
        }
      }

    }

  }

将文件写入zip中的方法:

private void downloadTolocal(ZipOutputStream zos, List<SubMetaDataAtt> list) throws IOException {
    //获取文件信息//此处为业务代码,可根据自己的需要替换,我在这里是将资源表list循环出取得路径以及文件名,然后放进ZipEntry中再执行下载。
    for (SubMetaDataAtt subMetaDataAtt : list) {
      String fileId = subMetaDataAtt.getAttId();
      String fileName = subMetaDataAtt.getFileAlias()+subMetaDataAtt.getFileSuffixName();
      String path = subMetaDataAtt.getFileAbsolutePath();
      InputStream is = null;
      BufferedInputStream in = null;
      byte[] buffer = new byte[1024];
      int len;
      //创建zip实体(一个文件对应一个ZipEntry)
      ZipEntry entry = new ZipEntry(fileName);
      try {
        //获取需要下载的文件流
        File file= new File(path);
        if(file.exists()){
          is = new FileInputStream(file);
        }
        in = new BufferedInputStream(is);
        zos.putNextEntry(entry);
        //文件流循环写入ZipOutputStream
        while ((len = in.read(buffer)) != -1 ) {
          zos.write(buffer, 0, len);
        }
      } catch (Exception e) {
        logger.info("下载全部附件--压缩文件出错",e);
      }finally {
        if(entry != null) {
          try {
            zos.closeEntry();
          } catch (Exception e2) {
            logger.info("下载全部附件--zip实体关闭失败",e2);
          }
        }
        if(in != null) {
          try {
            in.close();
          } catch (Exception e2) {
            logger.info("下载全部附件--文件输入流关闭失败",e2);
          }
        }
        if(is != null) {
          try {
            is.close();
          }catch (Exception e) {
            logger.info("下载全部附件--输入缓冲流关闭失败",e);
          }
        }


      }

    }

3.前台js的请求方法:

注:文件的下载不要使用AJAX请求的方法,这样是无法响应请求的,一般会采用Window.open的方法。

window.open(context+"/sub/submetadataatt/zipFile?busiId="+downloadId);//这里的downloadId是我需要传到后台的变量。

总结:关于上传,下载的操作,实际上是要对于java的IO十分熟悉,才可以玩的转,大家一定要把握好基础才可以在项目中游刃有余,不像我需要去借鉴他人的东西,大家一起努力,加油!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 解决使用mybatis取值,字段赋值错误的问题

    解决使用mybatis取值,字段赋值错误的问题

    这篇文章主要介绍了解决使用mybatis取值,字段赋值错误的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • selenium高效应对Web页面元素刷新的实例讲解

    selenium高效应对Web页面元素刷新的实例讲解

    今天小编就为大家分享一篇selenium高效应对Web页面元素刷新的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • Idea配置maven-tomcat-plugin插件实现项目部署

    Idea配置maven-tomcat-plugin插件实现项目部署

    今天小编就为大家分享一篇关于Idea配置maven-tomcat-plugin插件实现项目部署,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • Java处理图片实现base64编码转换

    Java处理图片实现base64编码转换

    这篇文章主要介绍了Java处理图片实现base64编码转换,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • java 归并排序的实例详解

    java 归并排序的实例详解

    这篇文章主要介绍了java 归并排序的实例详解的相关资料,需要的朋友可以参考下
    2017-07-07
  • IDEA报错:java 找不到符号图文解决过程

    IDEA报错:java 找不到符号图文解决过程

    这篇文章主要给大家介绍了关于IDEA报错:java 找不到符号解决的相关资料,运行项目时Idea报错,提示找不到符号,但是这个类在项目里是存在的,网上找了很多文章都没解决,浪费了一个下午终于弄好了,记录一下,需要的朋友可以参考下
    2023-08-08
  • 获取Java线程转储的常用方法(推荐)

    获取Java线程转储的常用方法(推荐)

    这篇文章主要介绍了获取Java线程转储的常用方法,本文给大家介绍的非常想详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • Spring Boot如何使用EhCache演示

    Spring Boot如何使用EhCache演示

    这篇文章主要介绍了Spring Boot如何使用EhCache演示,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • spring mvc高级技术实例详解

    spring mvc高级技术实例详解

    前面学习了简单的Spring Web知识,接着学习更高阶的Web技术。下面这篇文章主要给大家介绍了spring mvc高级技术的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起看看吧
    2018-09-09
  • 详解Java使用Jsch与sftp服务器实现ssh免密登录

    详解Java使用Jsch与sftp服务器实现ssh免密登录

    这篇文章主要介绍了详解Java使用Jsch与sftp服务器实现ssh免密登录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10

最新评论