博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java实现下载文件到本地
阅读量:5912 次
发布时间:2019-06-19

本文共 4460 字,大约阅读时间需要 14 分钟。

需求

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

效果预览

clipboard.png

代码

主要方法

/**     * 下载生成的所有在线/离线用户信息表格     * @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;    }

压缩方法[1]

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;    }

前端

公司内部写法,理解其中含义即可。

...        ...    

必要的说明

目前存在下载中文的文件名出现乱码,但好在不影响其中的内容,只是文件名会乱码。有兴趣的同学可以帮忙解答下。

引用

[1] Java实现将文件或者文件夹压缩成zip

转载地址:http://avmpx.baihongyu.com/

你可能感兴趣的文章
《Spring实战》第四版读书笔记 第一章 Spring之旅
查看>>
那些年,一起学的Java 3-3
查看>>
那些年,一起学的Java 2-4
查看>>
Java中的多态和C#中的多态的区别
查看>>
UIView之【UIViewContentMode】
查看>>
yum 及手动编译rpm包
查看>>
使用Maven运行 MyBatis Generator
查看>>
7-设计模式-代理模式
查看>>
RedHat已更改其开源许可规则
查看>>
Android零基础入门第29节:善用TableLayout表格布局,事半功倍
查看>>
element-ui 的 table后端排序
查看>>
redis集群搭建
查看>>
linux重定向
查看>>
红包生成的模拟器2018今日头条秋招
查看>>
管道符和作业控制,shell变量和环境变量配置文件
查看>>
DirectX3D设备丢失(lost device)的处理(一)
查看>>
来自田野的回音——《背过身去的大娘娘》的读后感范文2600字
查看>>
LNMP架构 (Ⅱ)——nginx相关配置、nginx代理
查看>>
神级python程序员只需要一个公众号,再也不会错过重要资讯
查看>>
双十一流量洪峰 支撑阿里核心业务的云数据库揭秘
查看>>