• 页面下载远程服务器单个及多个文件并打成压缩包下载到本地


    如下是文件下载单个远程文件的实例

    public
    static void main(String[] args) throws IOException { URL httpurl=new URL("http://yingufile-private.oss-cn-beijing.aliyuncs.com/PHYY/jpg/20170628/a85ab00c645e4b89dc38f3b8bb63a4f3"); HttpURLConnection httpConn=(HttpURLConnection)httpurl.openConnection(); httpConn.setDoOutput(true);// 使用 URL 连接进行输出 httpConn.setDoInput(true);// 使用 URL 连接进行输入 httpConn.setUseCaches(false);// 忽略缓存 httpConn.setRequestMethod("GET");// 设置URL请求方法 //可设置请求头 httpConn.setRequestProperty("Content-Type", "application/octet-stream"); httpConn.setRequestProperty("Connection", "Keep-Alive");// 维持长连接 httpConn.setRequestProperty("Charset", "UTF-8"); //可设置请求头 byte[] file =input2byte(httpConn.getInputStream()); writeBytesToFile(file,"D://333.png"); System.out.println(file); } public static final byte[] input2byte(InputStream inStream) throws IOException { ByteArrayOutputStream swapStream = new ByteArrayOutputStream(); byte[] buff = new byte[100]; int rc = 0; while ((rc = inStream.read(buff, 0, 100)) > 0) { swapStream.write(buff, 0, rc); } byte[] in2b = swapStream.toByteArray(); return in2b; } public static File writeBytesToFile(byte[] b, String outputFile) { File file = null; FileOutputStream os = null; try { file = new File(outputFile); os = new FileOutputStream(file); os.write(b); } catch (Exception var13) { var13.printStackTrace(); } finally { try { if(os != null) { os.close(); } } catch (IOException var12) { var12.printStackTrace(); } } return file; }

    递归压缩方法参考:https://www.cnblogs.com/zeng1994/p/7862288.html

    整合之后代码如下:

              String[] fids = fid.split(",");
                     System.out.println("压缩中...");
                     File zipFile = new File("C://Users//Administrator//Desktop//zipFile.zip");
                     //创建zip输出流
                     ZipOutputStream out = new ZipOutputStream( new FileOutputStream(zipFile));
                     
                     //创建缓冲输出流
                     BufferedOutputStream bos = new BufferedOutputStream(out);
                     Map<String,String> mp = new HashMap<String, String>();
                     for (String i : fids) {
                         Networkfile nf = networkfileService.selectById(Integer.parseInt(i));
                        //0移动端,1电脑
                        if("0".equals(ntype)){
                            mp.put("download_id", nf.getSf_fid());
                            mp.put("download_name", nf.getName());
                            JSONObject jsonObject = JSONObject.fromObject(mp);
                            String dates = jsonObject.toString();
                            response.getWriter().print(dates);
                        }else{
                            //调用打包函数
                            compress(out,bos,nf,nf.getName());
                        }
                     }
                        
                     mp.put("download_id", "");
                     JSONObject jsonObject = JSONObject.fromObject(mp);
                     String dates = jsonObject.toString();
                    
                     response.getWriter().print(dates);
                     
                     bos.close();
                     out.close();
                     System.out.println("压缩完成");

    打包函数:

    /*文件打包zip*/
        public void compress(ZipOutputStream out,BufferedOutputStream bos,Networkfile nf,String base) throws Exception
        {
            //如果路径为目录(文件夹)
            if(nf.getType()==1)//文件夹sourceFile.isDirectory()
            {
                //取出文件夹中的文件(或子文件夹)
                //File[] flist = sourceFile.listFiles();
                String parameters = "uid:"+nf.getUid()+",file_pid:"+nf.getId();
                List<Networkstructure> listf = networkstructureService.selectAllFile(parameters);
                
                if(listf.size()==0)//如果文件夹为空,则只需在目的地zip文件中写入一个目录进入点
                {
                    System.out.println(base+"/");
                    out.putNextEntry(  new ZipEntry(base+"/") );
                }
                else//如果文件夹不为空,则递归调用compress,文件夹中的每一个文件(或文件夹)进行压缩
                {
                    for(int i=0;i<listf.size();i++)
                    {
                        Networkfile newnf = networkfileService.selectById(listf.get(i).getFid());
                        compress(out,bos,newnf,base+"/"+listf.get(i).getFile_name());
                    }
                }
            }
            else//如果不是目录(文件夹),即为文件,则先写入目录进入点,之后将文件写入zip文件中
            {
                URL httpurl=new URL("http://***.***.***.**:****/"+nf.getSf_fid());
                HttpURLConnection httpConn=(HttpURLConnection)httpurl.openConnection();
                httpConn.setDoOutput(true);// 使用 URL 连接进行输出
                httpConn.setDoInput(true);// 使用 URL 连接进行输入
                httpConn.setUseCaches(false);// 忽略缓存
                httpConn.setRequestMethod("GET");// 设置URL请求方法
                //可设置请求头
                httpConn.setRequestProperty("Content-Type", "application/octet-stream");
                httpConn.setRequestProperty("Connection", "Keep-Alive");// 维持长连接
                httpConn.setRequestProperty("Charset", "UTF-8");
                //可设置请求头
                byte[] file =input2byte(httpConn.getInputStream());
                
                out.putNextEntry( new ZipEntry(base) );
                //将源文件写入到zip文件中
                out.write(file);//压缩输出
                out.closeEntry();
            }
        }
  • 相关阅读:
    System.InvalidOperationException异常的处理!vs15版
    五子棋项目的实现(四)具体的总结
    五子棋项目的实现(三)人机对战类的具体设计
    五子棋项目的实现(二)博弈树算法的描述
    五子棋项目的实现(一)
    java Exception和Error的区别
    java内存分配实例
    expdp与impdp
    SQL*PLUS下使用AUTOTRACE、sql顾问、实时sql监控
    Linux下如何将数据库脚本文件从sh格式变为sql格式
  • 原文地址:https://www.cnblogs.com/mangwusuozhi/p/10942539.html
Copyright © 2020-2023  润新知