欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

从零开始,在java中使用七牛云实现文件云存储(三)

程序员文章站 2022-06-17 11:53:43
...

在上一篇博客中,笔者简单介绍了qiniu SDK的资源管理以及各种上传凭证的生成,本章笔者将介绍qiniu SDK的资源批量管理功能。

 

上篇文章的链接:从零开始,在java中使用七牛云实现文件云存储(二)

 

进入正题!

  1. 批量获取文件状态:
    /**
    	 * 批量获取文件状态
    	 * @param zone
    	 * @param auth
    	 * @param keyList 文件名列表, 单次批量请求的文件数量不得超过1000
    	 * @param bucket
    	 * @return
    	 */
    	public static BatchStatus[] getFilesStat(Zone zone,Auth auth,String[] keyList,String bucket) {
    		// 构造一个带指定Zone对象的配置类
    		Configuration cfg = new Configuration(zone);
    		BucketManager bucketManager = new BucketManager(auth, cfg);
    		try {
    			BucketManager.BatchOperations batchOperations = new BucketManager.BatchOperations();
    			batchOperations.addStatOps(bucket, keyList);
    			Response response = bucketManager.batch(batchOperations);
    			BatchStatus[] batchStatusList = response.jsonToObject(BatchStatus[].class);
    			for (int i = 0; i < keyList.length; i++) {
    				BatchStatus status = batchStatusList[i];
    				String key = keyList[i];
    				System.out.print(key + "\t");
    				if (status.code == 200) {
    					// 文件存在
    					System.out.println(status.data.hash);
    					System.out.println(status.data.mimeType);
    					System.out.println(status.data.fsize);
    					System.out.println(status.data.putTime);
    				} else {
    					System.out.println(status.data.error);
    				}
    			}
    			return batchStatusList;
    		} catch (QiniuException ex) {
    			System.err.println(ex.response.toString());
    		}
    		return null;
    	}
     说明:参数keyList:想要获取状态的文件名数组。
  2. 批量修改文件类型:
    /**
    	 * 批量修改文件类型,单次批量请求的文件数量不得超过1000
    	 * @param zone
    	 * @param auth
    	 * @param keyMimeMap  文件名:目的类型 ,例keyMimeMap.put("qiniu.jpg", "image/jpg");
    	 * @param bucket
    	 * @return
    	 */
    	public static BatchStatus[] editFilesType(Zone zone,Auth auth,HashMap<String, String> keyMimeMap,String bucket) {
    		//构造一个带指定Zone对象的配置类
    		Configuration cfg = new Configuration(zone);
    		BucketManager bucketManager = new BucketManager(auth, cfg);
    		try {
    		    BucketManager.BatchOperations batchOperations = new BucketManager.BatchOperations();
    		    //添加指令
    		    for (Map.Entry<String, String> entry : keyMimeMap.entrySet()) {
    		        String key = entry.getKey();
    		        String newMimeType = entry.getValue();
    		        batchOperations.addChgmOp(bucket, key, newMimeType);
    		    }
    		    Response response = bucketManager.batch(batchOperations);
    		    BatchStatus[] batchStatusList = response.jsonToObject(BatchStatus[].class);
    		    int index = 0;
    		    for (Map.Entry<String, String> entry : keyMimeMap.entrySet()) {
    		        String key = entry.getKey();
    		        System.out.print(key + "\t");
    		        BatchStatus status = batchStatusList[index];
    		        if (status.code == 200) {
    		            System.out.println("change mime success");
    		        } else {
    		            System.out.println(status.data.error);
    		        }
    		        index += 1;
    		    }
    		    return batchStatusList;
    		} catch (QiniuException ex) {
    		    System.err.println(ex.response.toString());
    		}
    		return null;
    	}
    
     说明:参数keyMimeMap:map型参数,key为待处理文件名,value为想要修改成的文件格式。
  3. 批量删除:
    /**
    	 * 批量删除文件
    	 * @param zone
    	 * @param auth
    	 * @param keyList 文件名列表, 单次批量请求的文件数量不得超过1000
    	 * @param bucket
    	 * @return
    	 */
    	public static BatchStatus[] deleteFiles(Zone zone,Auth auth,String[] keyList,String bucket) {
    		//构造一个带指定Zone对象的配置类
    		Configuration cfg = new Configuration(zone);
    		BucketManager bucketManager = new BucketManager(auth, cfg);
    		try {
    		    //单次批量请求的文件数量不得超过1000
    		    BucketManager.BatchOperations batchOperations = new BucketManager.BatchOperations();
    		    batchOperations.addDeleteOp(bucket, keyList);
    		    Response response = bucketManager.batch(batchOperations);
    		    BatchStatus[] batchStatusList = response.jsonToObject(BatchStatus[].class);
    		    for (int i = 0; i < keyList.length; i++) {
    		        BatchStatus status = batchStatusList[i];
    		        String key = keyList[i];
    		        System.out.print(key + "\t");
    		        if (status.code == 200) {
    		            System.out.println("delete success");
    		        } else {
    		            System.out.println(status.data.error);
    		        }
    		    }
    		    return batchStatusList;
    		} catch (QiniuException ex) {
    		    System.err.println(ex.response.toString());
    		    return null;
    		}
    	}
     说明:参数keyList:想要获取状态的文件名数组。
  4. 批量移动:
    /**
    	 * 批量移动文件,可用作重命名
    	 * @param zone
    	 * @param auth
    	 * @param opts 操作集合
    	 * @return
    	 */
    	public static BatchStatus[] moveOrRenameFiles(Zone zone,Auth auth,List<OptInfo> opts) {
    		//构造一个带指定Zone对象的配置类
    		Configuration cfg = new Configuration(zone);
    		BucketManager bucketManager = new BucketManager(auth, cfg);
    		try {
    		    //单次批量请求的文件数量不得超过1000
    		    BucketManager.BatchOperations batchOperations = new BucketManager.BatchOperations();
    		    for (OptInfo opt : opts) {
    		        batchOperations.addMoveOp(opt.getFromBucket(), opt.getFromKey(), opt.getToBucket(), opt.getToKey());
    		    }
    		    Response response = bucketManager.batch(batchOperations);
    		    BatchStatus[] batchStatusList = response.jsonToObject(BatchStatus[].class);
    		    for (int i = 0; i < opts.size(); i++) {
    		        BatchStatus status = batchStatusList[i];
    		        String key = opts.get(i).getFromKey();
    		        System.out.print(key + "\t");
    		        if (status.code == 200) {
    		            System.out.println("move success");
    		        } else {
    		            System.out.println(status.data.error);
    		        }
    		    }
    		    return batchStatusList;
    		} catch (QiniuException ex) {
    		    System.err.println(ex.response.toString());
    		}
    		return null;
    	}
     说明:参数opts:封装了源和目的文件名和空间名,代码如下:
    public class OptInfo {
    	private String fromBucket;
    	private String fromKey;
    	private String toBucket;
    	private String toKey;
    	
    	public OptInfo(String fromBucket, String fromKey, String toBucket, String toKey) {
    		super();
    		this.fromBucket = fromBucket;
    		this.fromKey = fromKey;
    		this.toBucket = toBucket;
    		this.toKey = toKey;
    	}
    	//
    	//节省篇幅getters and setters不粘了
    }
     
  5. 批量复制:
    /**
    	 * 批量复制
    	 * @param zone
    	 * @param auth
    	 * @param opts 操作集合
    	 * @return
    	 */
    	public static BatchStatus[] copyFiles(Zone zone,Auth auth,List<OptInfo> opts) {
    		//构造一个带指定Zone对象的配置类
    		Configuration cfg = new Configuration(zone);
    		BucketManager bucketManager = new BucketManager(auth, cfg);
    		try {
    		    BucketManager.BatchOperations batchOperations = new BucketManager.BatchOperations();
    		    for (OptInfo opt : opts) {
    		        batchOperations.addCopyOp(opt.getFromBucket(), opt.getFromKey(), opt.getToBucket(), opt.getToKey());
    		    }
    		    Response response = bucketManager.batch(batchOperations);
    		    BatchStatus[] batchStatusList = response.jsonToObject(BatchStatus[].class);
    		    for (int i = 0; i < opts.size(); i++) {
    		        BatchStatus status = batchStatusList[i];
    		        String key = opts.get(i).getFromKey();
    		        System.out.print(key + "\t");
    		        if (status.code == 200) {
    		            System.out.println("copy success");
    		        } else {
    		            System.out.println(status.data.error);
    		        }
    		    }
    		    return batchStatusList;
    		} catch (QiniuException ex) {
    		    System.err.println(ex.response.toString());
    		}
    		return null;
    	}
     说明:参数opts同上。
  6. 批量混合操作:
    	/**
    	 * 混合批量操作,单次批量请求的文件数量不得超过1000
    	 * @param zone
    	 * @param auth
    	 * @param batchOperations 批量指令集
    	 * 		例batchOperations.addStatOps(bucket, "qiniu.png", "qiniu.jpg");
    	 *		  batchOperations.addCopyOp(bucket, "qiniu.png", bucket, "qiniu_copy1.png");
    	 *		  batchOperations.addMoveOp(bucket, "qiniu2.png", bucket, "qiniu3.png");
    	 *		  batchOperations.addDeleteOp(bucket, "qiniu4.png");
    	 * @return
    	 */
    	public static BatchStatus[] fixOpts(Zone zone,Auth auth,BucketManager.BatchOperations batchOperations) {
    		//构造一个带指定Zone对象的配置类
    		Configuration cfg = new Configuration(zone);
    		BucketManager bucketManager = new BucketManager(auth, cfg);
    		try {
    		    Response response = bucketManager.batch(batchOperations);
    		    BatchStatus[] batchStatusList = response.jsonToObject(BatchStatus[].class);
    		    for (BatchStatus status : batchStatusList) {
    		        if (status.code == 200) {
    		            System.out.println("operation success");
    		        } else {
    		            System.out.println(status.data.error);
    		        }
    		    }
    		    return batchStatusList;
    		} catch (QiniuException ex) {
    		    System.err.println(ex.response.toString());
    		}
    		return null;
    	}
     说明:参数batchOperations:批量指令集,可以删除、移动等指令,具体用法请看代码注释。 

对上几个方法统一实验一下:

	public static void main(String[] args) {
		Zone zone=Zone.zone0();
		Auth auth=CredentialsManager.getAuth();
		String bucket="你的空间名";
		
//		//测试getFilesStat
//		getFilesStat(zone, auth, new String[]{"2.jpg","3.jpg","4.jpg","noFile.jpg"},bucket);
//		
//		//测试editFilesType
//		HashMap<String,String> keyMimeMap =new HashMap<>();
//		keyMimeMap. put("2.jpg", "text/plain");
//		keyMimeMap. put("4.jpg", "text/plain");
//		editFilesType(zone, auth, keyMimeMap, bucket);
//		
//		//测试deleteFiles
//		deleteFiles(zone, auth, new String[]{"5.jpg","3.jpg","noFile.jpg"}, bucket);
//		
//		//测试moveOrRenameFiles
//		List<OptInfo> opts=new ArrayList<>();
//		opts.add(new OptInfo(bucket, "as.txt", "bucket2", "as.txt"));
//		opts.add(new OptInfo(bucket, "sa.txt", "bucket2", "as.txt"));
//		moveOrRenameFiles(zone, auth, opts);
//		
//		//测试copyFiles
//		List<OptInfo> opts2=new ArrayList<>();
//		opts2.add(new OptInfo(bucket, "fff.txt", "bucket2", "fff.txt"));
//		opts2.add(new OptInfo(bucket, "ggg.txt", "bucket2", "ggg.txt"));
//		copyFiles(zone, auth, opts2);
//		
//		//测试fixOpts
//		BatchOperations batchOperations=new BatchOperations();
//		batchOperations.addDeleteOp(bucket, new String[]{"15.jpg","13.jpg","noFile.jpg"});
//		batchOperations.addCopyOp(bucket, "mmm.txt", "bucket2", "mmm.txt");
//		fixOpts(zone, auth, batchOperations);
}

 相关操作在前两篇博客已经说过了,在此不再多说。

 

 

好了,关于七牛云存储的介绍就写到这了!

七牛还提供了好多有意思的API,比如说音视频转码、图片鉴黄鉴暴、政治人物识别、水印、图片压缩等好多功能,如果你有需要或者感兴趣的话,请查看官方文档:https://developer.qiniu.com/dora