java文件下载功能代码(单文件下载、多文件批量打包下载)——普遍适用

简介: 版权声明:本文为博主原创文章,如需转载,请标明出处。 https://blog.csdn.net/alan_liuyue/article/details/72772502 一、前言   程序员在做web等项目的时候,往往都需要添加文件上传、下载、删除的功能,有时是单文件,有时多文件批量 操作,而这些功能的代码程序员可以自己收藏起来当成工具使用,这样,程序员在进行程序设计的时候就会事半功倍 了,那么接下来的博客将会介绍各个框架的文件上传和下载功能的使用方法。
版权声明:本文为博主原创文章,如需转载,请标明出处。 https://blog.csdn.net/alan_liuyue/article/details/72772502

一、前言
  程序员在做web等项目的时候,往往都需要添加文件上传、下载、删除的功能,有时是单文件,有时多文件批量 操作,而这些功能的代码程序员可以自己收藏起来当成工具使用,这样,程序员在进行程序设计的时候就会事半功倍 了,那么接下来的博客将会介绍各个框架的文件上传和下载功能的使用方法。
  这篇博客的重点放在各个框架都能适用的文件下载功能代码,话不多说,直接切入主题:

二、实例

  1.一般需要加入的jar包:
   commons.fileupload-1.2.1.jar和commons.io-1.4.0.jar,点击下载jar包


   2.方法实例:

    //普通java文件下载方法,适用于所有框架  
    public String downloadFilesTest(HttpServletRequest request,HttpServletResponse res) throws IOException {
        //获取文件根目录,不同框架获取的方式不一样,可自由切换  
        String basePath = request.getSession().getServletContext().getRealPath("/upload/fileDir");  

        //获取文件名称(包括文件格式)  
        String fileName = "1.jpg";  

        //组合成完整的文件路径  
        String targetPath = basePath+File.separator+fileName;  

        //模拟多一个文件,用于测试多文件批量下载  
        String targetPath1 = basePath+File.separator+"2.jpg";  
        //模拟文件路径下再添加个文件夹,验证穷举
        String targetPath2 = basePath+File.separator+"test";

        System.out.println("文件名:"+fileName);  
        System.out.println("文件路径:"+targetPath);  

        //方法1:IO流实现下载的功能  
        res.setContentType("text/html; charset=UTF-8"); //设置编码字符  
        res.setContentType("application/octet-stream"); //设置内容类型为下载类型  
        res.setHeader("Content-disposition", "attachment;filename="+fileName);//设置下载的文件名称  
        OutputStream out = res.getOutputStream();   //创建页面返回方式为输出流,会自动弹出下载框   

/*    //方法1-1:IO字节流下载,用于小文件  
        System.out.println("字节流下载");  
        InputStream is = new FileInputStream(targetPath);  //创建文件输入流  
        byte[] Buffer = new byte[2048];  //设置每次读取数据大小,即缓存大小  
        int size = 0;  //用于计算缓存数据是否已经读取完毕,如果数据已经读取完了,则会返回-1  
        while((size=is.read(Buffer)) != -1){  //循环读取数据,如果数据读取完毕则返回-1  
            out.write(Buffer, 0, size); //将每次读取到的数据写入客户端  
        }
        is.close();
        */  


/*    //方法1-2:IO字符流下载,用于大文件  
        System.out.println("字符流");  
        File file = new File(targetPath);  //创建文件  
        FileInputStream fis=new FileInputStream(file);  //创建文件字节输入流  
        BufferedInputStream bis=new BufferedInputStream(fis); //创建文件缓冲输入流  
        byte[] buffer = new byte[bis.available()];//从输入流中读取不受阻塞
        bis.read(buffer);//读取数据文件
        bis.close();
        out.write(buffer);//输出数据文件
        out.flush();//释放缓存
        out.close();//关闭输出流
*/   

/*    //方法1-3:将附件中多个文件进行压缩,批量打包下载文件  
        //创建压缩文件需要的空的zip包  
        String zipBasePath=request.getSession().getServletContext().getRealPath("/upload/zip");  
        String zipName = "temp.zip";
        String zipFilePath = zipBasePath+File.separator+zipName;  

        //创建需要下载的文件路径的集合
        List<String> filePaths = new ArrayList<String>();  
        filePaths.add(targetPath);  
        filePaths.add(targetPath1); 
        filePaths.add(targetPath2);

        //压缩文件
        File zip = new File(zipFilePath);  
        if (!zip.exists()){     
            zip.createNewFile();     
        }
        //创建zip文件输出流  
        ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zip));
        this.zipFile(zipBasePath,zipName, zipFilePath,filePaths,zos);
        zos.close();
        res.setHeader("Content-disposition", "attachment;filename="+zipName);//设置下载的压缩文件名称

        //将打包后的文件写到客户端,输出的方法同上,使用缓冲流输出  
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(zipFilePath));  
        byte[] buff = new byte[bis.available()];  
        bis.read(buff);
        bis.close();
        out.write(buff);//输出数据文件
        out.flush();//释放缓存
        out.close();//关闭输出流
*/
        return null;
    }

    /**
     * 压缩文件
     * @param zipBasePath 临时压缩文件基础路径
     * @param zipName 临时压缩文件名称
     * @param zipFilePath 临时压缩文件完整路径
     * @param filePaths 需要压缩的文件路径集合
     * @throws IOException
     */
    private String zipFile(String zipBasePath, String zipName, String zipFilePath, List<String> filePaths,ZipOutputStream zos) throws IOException {

        //循环读取文件路径集合,获取每一个文件的路径  
        for(String filePath : filePaths){  
            File inputFile = new File(filePath);  //根据文件路径创建文件  
            if(inputFile.exists()) { //判断文件是否存在  
                if (inputFile.isFile()) {  //判断是否属于文件,还是文件夹  
                    //创建输入流读取文件  
                    BufferedInputStream bis = new BufferedInputStream(new FileInputStream(inputFile));  

                    //将文件写入zip内,即将文件进行打包  
                    zos.putNextEntry(new ZipEntry(inputFile.getName()));  

                    //写入文件的方法,同上                  
                    int size = 0;  
                    byte[] buffer = new byte[1024];  //设置读取数据缓存大小
                    while ((size = bis.read(buffer)) > 0) {  
                        zos.write(buffer, 0, size);  
                    }  
                    //关闭输入输出流  
                    zos.closeEntry();  
                    bis.close(); 

                } else {  //如果是文件夹,则使用穷举的方法获取文件,写入zip  
                    try {  
                        File[] files = inputFile.listFiles();  
                        List<String> filePathsTem = new ArrayList<String>();  
                        for (File fileTem:files) {  
                            filePathsTem.add(fileTem.toString());
                        }  
                        return zipFile(zipBasePath, zipName, zipFilePath, filePathsTem,zos);
                    } catch (Exception e) {  
                        e.printStackTrace();  
                    }  
                }  
            }  
        }  
        return null;
    } 
AI 代码解读

三、总结

  1. 该方法结合了字节流、字符流进行单文件和多文件打包下载,方法1-1、方法1-2和方法1-3分别属于不同形式的下载方法,都是在方法1的基础之上进行的操作,三种方法不可同时使用,需要使用哪种类型的方法则去掉注释即可;

  2、实践是检验认识真理性的唯一标准,根据代码和注释多进行尝试,则很快就会明白其中的原理


上一篇:jfinal的绝对路径和action请求路径添加文件夹名称而导致”404 not found”的问题


下一篇: ssh框架之springmvc文件下载功能代码

目录
打赏
0
1
0
0
3
分享
相关文章
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
169 96
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
解锁“分享文件”高效密码:探秘 Java 二叉搜索树算法
在信息爆炸的时代,文件分享至关重要。二叉搜索树(BST)以其高效的查找性能,为文件分享优化提供了新路径。本文聚焦Java环境下BST的应用,介绍其基础结构、实现示例及进阶优化。BST通过有序节点快速定位文件,结合自平衡树、多线程和权限管理,大幅提升文件分享效率与安全性。代码示例展示了文件插入与查找的基本操作,适用于大规模并发场景,确保分享过程流畅高效。掌握BST算法,助力文件分享创新发展。
微信小程序与Java后端实现微信授权登录功能
微信小程序极大地简化了登录注册流程。对于用户而言,仅仅需要点击授权按钮,便能够完成登录操作,无需经历繁琐的注册步骤以及输入账号密码等一系列复杂操作,这种便捷的登录方式极大地提升了用户的使用体验
251 12
Java打包jar运行时分离lib和jar
在`pom.xml`的`build`节点中,设置`packaging`为`jar`,并配置插件分离依赖库到`lib`目录和资源文件到`resources`目录。这样可以在运行时通过`-Dloader.path=lib,resources`加载外部依赖和资源文件,便于独立升级依赖库和修改资源文件,而无需重新打包程序。具体插件包括`maven-dependency-plugin`、`maven-resources-plugin`和`spring-boot-maven-plugin`等。
58 1
深潜数据海洋:Java文件读写全面解析与实战指南
通过本文的详细解析与实战示例,您可以系统地掌握Java中各种文件读写操作,从基本的读写到高效的NIO操作,再到文件复制、移动和删除。希望这些内容能够帮助您在实际项目中处理文件数据,提高开发效率和代码质量。
18 0
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
310 9
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
3月前
|
java项目中jar启动执行日志报错:no main manifest attribute, in /www/wwwroot/snow-server/z-server.jar-jar打包的大小明显小于正常大小如何解决
在Java项目中,启动jar包时遇到“no main manifest attribute”错误,且打包大小明显偏小。常见原因包括:1) Maven配置中跳过主程序打包;2) 缺少Manifest文件或Main-Class属性。解决方案如下:
871 8
java项目中jar启动执行日志报错:no main manifest attribute, in /www/wwwroot/snow-server/z-server.jar-jar打包的大小明显小于正常大小如何解决
如何在 Java 代码中使用 JSqlParser 解析复杂的 SQL 语句?
大家好,我是 V 哥。JSqlParser 是一个用于解析 SQL 语句的 Java 库,可将 SQL 解析为 Java 对象树,支持多种 SQL 类型(如 `SELECT`、`INSERT` 等)。它适用于 SQL 分析、修改、生成和验证等场景。通过 Maven 或 Gradle 安装后,可以方便地在 Java 代码中使用。
362 11
利用 Java 代码获取淘宝关键字 API 接口
在数字化商业时代,精准把握市场动态与消费者需求是企业成功的关键。淘宝作为中国最大的电商平台之一,其海量数据中蕴含丰富的商业洞察。本文介绍如何通过Java代码高效、合规地获取淘宝关键字API接口数据,帮助商家优化产品布局、制定营销策略。主要内容包括: 1. **淘宝关键字API的价值**:洞察用户需求、优化产品标题与详情、制定营销策略。 2. **获取API接口的步骤**:注册账号、申请权限、搭建Java开发环境、编写调用代码、解析响应数据。 3. **注意事项**:遵守法律法规与平台规则,处理API调用限制。 通过这些步骤,商家可以在激烈的市场竞争中脱颖而出。
Git使用教程-将idea本地Java等文件配置到gitte上【保姆级教程】
本内容详细介绍了使用Git进行版本控制的全过程,涵盖从本地仓库创建到远程仓库配置,以及最终推送代码至远程仓库的步骤。
46 0

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等