• java+批量下载文件到指定文件夹


    需求

    导出文件后存留在了服务器中,需要提供下载按钮,点击后可下载到本地;(因为涉及多个文件,下载前先将文件进行压缩,提供下载压缩文件)

    效果预览

     

    代码

    主要方法

    /**
         * 下载生成的所有在线/离线用户信息表格
         * @param request
         * @param response
         * @return 压缩文件
         * @throws FTPConnectionClosedException
         * @throws IOException
         */ public File downloadExcel (HttpServletRequest request, HttpServletResponse response) throws FTPConnectionClosedException, IOException { //提供下载文件前进行压缩,即服务端生成压缩文件 File file = new File(zipPath);
            FileOutputStream fos = new FileOutputStream(file);
            ZipUtils.toZip(path, fos, true); //1.获取要下载的文件的绝对路径 String realPath = zipPath; //2.获取要下载的文件名 String fileName = realPath.substring(realPath.lastIndexOf(File.separator)+1);
            response.reset();        
            response.setCharacterEncoding("UTF-8");
            response.setContentType("application/octet-stream"); //3.设置content-disposition响应头控制浏览器以下载的形式打开文件 response.addHeader("Content-Disposition","attachment;filename=" + new String(fileName.getBytes(),"utf-8")); //获取文件输入流 InputStream in = new FileInputStream(realPath); int len = 0; byte[] buffer = new byte[1024];
            OutputStream out = response.getOutputStream(); while ((len = in.read(buffer)) > 0) { //将缓冲区的数据输出到客户端浏览器 out.write(buffer,0,len);
            } in.close(); return file;

        }

    压缩方法

    public static void toZip(String srcDir, OutputStream out, boolean KeepDirStructure) throws RuntimeException{ long start = System.currentTimeMillis();
            ZipOutputStream zos = null ; try {
                zos = new ZipOutputStream(out);
                File sourceFile = new File(srcDir);
                compress(sourceFile,zos,sourceFile.getName(),KeepDirStructure); 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();
                    }
                }
            }        
        }
        
         * 递归压缩方法
         * @param sourceFile 源文件
         * @param zos        zip输出流
         * @param name       压缩后的名称
         * @param KeepDirStructure  是否保留原来的目录结构,true:保留目录结构; 
         * false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)
         * @throws Exception
         */ private static void compress(File sourceFile, ZipOutputStream zos, String name, boolean KeepDirStructure) throws Exception{ byte[] buf = new byte[BUFFER_SIZE]; if(sourceFile.isFile()){ // 向zip输出流中添加一个zip实体,构造器中name为zip实体的文件的名字 zos.putNextEntry(new ZipEntry(name)); // copy文件到zip输出流中 int len;
                FileInputStream in = new FileInputStream(sourceFile); while ((len = in.read(buf)) != -1){
                    zos.write(buf, 0, len);
                } // Complete the entry zos.closeEntry(); in.close();
            } else {
                File[] listFiles = sourceFile.listFiles(); if(listFiles == null || listFiles.length == 0){ // 需要保留原来的文件结构时,需要对空文件夹进行处理 if(KeepDirStructure){ // 空文件夹的处理 zos.putNextEntry(new ZipEntry(name + "/")); // 没有文件,不需要文件的copy zos.closeEntry();
                    }
                }else { for (File file : listFiles) { // 判断是否需要保留原来的文件结构 if (KeepDirStructure) { // 注意:file.getName()前面需要带上父文件夹的名字加一斜杠, // 不然最后压缩包中就不能保留原来的文件结构,即:所有文件都跑到压缩包根目录下了 compress(file, zos, name + "/" + file.getName(),KeepDirStructure);
                        } else {
                            compress(file, zos, file.getName(),KeepDirStructure);
                        }
                        
                    }
                }
            }
        }
    SpringMVC

    @Download @Path("downloadExcel") public File DownloadExcel(HttpServletRequest request, HttpServletResponse response) throws FTPConnectionClosedException, IOException {
            File file = exportXMPPUserInfo.downloadExcel(request, response); return file;

        }

    前端

    公司内部写法,理解其中含义即可。
    ...
        <input id="downloadExcel" type="submit" value="下载" />
        ...
        
    <script>
        ...
        //下载excel
        W.$('downloadExcel').on('click',function(e){    
            W.download('userLoginService/downloadExcel');
            /* W.get('userLoginService/downloadExcel').done(function(result){
                console.log("下载用户信息表");
                
            }); */
        }); 
        ...

    </script>

    详细配置信息可以参考我写的这篇文章:http://blog.ncmem.com/wordpress/2019/06/14/java%e6%89%b9%e9%87%8f%e4%b8%8b%e8%bd%bd%e6%96%87%e4%bb%b6%e5%88%b0%e6%8c%87%e5%ae%9a%e6%96%87%e4%bb%b6%e5%a4%b9/ 

    
    
  • 相关阅读:
    FMDB使用的一点心得:数据库创建、制表、查询等以及image转换成二进制nsdata保存到数据库中
    Java基本数据类型
    hashtable C++实现
    Libgdx中TextButton的一些思考
    [伯努利数] poj 1707 Sum of powers
    POJ 3020:Antenna Placement(无向二分图的最小路径覆盖)
    flume 读取kafka 数据
    [R] 之 帮助函数
    [python] 之 类编码细节
    [python] 之 装饰器
  • 原文地址:https://www.cnblogs.com/songsu/p/11303960.html
Copyright © 2020-2023  润新知