批量文件打包下载

Java 实现文件批量文件打包下载 import java.io.*; import java.util.zip.*; public class FileZip {     /**      * @param args      */          //压缩已完成!bingo     public static void main(String[] args) {         // TODO Auto- 阅读详情

最近工作上有个需求,获取批量文件,打包下载,如果源文件名中有重复,则需要重命名(加角标),如果压缩后文件超过20兆,出于宽带考虑,不下载,但给与提示.

思路. 先获取所有文件,重命名,再压缩存起来再判断大小,满足大小写出流,不满足给与提示

 

话不多说,如下代码可以直接运行,赋有运行结果展示.

 

package com.fisher.cloud.controller;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * @author Fisher
 */
@Controller
@RequestMapping("/test")
public class Test {

    private static final Logger logger = LoggerFactory.getLogger(Test.class);


    @RequestMapping(value = "/download", method = RequestMethod.GET)
    @ResponseBody
    public String downloadAttachment(HttpServletResponse response) throws IOException {
        //测试如下2个目录下的文件打包,两个目录一样的是为了测试重命名问题
        File file1 = new File("D:\\IT\\参考资料\\文件导入导出");
        File file2 = new File("D:\\IT\\参考资料\\文件导入导出");
        File file3 = new File("D:\\IT\\参考资料\\文件下载模板导出方式");

        // 获取所有文件
        List<File> fileList1 = Arrays.asList(file1.listFiles());
        List<File> fileList2 = Arrays.asList(file2.listFiles());
        List<File> fileList3 = Arrays.asList(file3.listFiles());
        List<File> totalFile = new ArrayList<>();
        if (fileList1.size() > 0) {
            for (File f : fileList1) {
                totalFile.add(f);
            }
        }
        if (fileList2.size() > 0) {
            for (File f : fileList2) {
                totalFile.add(f);
            }
        }
        if (fileList3.size() > 0) {
            for (File f : fileList3) {
                totalFile.add(f);
            }
        }
        try {
            // 压缩文件 到"D:\IT\test",名字为 "hello.zip
            File zipFile = this.zipFiles(totalFile, "D:\\IT\\test", "hello.zip");
            // 如果压缩文件大于20兆,返回提示
            Integer maxSize = 20;
            if (maxSize * 1024 * 1024 < zipFile.length()) {
                return "压缩包超过规定的20兆大小,限制下载";
            } else {
                // 将文件写出
                writeOut(response, zipFile);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;

    }

    // 批量文件压缩成zip包
    public File zipFiles(List<File> fileList, String zipPath, String zipName) throws IOException {
        // 如果被压缩文件中有重复,会重命名
        Map<String, String> namePathMap = getTransferName(fileList);
        File zipPathFile = new File(zipPath);
        // 文件夹不存在则创建
        if (!zipPathFile.exists()) {
            zipPathFile.mkdirs();
        }
        File zipFile = new File(zipPath + File.separator + zipName);
        if (!zipFile.exists()) {
            zipFile.createNewFile();
        }
        ZipOutputStream zos = null;
        BufferedInputStream bis = null;
        try {
            // 存放的目标文件
            zos = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFile.getPath())));
            Set<String> keySet = namePathMap.keySet();
            ZipEntry zipEntry = null;
            for (String key : keySet) { // key是文件名,value是path
                // 指定源文件
                File sourceFile = new File(namePathMap.get(key));
                // 创建ZIP实体,并添加进压缩包,指定压缩文件中的文件名
                zipEntry = new ZipEntry(key);
                zos.putNextEntry(zipEntry);
                // 读取待压缩的文件并写进压缩包里
                bis = new BufferedInputStream(new BufferedInputStream(new FileInputStream(sourceFile), 1024 * 10));
                byte[] bufs = new byte[1024 * 10];
                int read = 0;
                while ((read = (bis.read(bufs, 0, 1024 * 10))) != -1) {
                    zos.write(bufs, 0, read);
                }
                if (bis != null) {
                    bis.close();
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 关闭流
            if (bis != null) {
                bis.close();
            }
            if (null != zos) {
                zos.close();
            }
        }
        return zipFile;

    }

    /**
     * 将文件写出到流 【方法名】{方法的功能/动作描述}
     * @author Fisher
     * 
     * */
    private void writeOut(HttpServletResponse response, File zipFile) throws IOException {
        response.reset();
        response.setContentType("application/zip");
        response.setCharacterEncoding("utf-8");
        response.setHeader("Content-Disposition", "attachment;filename=" + zipFile.getName());
        OutputStream outputStream = response.getOutputStream();
        FileInputStream fis = null;
        try {
            fis = new FileInputStream(zipFile.getPath());
            int len = 0;
            byte[] buffer = new byte[1024];
            while ((len = fis.read(buffer)) > 0) {
                outputStream.write(buffer, 0, len);
            }
            outputStream.flush();
        } finally {
            if (null != fis) {
                fis.close();
            }
            if (null != outputStream) {
                outputStream.close();
            }
        }
    }

    // 计算压缩包如果已存在重复的名称,则在重复文件后面跟上数字 如: 文件(1).doc,文件(2).doc
    public Map<String, String> getTransferName(List<File> fileList) {
        if (fileList == null || fileList.size() == 0) {
            return new HashMap<String, String>();
        }
        // key存放文件名,value存放path
        Map<String, String> fileNameMap = new HashMap<>();
        List<String> fileNames = new ArrayList<>();
        for (File file : fileList) {
            // 获取文件名
            String fileName = file.getName();
            int count = 0;

            for (String name : fileNames) {
                if (name != null && name.equals(fileName)) {
                    count++;
                }
            }
            fileNames.add(fileName);
            if (count > 0) {
                int lastIndex = fileName.lastIndexOf('.');
                String name = fileName.substring(0, lastIndex);
                String type = fileName.substring(lastIndex + 1, fileName.length());
                fileName = new StringBuilder().append(name).append("(").append(count).append(")").append(".")
                        .append(type).toString();
                fileNameMap.put(fileName, file.getPath());
            } else {
                fileNameMap.put(fileName, file.getPath());
            }
        }
        return fileNameMap;
    }

}
 

测试结果:相同名字会重复命名

 

超过20兆不下载,给与提示

 

 

 

 

 

 

 

 

js实现oss批量下载文件_前端实现批量打包下载文件 需求说明:后端接口返回附件列表(含URL),这些附件存在阿里云OSS上。一期需求是实现对列出的附件进行点击下载,也就是每次只下载点击的附件(PDF |图片),使用一段时间后制定二期需求时,增加批量下载功能,需要打包在一起。附言:本文所写都是纯前端实现,后端接口只需要返回路径即可。单独下载图片:直接使用标签,会存在这样的问题:同源链接点击后直接在浏览器打开,通过在标签内指定download属性可以... 阅读详情

相关推荐

基于 JSZip 的批量下载文件打包方案

基于 JSZip 的批量下载文件打包方案

Jinuss的博客 2203

从minio 获取文件,打包下载 简单笔记

controller 层。打包下载。minio打包下载。minio获取文件流

XIAOTONGZHU的博客 2873

Java实现多文件批量下载:打包压缩文件或文件夹生成zip

在前端开发中,有时候需要实现多文件的批量下载功能,可以通过在后端使用Java来实现将多个文件或文件夹打包压缩成一个zip文件,然后提供给前端进行下载。首先,我们需要使用Java的ZipOutputStream类来创建一个新的zip文件,并将要下载的文件或文件夹逐个添加到zip中。方法用于处理文件夹,它遍历文件夹中的所有文件和子文件夹,并根据父文件夹的路径构建zip文件中的相对路径。方法时,就会生成一个包含多个文件的zip文件,并将该文件作为响应发送给前端,实现了多文件的批量下载功能。方法,该方法接受一个。

loop_git667的博客 2098

minIO中打包下载文件夹

首先检查文件夹路径是否为正确,然后获取文件夹下所有文件的路径,根据这些路径再下载所有文件,然后将所有文件打包为一个zip压缩包。

qq_38431321的博客 5024

批量文件图片打包下载技术指南

批量打包作为一种技术手段,其本身并不直接与安全威胁挂钩,但打包过程中涉及的文件和数据可能成为攻击者的目标。常见的安全问题包括:恶意软件感染:打包时可能包含恶意软件,特别是当来源文件未经过严格检测时。数据泄露:打包文件在传输过程中可能被截获,导致敏感信息外泄。未授权访问:打包文件在未加适当保护的情况下存储或共享,可能被未授权的第三方访问。Python的基础语法对初学者较为友好。Python使用缩进来区分代码块,不需要大括号或关键字。

weixin_35734408的博客 773

minio.zip minio.zip

minio 自用版,windows版本。比fastDFS更轻量,支持集群部署。minio 自用版,windows版本。比fastDFS更轻量,支持集群部署。

java 批量下载文件 打包成zip包

【代码】java 批量下载文件 打包成zip包。

qq_42900469的博客 3324

从零开始:如何用Python手绘波特图并分析电路稳定性

本文详细介绍了如何使用Python绘制波特图并分析电路稳定性,涵盖从基础理论到实际应用的完整流程。通过NumPy和Matplotlib实现频域分析,包括RC低通滤波器和RLC带通滤波器的案例,以及相位裕度计算等高级技巧,为电子工程师提供了一套高效的电路分析解决方案。

hhh00的博客 371

java 批量下载将多个文件(minio中存储)压缩成一个zip包

批量下载,zip压缩下载,minio下载文件导出

weixin_41043580的博客 1万+

OpenBmc开发2:构建开发环境

编译环境VMware + ubuntu 18.04 编译环境构建:参考OpenBmc开发1:构建开发环境 1、打开一个Ternimal,进入openbmc目录下 2、查看有哪些不同的编译配置 find meta-* -name local.conf.sample 可以看到如下编译配置 3、生成编译配置 插入TEMPLATECONF,上边查询到的配置有很多,但是有一些...

master 2万+

全新YOLOv11一文弄懂 | YOLOv11网络结构解读 、yolov11.yaml配置文件详细解读与说明、模型训练参数详细解析 | 通俗易懂!入门必看系列!

本文全面介绍了YOLOv11目标检测算法,包含网络结构解析、yaml配置文件详解及训练教程。YOLOv11通过改进的C3k2f模块、SPPF和C2PSA注意力机制等创新设计,在COCO数据集上实现了比YOLOv8更优的性能。文章详细解读了yolov11.yaml配置文件的参数设置、主干网络(backbone)和头部网络(head)结构,并提供了完整的训练代码示例和参数说明。训练部分涵盖了模型选择、参数设置及优化技巧,包括epochs、batch size、学习率等关键参数的调整建议。最后总结了YOLOv11

Ai缝合怪、助力小伙伴高效发论文 3万+

JAVA实现文件批量打包下载

JAVA实现文件批量打包下载 实现 1.打包工具类的实现 /** * @author zhouxuan * @since 2019/4/19 */ public class ZipUtils { /** * @author zhouxuan * @since 2019/4/19 */ public class ZipUtils { /** * 批量打包 ...

zhouxuanwushini的博客 9422

ArcGIS Pro 3.4 二次开发 - 知识图谱

本文介绍了在ArcGIS Pro SDK 3.4和.NET 8环境下操作知识图谱的方法。主要包含两大功能模块:1) 知识图谱数据存储操作,包括建立连接、获取图层、检索要素类与表定义、ID转换等;2) 知识图谱数据模型管理,如获取数据模型属性、标识符信息等。代码示例详细展示了如何使用C#通过QueuedTask异步任务与知识图谱服务交互,包括异常处理、数据转换等常见操作场景。所有示例均采用using语句确保资源释放,并遵循ArcGIS Pro SDK的最佳实践。

Winemonk 763

Vue 中批量下载文件并打包

1.安装 3 个依赖: axios, jszip, file-saver yarn add axios yarn add jszip yarn add file-saver 本地idea编译器进行下载 npm install -S axios npm install -S jszip npm install -S file-saver -S将依赖写入package.josn里面 S...

迷茫,是因为才华配不上梦想... 6089

基于Simulink的基于MPC的实时ZMP约束步态优化仿真

本文完成了基于Simulink的MPC实时ZMP约束步态优化仿真,实现了:✅ 建立3D-LIPM预测模型✅ 设计带ZMP可行域约束的MPC优化器✅ 实现闭环实时求解与扰动抑制✅ 验证强鲁棒性与安全性✅ 为人形机器人野外行走、人机交互提供先进控制方案。

xiaoheshang_123的博客 86

光学材料仿真软件:FDTD Solutions_(4).材料属性的定义与应用

在光学材料仿真软件中,材料属性的定义和应用是至关重要的一步。正确地定义材料属性可以确保仿真结果的准确性和可靠性。本节将详细介绍如何在FDTD Solutions中定义和应用不同的材料属性,包括介质材料、金属材料、色散材料等,并提供具体的代码示例和数据样例。介质材料是光学仿真中最常见的材料类型之一。在FDTD Solutions中,可以通过多种方式定义介质材料,包括使用预定义的材料库、自定义材料参数或导入材料数据文件。FDTD Solutions内置了一个丰富的材料库,包含了许多常用材料的光学性质。

kkchenjj的博客 1401

Vue 中批量下载文件并打包,只需下载一次

1. 安装依赖 安装 3 个依赖: axios, jszip, file-saver yarn add axios yarn add jszip yarn add file-saver 2. 下载文件 import axios from 'axios' const getFile = url => { return new Promise((resolve, reject) => ...

前端打工人的博客 3014

snmp MIB详解

每个 MIB 对象都由一个对象标识符(OID)和对象类型组成。OID 是一个由多个数字组成的路径(类似于 IP 地址),它标识了 MIB 中对象的层次结构。

dlz0836的博客 3722

PHP使用ZipArchive对文件进行批量打包下载

PHP使用ZipArchive对文件进行批量打包下载 话不多说直接上图 DEMO 代码示例 <?php $file = $_GET['file']; //文件判断,无文件阻止 if(!$file){ echo"<script>alert('当前没有文件可供批量下载');history.go(-1);</script>"; r...

DreamCoders 3838

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

文件URL下载及根据URL打包ZIP批量下载

简介:        最近项目中需要做一个批量打包ZIP下载,以前做过,但是没有记录下来。于是又开始烧脑进行开发,本次也记录下来方便大家参考。直接上代码:第一步:    列表选择需要下载的图片,将ID发送至后台。 //下载 function downloadat(id) { document.location=encodeURI("../baseInfo/downloadAttachm...

皮卡丘踢球 6561

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java实现批量打包文件Zip下载(适用于Windows,Linux)

2.Service层 3.批量下载,zip打包效果(示例:Windows版,linux也一样)

qq_51239427的博客 8717

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

SpringBoot文件批量zip打包下载

平时开发中文件的上传下载经常会遇到,如excel的上传下载等,Excel的处理可以使用阿里的EasyExcel,一款快速、简单避免OOM的java处理Excel工具,github:https://github.com/alibaba/easyexcel, 有兴趣的可以自己去尝试下; 此处介绍文件的批量下载, 如果一次性下载多个文件的话, 建议生成文件后将文件打成ZIP包,再下载,Java代码如下: import org.slf4j.Logger; import org.slf4j.LoggerFact

river106的博客 6385

fastDFS批量文件下载,打包zip格式

fastdfs官方github地址:https://github.com/happyfish100/fastdfs 前言、官方的storageClient.download_file1(filepath)下载目前只支持单文件下载,如果需要实现批量下载目前需要自己组装,刚好目前项目有这个需求,所以把实习方式共享出来,目前源码支持打包成jar,欢迎下载 csdn官方下载 https://download.youkuaiyun.com/download/haibo8023/12655412 一、下载示例 @ApiOpera

送你一顷风 4502

java文件批量下载打包成zip

1.首先html页面获取当前需要下载文件的id集合将转成字符串形式传递到后台。 。。。。。。。。。。。。。。。。 2 、下面就是获取字符串之后的批量下载 /** * 多文件批量下载压缩成zip * *rootPath * * */ @RequiresPermissions(value = "/file/download") @R...

Tomas 2765

php zip打包文件批量下载

php zip打包文件批量下载 $zipname = 'file.zip'; //file_path为文件位置,这里用的是thinkphp,路径为相对于入口文件index.php的位置, //down_path为打包后文件的文件名 if(file_exists($res['zpstr1'])){ $fileArr[0] = array('file_path' => './1.jpg', '...

wodecc_u的博客 904
上一篇: 数据库储存过程超简单实例
下一篇: mysql 存储过程
Fisher1229
博客等级 码龄9年 6粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值