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

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

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

 

转载于:https://www.cnblogs.com/mangwusuozhi/p/10942539.html

Java调用Zip类批量压缩多个文件,此前有一个是压缩单个文件,也可参考,相关代码中可找到此源码。   public class ZipDemo extends JFrame{   JFileChooser fileChooser; //文件选择器   JList fileList; //待压缩的文件列表   Vector files; //文件数据(待压缩文件)   JButton jbAdd; //增加文件按钮   JButton jbDelete; //删除文件按钮   JButton jbZip; //压缩按钮   JTextField target; //目标文件文本域   public ZipDemo(){   super("用ZIP压缩多个文件"); //调用父类构造函数   fileChooser=new JFileChooser(); //实例化文件选择器   files=new Vector(); //实例化文件数据Vector   fileList=new JList(files); //实例化已选择文件列表   jbAdd=new JButton("增加"); //实例化按钮组件   jbDelete=new JButton("删除");   jbZip=new JButton("压缩");   target=new JTextField(18);   JPanel panel=new JPanel(); //实例化面板,用于容纳按钮   panel.add(jbAdd); //增加组件到面板上   panel.add(jbDelete);   panel.add(jbZip);   JPanel panel2=new JPanel();   panel2.add(new JLabel("目标文件"));   panel2.add(target);   JScrollPane jsp=new JScrollPane(fileList);   Container container=getContentPane(); //得到容器   container.add(panel2,BorderLayout.NORTH); //增加组件到容器   container.add(jsp,BorderLayout.CENTER);   container.add(panel,BorderLayout.SOUTH);   jsp.setBorder(BorderFactory.createEmptyBorder(10,10,10,10)); //设置边界
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值