精华内容
下载资源
问答
  • 主要为大家详细介绍了java实现批量下载、将多文件打包成zip格式下载,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • java+根据多个url批量下载文件

    千次阅读 2019-08-30 09:24:27
    当我们想要下载网站上的某个资源时,我们会获取一url,它是服务器定位资源的一描述,下载的过程有如下几步: (1)客户端发起一url请求,获取连接对象。 (2)服务器解析url,并且将指定的资源返回一输入...

    1.基本流程

    当我们想要下载网站上的某个资源时,我们会获取一个url,它是服务器定位资源的一个描述,下载的过程有如下几步:

    (1)客户端发起一个url请求,获取连接对象。

    (2)服务器解析url,并且将指定的资源返回一个输入流给客户。

    (3)建立存储的目录以及保存的文件名。

    (4)输出了写数据。

    (5)关闭输入流和输出流。

    2.实现代码的方法

    /**

         * 从网络Url中下载文件

         * @param urlStr

         * @param fileName

         * @param savePath

         * @throws IOException

         */

        public static void  downLoadFromUrl(String urlStr,String fileName,String savePath) throws IOException{

            URL url = new URL(urlStr); 

            HttpURLConnection conn = (HttpURLConnection)url.openConnection(); 

                    //设置超时间为3秒

            conn.setConnectTimeout(3*1000);

            //防止屏蔽程序抓取而返回403错误

            conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");

     

            //得到输入流

            InputStream inputStream = conn.getInputStream(); 

            //获取自己数组

            byte[] getData = readInputStream(inputStream);   

     

            //文件保存位置

            File saveDir = new File(savePath);

            if(!saveDir.exists()){

                saveDir.mkdir();

            }

            File file = new File(saveDir+File.separator+fileName);   

            FileOutputStream fos = new FileOutputStream(file);    

            fos.write(getData);

            if(fos!=null){

                fos.close(); 

            }

            if(inputStream!=null){

                inputStream.close();

            }

     

     

            System.out.println("info:"+url+" download success");

     

        }

     

     

     

        /**

         * 从输入流中获取字节数组

         * @param inputStream

         * @return

         * @throws IOException

         */

        public static byte[] readInputStream(InputStream inputStream) throws IOException { 

            byte[] buffer = new byte[1024]; 

            int len = 0; 

            ByteArrayOutputStream bos = new ByteArrayOutputStream(); 

            while((len = inputStream.read(buffer)) != -1) { 

                bos.write(buffer, 0, len); 

            } 

            bos.close(); 

            return bos.toByteArray(); 

        } 

     

        public static void main(String[] args) {

            try{

                downLoadFromUrl("http://101.95.48.97:8005/res/upload/interface/apptutorials/manualstypeico/6f83ce8f-0da5-49b3-bac8-fd5fc67d2725.png",

                        "百度.jpg","d:/resource/images/diaodiao/country/");

            }catch (Exception e) {

                // TODO: handle exception

            }

        }

     

    效果展现:

    详细配置可参考我写的这篇文章:

    http://blog.ncmem.com/wordpress/2019/08/28/java%e6%89%b9%e9%87%8f%e4%b8%8b%e8%bd%bd/ 

    展开全文
  • 现在需要对列表数据批量下载,将多个文件一起下载并存放到一起通过zip压缩包的形式下载到浏览器 2. 开发步骤 思路: 先将多个文件单独一个个下载存放在磁盘的某个位置,然后再将该文件数据进行压缩. 2.1 逐个下载并存放...

    java实现多个网络文件批量下载并压缩

    1. 使用场景

    文档管理模块,列表中显示的记录的每日文件上传保存的记录.每条数据中有一个字段存放了文件的存储地址文件服务器上

    现在需要对列表数据批量下载,将多个文件一起下载并存放到一起通过zip压缩包的形式下载到浏览器

    2. 开发步骤

    思路: 先将多个文件单独一个个下载存放在磁盘的某个位置,然后再将该文件数据进行压缩.

    2.1 逐个下载并存放至指定路径

    applicationProperties.getUploadPath();读取配置文件指定的下载地址.

    读取配置文件参见

    public List<String> downloadToLocal(List<String> urls){
            // applicationProperties 来源于配置文件读取类,获取本地指定的临时存放区域
            String rootPath = applicationProperties.getUploadPath();
            File file = new File(rootPath);
            if(!file.exists()){
                file.mkdirs();
            }
            List<String> fileList = new ArrayList<>();
            try {
                File f = null;
                FileOutputStream fos = null;
                ZipOutputStream zos = null ;
                for(String url : list){
                    String fileName = url.substring(url.lastIndexOf("/")+1);
                    byte[] bytes = fastDFSClient.downloadFile(url);
                    fileList.add(rootPath + "//" + fileName);
                    f = new File(rootPath + "//" + fileName);
                    fos = new FileOutputStream(f);
                    fos.write(bytes,0,bytes.length);
                }
                zipFile(fileList,response);
                fos.flush();
                fos.close();
                return fileList;
            } catch (Exception e){
                throw new BadRequestAlertException("Batch download file failed",this.getClass().getSimpleName(),"Batch download file failed");
               
            }
    }


    复制代码

    2.2 将多个文件放到文件夹并压缩在浏览器下载

    public void zipFile(List<String> fileUlr, HttpServletResponse response){
            byte [] bytes = new byte[1024];

            String zipFileName= "图片压缩下载";
            BufferedOutputStream bos = null ;
            FileInputStream in = null;
            ZipOutputStream out = null;
            try {
                bos = new BufferedOutputStream(response.getOutputStream());

                response.reset();
                response.setContentType("application/x-msdownload");
                response.setCharacterEncoding("utf-8");
                response.setHeader("Content-disposition""attachment;filename=" + zipFileName + ".zip");

                out = new ZipOutputStream(bos);
                for(String str :  fileUlr) {
                    File  file = new File(str);
                    if(!file.exists()){
                        log.error("文件被删除");
                        continue;
                    }
                    ZipEntry zEntry = new ZipEntry(file.getName());
                    out.putNextEntry(zEntry);
                    in = new FileInputStream(file);
                    byte[] buffer = new byte[1024];
                    int read = 0;
                    while((read = in.read(buffer)) != -1){
                        out.write(buffer, 0, read);
                    }
                }
                out.close();
                bos.close();
                log.info("========= 文件压缩成功 ============");
            } catch (Exception e){
                throw new BadRequestAlertException("zipFile_error" ,this.getClass().getSimpleName(),"zipfile_download_error");
            }
        }

    复制代码

    2.3 指定本地路径直接下载

    /**
         *  下载文件到制定路径
         * @param fileList
         */

        public void zipFile(List<String> fileList){

            String zipName ="批量下载.zip";
            String zipPath = applicationProperties.getUploadPath() + "//" + zipName;

            BufferedInputStream bis =null;
            try {
                ZipOutputStream zipOutput = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipPath)));
                for(String str :  fileList) {
                    File  file = new File(str);
                    if(!file.exists()){
                        log.error("文件被删除");
                        continue;
                    }
                    ZipEntry zEntry = new ZipEntry(file.getName());
                    zipOutput.putNextEntry(zEntry);
                    bis = new BufferedInputStream(new FileInputStream(file));
                    byte[] buffer = new byte[1024];
                    int read = 0;
                    while((read = bis.read(buffer)) != -1){
                        zipOutput.write(buffer, 0, read);
                    }
                }
                zipOutput.finish();
                bis.close();
                zipOutput.close();

            } catch (Exception e) {
                e.printStackTrace();
                log.error(e.getMessage());
            }
        }

    复制代码

    3. 测试

    @ApiOperation(value = "批量下载文件")
        @GetMapping("/downloads")
        public void mutilFileDownLoad(
                @ApiParam(value = "文件路径 ,使用逗号拼接,",required = true)
     @RequestParam(value = "urls") String urls,
                HttpServletResponse response
        )
    {
          List<String> list = Arrays.asList(urls.split(","));
          List<String> filelist = downloadToLocal(list);
          zipFile(filelist);
        
        }

    复制代码
    1. 验证方式一 这种方式只能确保接口没有问题,但是点击链接下载的文件是乱码的
    1. 验证方式二 可以直接将请求的接口直接copy在浏览器 console 通过window.open("http://xxxxx")的方式验证

    然后会自动弹出下载框框

    展开全文
  • JAVA 批量下载文件

    千次阅读 2019-07-04 14:47:07
    最近项目有需求,用户想对挂有附件的数据记录 实现一键下载全部附件(目前项目仅支持每次点击单条记录进行附件下载),下面记录我实现的解决方案。 项目框架基于SSM service业务实现层(impl): //获取配置的...

    最近项目有个需求,用户想对挂有附件的数据记录 实现一键下载全部附件(目前项目仅支持每次点击单条记录进行附件下载),下面记录我实现的解决方案。

    项目框架基于SSM

    service业务实现层(impl):

    //获取配置的文件夹默认位置 (我的properties配的是E\:\\work\\files)	
    @Value("#{configProperties['FILE.DOCUMENT_PATH']}")
    private String documentPath;
    
    //获取附件信息需要调用的mapper
    @Autowired
    JcglSystemHelpMapper jcglSystemHelpMapper;
    
    //参数ids : 为前台传的记录id集 (格式:12345,12346,12347)
    @Override
    public void downloadPlanFile(String ids,HttpServletRequest request,HttpServletResponse response){
    		
    		//响应头的设置
            response.reset();
            response.setCharacterEncoding("utf-8");
            response.setContentType("multipart/form-data");
            //设置压缩包的名字
            String dates = DateFormatUtils.formatJxp2(new Date());//获取时间戳
            String billname = "附件包-"+dates;
            String downloadName = billname+".zip";
            //返回客户端浏览器的版本号、类型
            String agent = request.getHeader("USER-AGENT");  
            try {
            	//针对IE或者以IE为内核的浏览器:  
                if (agent.contains("MSIE")||agent.contains("Trident")) {
                    downloadName = java.net.URLEncoder.encode(downloadName, "UTF-8");
                } else {
                	//非IE浏览器的处理:
                    downloadName = new String(downloadName.getBytes("UTF-8"),"ISO-8859-1");
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            response.setHeader("Content-Disposition", "attachment;fileName=\"" + downloadName + "\"");
            
            //设置压缩流:直接写入response,实现边压缩边下载
            ZipOutputStream zipos = null;
            try {
                zipos = new ZipOutputStream(new BufferedOutputStream(response.getOutputStream()));
                zipos.setMethod(ZipOutputStream.DEFLATED); //设置压缩方法 
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            //循环将文件写入压缩流
            DataOutputStream os = null;
            
           
            //查询数据库获取文件信息
            Map<String,Object> map = new HashMap<String, Object>();
            map.put("ids", ids);
            List<AuthAttachmentDetail> list = jcglSystemHelpMapper.queryAllDetailByDataIds(map);
            //遍历文件信息(主要获取文件名/文件路径等)
            for (AuthAttachmentDetail authAttachmentDetail : list) {
            	//文件路径
                String filePath = documentPath + File.separator + authAttachmentDetail.getFilePath();
            	System.out.println("filePath==="+filePath);
            	File file = new File(filePath);
            	if (!file.exists()) {
            	     throw new BusinessException("文件已不存在");
            	}else{
            		try {
        				//添加ZipEntry,并ZipEntry中写入文件流
            			String fileName = authAttachmentDetail.getFileName();//.substring(0,authAttachmentDetail.getFileName().indexOf("."));
        				zipos.putNextEntry(new ZipEntry(fileName));
        				os = new DataOutputStream(zipos);
        				InputStream is = new FileInputStream(file);
        				byte[] b = new byte[100];
        				int length = 0;
        				while((length = is.read(b))!= -1){
        					os.write(b, 0, length);
        				}
        				is.close();
        				zipos.closeEntry();
        			} catch (IOException e) {
        				e.printStackTrace();
        			} 
            	}
    		}
            
            //关闭流
            try {
                os.flush();
                os.close();
                zipos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }    
    	}

    调用的dao层(mapper) 以及前台传的参数 根据自己业务来定,目的就是为了能拿到需要批量下载的文件信息(文件名/文件路径等),再进行遍历 做文件流处理。

    controller 及 service 做过渡及调用工作。

    controller代码如下:

    /**
    * 批量下载
    * @param ids 业务记录id集(格式xx,xx2,xx3) 用于查询相关表获取文件信息
    * @param request
    * @param response
    */
    @RequestMapping(value = "downloadPlanFile")
    public void downloadPlanFile(String ids,HttpServletRequest request,HttpServletResponse response){
    		reqPlanService.downloadPlanFile(ids,request,response);
    	}

    service代码如下:

    	/**
    	 * 批量下载
    	 * @param ids  记录id集合
    	 * @return
    	 */
    	public void downloadPlanFile(String ids,HttpServletRequest request,HttpServletResponse response);
    

    前端在进行下载前可用ajax做一些校验工作,只要不满足下载就提前抛业务异常。

    前端代码如下:(前端框架采用的easyui)

    //批量下载附件
    attachmentMore:function(){
        //获取选择的记录
    	var rows = $('#xqglReqPlanGrid').datagrid('getChecked');
        if(rows.length <1){
            _alert('请选择记录');
            return false;
        }
        //开启遮罩(进度条)
        $.messager.progress();
        //ids参数准备 用逗号隔开id
        var ids = '';
        $.each(rows,function(index,data){
        	if(rows.length == index+1){
        		ids += data.id;
        	}else{
        		ids += data.id + ",";
        	}
        })
        console.log(ids);
        //下载前的一个业务校验
        $.ajax({
    		type : "POST",
    		url : Config.sysUrl +'/xqglReqPlan/isDownloadPlanFile',
    		data:{"ids":ids},
    		cache : false,
    		success : function(data) {
                            //关闭遮罩(进度条)
    			$.messager.progress('close');
                            //回调成功进行下载
    			if(data.success){
    				window.location.href=Config.sysUrl+ "/xqglReqPlan/downloadPlanFile?ids="+ids;
    			}
    		} 
    	}); 
    }

    前端调用后台下载 我采用的是window.location.href=url 的方式输出。采用这种方式输出流的话,如果期间后台报错抛异常了 前台是不会返回错误信息的,因此我把必要的业务校验用一个ajax提前调用后台进行校验,确保满足下载条件再进行下载。

    测试:

    选中了两条记录,点击批量下载文件后 浏览器弹出文件下载相关信息。

    下载文件正常。

    注:window.location.href=url 可能会请求多次 导致下载后原界面(或浏览器)变成空白,针对此问题的解决方案,我后面记录下来。

    展开全文
  • 线程下载文件 平时开发中有时会用到文件下载,为了提高文件下载速率,采用线程下载能够达到事半功倍的效果: packagetest; /** *文件下载类 * @author luweicheng * */ importjava.io....

    多线程下载文件

    平时开发中有时会用到文件下载,为了提高文件的下载速率,采用多线程下载能够达到事半功倍的效果:

    package test;

    /**

     * 文件下载类

     * @author luweicheng

     *

     */

     

    import java.io.FileInputStream;

    import java.io.FileNotFoundException;

    import java.io.IOException;

    import java.io.InputStream;

    import java.io.RandomAccessFile;

    import java.net.HttpURLConnection;

    import java.net.URL;

    import java.net.URLConnection;

     

    public class DownFile {

        private URL fileUrl;// 文件下载路径

        private int threadCount;// 文件下载的线程数

        private int startPos;// 每个线程下载文件的开始位置

        private int size;// 每个线程下载文件的长度

        private int fileLength;// 文件总程度

        private String pathName;// 下载的文件路径(包含文件名)

        private Downthread[] tDownthreads;// 线程数组

     

        public DownFile(URL url, int threadCount, String pathName) throws IOException {

            fileUrl = url;

            this.threadCount = threadCount;

            this.pathName = pathName;

            init();

     

        }

     

        /**

         * 初始化

         *

         * @throws IOException

         */

        private void init() throws IOException {

            tDownthreads = new Downthread[threadCount];

            HttpURLConnection conn = (HttpURLConnection) fileUrl.openConnection();

            conn.setConnectTimeout(5000);

            conn.setRequestMethod("GET");

            conn.setRequestProperty("connection""keep-alive");

            fileLength = conn.getContentLength();

            System.out.println("文件长度" + fileLength);

            size = fileLength / threadCount;

            System.out.println("每个下载量==" + size);

            conn.disconnect();// 断开链接

     

        }

     

        public URL getFileUrl() {

            return fileUrl;

        }

     

        public int getThreadCount() {

            return this.threadCount;

        }

     

        /**

         * 开始下载

         */

        public void startDown() {

            for (int i = 0; i < threadCount; i++) {

                try {

                    RandomAccessFile raFile = new RandomAccessFile(pathName, "rw");

                    tDownthreads[i] = new Downthread(i * size, raFile, i);

                    tDownthreads[i].start();

                } catch (FileNotFoundException e) {

                    e.printStackTrace();

                }

     

            }

     

        }

     

        /**

         * 下载线程类

         *

         * @author luweicheng

         *

         */

        class Downthread extends Thread {

            private int startPos;// 开始的位置

            private InputStream is;

            private RandomAccessFile raFile;

            private int length;// 下载的文件长度

            private int flag;// 线程标志

     

            public Downthread(int startPos, RandomAccessFile raFile, int i) {

                this.startPos = startPos;

                this.raFile = raFile;

                flag = i;

            }

     

            @Override

            public void run() {

                try {

                    HttpURLConnection connection = (HttpURLConnection) fileUrl.openConnection();

                    connection.setRequestMethod("GET");

                    connection.setRequestProperty("connection""keep-alive");

                    connection.setConnectTimeout(5 * 1000);

                    is = connection.getInputStream();

                    is.skip(startPos);

                    raFile.seek(startPos);

                    byte[] buf = new byte[8 * 1024];

                    int hasread = 0;// 读出的字节数

                    // 将位置在 startPos - startPos 位置的数据读出写入

                    while (length < size && (hasread = is.read(buf)) != -1) {

                        raFile.write(buf, 0, hasread);

                        length += hasread;

                        System.out.println("*****线程" + flag + "下载了*********" + length);

                    }

                    System.out.println("*******线程" + flag + "下载完成*********");

     

                } catch (IOException e) {

     

                } finally {

     

                    try {

                        is.close();

                        raFile.close();

                    } catch (IOException e) {

     

                        e.printStackTrace();

                    }

                }

     

            }

        }

     

    }

     

     效果展示:

    ​​

    详细配置信息可以参考这篇文章: 

    http://blog.ncmem.com/wordpress/2019/08/28/java%e6%89%b9%e9%87%8f%e4%b8%8b%e8%bd%bd/ 

    展开全文
  • 有时候服务运行的日志文件,需要...这个是以服务器的访问日志作为示例,一个日志文件中一行的数据格式如下(文件夹中有多个日志文件): [10/Aug/2018:00:47:39 +0800] ******* - 356 "-" "GET https://****/***...
  • Java后台文件批量压缩下载

    万次阅读 2020-08-28 09:31:29
    最近遇到一需求,要求设计批量下载功能,即点击按钮即可将勾选的文件全部打包成压缩包,批量下载下来。 页面如下,勾选对应的复选框,点击批量下载按钮,即可将复选框对应的附件批量压缩成一zip压缩包,然后...
  • 主要为大家详细介绍了java线程池实现批量下载文件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • /** * 文件下载 * @param request * @param response * @param filePath 文件路径 * @param filename 下载文件名称 */ public static void downLoadFile(HttpServletRequest request,HttpServletResponse ...
  • java 批量下载文件

    千次阅读 2016-01-19 17:35:08
    经常遇到选择多个文件进行批量下载的情况,可以先将选择的所有的文件生成一个zip文件,然后再下载,该zip文件,即可实现批量下载,但是在打包过程中,常常也会出现下载过来的zip文件中里面有乱码的文件名,通过使用...
  • Java 文件批量下载

    千次阅读 2017-03-24 00:33:23
    转载:...ps:批量下载(无弹框,直接保存) import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.F
  • 经常遇到选择多个文件进行批量下载的情况,可以先将选择的所有的文件生成一个zip文件,然后再下载,该zip文件,即可实现批量下载,为了将问题简化,新建java项目,在根目录下随便放入两个文件来模拟我们要同时下载的...
  • 程序员在做web等项目的时候,往往都需要添加文件上传、下载、删除的功能,有时是单文件,有时多文件批量 操作,而这些功能的代码程序员可以自己收藏起来当成工具使用,这样,程序员在进行程序设计的时候就会事半功倍...
  • 1、批量下载网页上,动态生成的图片到服务器上指定的目录中 2、将目录中的所有的图片打包成zip包 3、删除原来的目录 4、下载zip包 1:由于网页上的图片是全部都是连接动态生成的,所以同事在网上找了一...
  • 批量下载文件为zip包的工具类 package com.meeno.trainsys.util; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.net.URLEncoder;...
  • Java批量文件打包下载

    2018-07-17 10:14:13
    经常遇到选择多个文件进行批量下载的情况,可以先将选择的所有的文件生成一个zip文件,然后再下载,该zip文件,即可实现批量下载,但是在打包过程中,常常也会出现下载过来的zip文件中里面有乱码的文件名,通过使用...
  • JAVA WEB 批量文件下载

    千次阅读 2016-02-20 17:02:43
    JAVA WEB 批量文件下载 最近需要这所以写了一例子 一般批量下载由以下步骤组成: 1、确定下载的源文件位置 2、对文件进行打包成临时文件,这里会用到递归调用,需要的嵌套的文件夹进行处理,并返回文件保存位置 ...
  • 使用Java以zip形式批量下载文件、压缩文件

    万次阅读 多人点赞 2020-07-19 21:22:25
    这篇博客详细介绍了在Java中以zip形式批量下载文件,博客中有完整的代码实现。
  • JAVA文件下载文件批量下载方法

    万次阅读 2017-11-14 14:05:04
    JAVA中的文件下载: /** * 文件下载 * @param request * @param response * @param filePath 文件路径 * @param filename 下载文件名称 */ public static void downLoadFile(HttpServletRequest request,...
  • java 批量下载文件(开发笔记)

    千次阅读 2018-08-21 09:36:43
     下载文件,选择单个文档下载单个文档,选择多个文档则讲多个文档压缩进一个压缩文件。   public ResponseEntity&lt;InputStreamResource&gt; downloadFiles(String literIds,String type) throws ...
  • java web批量下载

    千次阅读 2018-01-10 21:43:50
    java批量下载,将多文件打包成zip格式下载 现在的需求的: 根据产品族、产品类型,下载该产品族、产品类型下面的pic包; pic包是zip压缩文件; t_product表: 这些包以blob形式存在另一张表中: t_imagefile...
  • java批量下载为zip

    千次阅读 2019-08-13 17:54:12
    /** 批量下载为 zip **/ public static void batchDownLoadFile(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response){ String filename =...
  • java文件批量下载打包成zip

    千次阅读 2019-11-21 15:33:44
    1.首先html页面获取当前需要下载文件的id集合将转成字符串形式传递到后台。 。。。... * 多文件批量下载压缩成zip * *rootPath * * */ @RequiresPermissions(value = "/file/download") @R...
  • Java多文件批量生成zip下载

    千次阅读 2018-06-06 17:31:59
    1.请求下载URL定义@RequestMapping("/downExcel") public void downExcel(HttpServletRequest request, HttpServletResponse response, String type, String ... //下载文件配置 // ResponseUtil.confi...
  • 阿里oss服务器官方文档只有单文件下载, 断点下载等,但实际应用中不乏需要实现多文件下载的时候,于是网上各种查资料,查出来很都是只有下载或者只有压缩的,于是自己整合代码,最终实现了多文件打包成ZIP压缩...
  • @RequestMapping("/toDowmNoteBygid") public void toDowmNoteBygid(List<Notes> urls , HttpServletRequest request,HttpServletResponse response, ... String gname="下载保存文件名" // 响应头...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 118,159
精华内容 47,263
关键字:

java批量下载多个文件

java 订阅