资讯专栏INFORMATION COLUMN

Java实现下载文件到本地

ytwman / 4021人阅读

摘要:下载下载下载用户信息表必要的说明目前存在下载中文的文件名出现乱码,但好在不影响其中的内容,只是文件名会乱码。问题链接引用实现将文件或者文件夹压缩成

需求

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

效果预览

代码 主要方法
/**
     * 下载生成的所有在线/离线用户信息表格
     * @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] https://www.cnblogs.com/zeng1... Java实现将文件或者文件夹压缩成zip

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/72681.html

相关文章

  • 多线程系列之学习多线程下载的基本原理和基本用法(1)

    摘要:多线程下载原理及步骤在本地创建一个大小跟服务器文件相同大小的临时文件。在这里在介绍一个有关多线程下载的中的相关类随机文件访问类只有才有搜寻方法,而这个方法也只适用于文件。利用这个类才能实现文件的多线程下载。 多线程下载在我们生活中非常常见,比如迅雷就是我们常用的多线程的下载工具,当然还有断点续传,断点续传我们在下一节来讲,android手机端下载文件时也可以用多线程下载,我们这里是在j...

    darry 评论0 收藏0
  • Maven就是这么简单

    摘要:软件项目的管理就会变得简单很多。比如说的驱动程序,,在是获取不到的,就需要手工上传到里是仓库组,在里没有这个概念,是特有的。 什么是Maven Maven是一个采用纯Java编写的开源项目管理工具, Maven采用了一种被称之为Project Object Model (POM)概念来管理项目,所有的项目配置信息都被定义在一个叫做POM.xml的文件中.. Maven是一款跨平台的项目...

    leonardofed 评论0 收藏0
  • 怎么用Java从网上下载一个视频下来

    摘要:用的流从网上下载一个视频原理就是用对象与目标地址建立一个链接,用流的方式从这个链接上把视频的二进制数据读取下载然后再写入本地文件。然后循环依次写入缓存的大小,直至结束。 用Java的IO流从网上下载一个视频 原理:就是用URL对象与目标地址建立一个链接,用IO流的方式从这个链接上把视频的二进制数据读取下载然后再写入本地文件。 因为小弟比较菜的缘故,不会下载那些加了密的视频链接,这里我就...

    warmcheng 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<