在项目中可能会遇到,下载文件的情况,下载文件还是比较好处理的
比较简单的方式就是我们直接写入OutPutstream,网上会有很所类似的教程。
也可以使用一些现成的工具类。
那么当我们遇到了需要下载文件夹的时候,我们不得不遍历所有的文件,去逐个的下载文件,这个时候我们最好是返回给前端一个zip或者tar包的形式,供用户下载使用,这里我来分享一下有关Java如何将文件夹打包并且上传。
这里我们使用的核心类就是
ZipOutputStream
代码如下
- // 一般情况,我们先新建一个ZipOutputStream对象, 其中的outputStream就是我们的输出流
- ZipOutputStream zip = new ZipOutputStream(outputStream);
-
- // 假如这就是我们要下载的文件夹。
- String dir = "/root/data"
-
- // 文件的名称可以根据需要来定制化
- String fileName = "data.zip";
-
- response.setCharacterEncoding("UTF-8");
- response.addHeader("Access-Control-Allow-Origin", "*");
- response.setHeader("Access-Control-Expose-Headers", "*");
- // 下载文件名乱码问题
- response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
- //response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + downloadName);
- response.setContentType("application/octet-stream;charset=UTF-8");
-
- // 这就是最高级目录了,这也是最核心的方法,建立zip包下的层级关系,然后遇到文件写进去就行了,其他没啥特殊的
- zip.putNextEntry(new ZipEntry(dir));
-
- // 接下来,就是写一个递归方法了,类似下面的这个方法 , 伪代码如下
-
- private void handlerFile(Item item, String base) {
- zip.putNextEntry(new ZipEntry(dir + "" + base));
- if(item.isdir()) {
- // 如果是文件夹,文件夹没有内容的,只需要继续递归,要注意的是,zip文件夹的路径拼接
- handlerFile(item, base + item.name);
- } else {
- // 写文件,这里就要正式写文件了
- inputStream = item.getinputStream;
- BufferedInputStream bis = new BufferedInputStream(inputStream);
- byte[] buffer = new byte[1024];
- int num;
- while ((num = inputStream.read(buffer)) != -1) {
- zip.write(buffer, 0, num);
- }
- zip.flush();
- IOUtils.closeQuietly(bis);
-
- }
-
- }
-