java下载zip文件


java下载zip文件

1.参考API可见,Java的JDK中提供一个java.util.zip的接口。其压缩过程主要是通过这两个接口压缩文件或者文件夹;

java.util.zip.ZipEntry;

java.util.zip.ZipOutputStream;

2.功能实现

1)页面请求方式:

window.location.href = "/file/do_upload;

2) web端实现

@RequestMapping("/do_upload")

public void test(HttpServletResponse response, String taskId) throws IOException {

    long start = System.currentTimeMillis();

    // 获取附件信息

    List<File> files = fileService.listAllFiles(fileId);

    //判断是否为excel类型文件

    if(CollectionUtils.isEmpty(files)) {

        LOGGER.error("查询无关联图片或者视频");

    } else {

        // 设置文件名

        formatFileName(response, task);

        ZipOutputStream zos = null;

        try {

            zos = new ZipOutputStream(response.getOutputStream());

            for (File srcFile : files) {

                if (StringUtils.isNotEmpty(srcFile.getFileHbasePath()) && StringUtils.isNotEmpty(srcFile.getFileName())) {

                    // 下载附件

                    byte[] bytes = fastDFSService.downloadFile(srcFile.getFileHbasePath());

                    byte[] buf = new byte[1024];

                    zos.putNextEntry(new ZipEntry(srcFile.getFileName()));

                    int len;

                    ByteArrayInputStream in = new ByteArrayInputStream(bytes);

                    while ((len = in.read(buf)) != -1){

                        zos.write(buf, 0, len);

                    }

                    zos.closeEntry();

                }

            }

            long end = System.currentTimeMillis();

            System.out.println("压缩完成,耗时:" + (end - start) +" ms");

        } catch (Exception e) {

            throw new RuntimeException("zip error from ZipUtils",e);

        }finally{

            if(zos != null){

                try {

                    zos.close();

                } catch (IOException e) {

                    e.printStackTrace();

                }

            }

        }

    }

}

设置文件名字和响应信息设置

/**

* @methodname formatFileName

* @Description {设置响应信息和格式化附件名字}

* @author admin

*/

private void formatFileName(HttpServletResponse response) throws UnsupportedEncodingException {

    String fileName = "附件文字";

    Long actualEndTime = new Date().getTime();

    fileName += actualEndTime + ".zip";

    // 获取浏览器信息

    if (request.getHeader("User-Agent").toLowerCase().indexOf("firefox") > 0) {

        fileName = new String(fileName.getBytes("GB2312"),"ISO-8859-1");

    } else {

        // 处理中文文件名的问题

        fileName = java.net.URLEncoder.encode(fileName, "UTF-8");

        fileName = new String(fileName.getBytes("UTF-8"), "GBK");

    }

    // 清除首部的空白行

    response.reset();

    // 设置Response容器的编码

    response.setCharacterEncoding("UTF-8");

    // 不同类型的文件对应不同的MIME类型

    response.setContentType("application/x-msdownload");

    response.setHeader("Content-Disposition","attachment; filename="+fileName);

}