七牛云文件上传、处理工具类

概述

项目需要,后台所有图片需要上传到七牛云。

以下是自己写的工具类

实现

	/**
	 * 七牛云工具类
	 */
public class QiNiuUtils {
	
		private Logger log = LoggerFactory.getLogger(QiNiuUtils.class);
	
		private static UploadManager uploadManager;
		private static com.qiniu.storage.Configuration cfg;
	
		private static String accessKey = "";
		private static String secretKey = "";
	
		public QiNiuUtils() {
	
			try {
				accessKey = XxlConfClient.get("default.qiniuyun_accesskey", "");
				secretKey = XxlConfClient.get("default.qiniuyun_secretkey", "");
				log.info("七牛云 accessKey:" + accessKey + " ,secretKey:" + secretKey);
				cfg = new com.qiniu.storage.Configuration(Zone.autoZone());
				uploadManager = new UploadManager(cfg);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

		/**
		 * 刷新目录
		 * 
		 * @param folders
		 *            待刷新的目录列表,目录必须以 / 结尾
		 * @return
		 */
		public boolean refreshFolders(String[] folders) {
	
			if (null == folders) {
				return false;
			}
			StringBuilder sBuilder = new StringBuilder();
			sBuilder.append(getCdnDomainOfBucket());
			sBuilder.append(getFolder());
	
			for (int i = 0; i < folders.length; i++) {
				folders[i] = sBuilder.toString() + folders[i];
			}
	
			try {
				// 单次方法调用刷新的目录不可以超过10个,另外刷新目录权限需要联系技术支持开通
				CdnResult.RefreshResult result = getCdnManager().refreshDirs(folders);
	
				if (null == result || 200 != result.code) {
					return false;
				}
				return true;
			} catch (Exception e) {
				log.error("refreshFolders Exception:" + e.getMessage());
				return false;
			}
		}
	
		/**
		 * 刷新文件cdn
		 * 
		 * @param fileUrls
		 *            待刷新的链接列表
		 * @return
		 */
		public boolean refreshFiles(String[] fileUrls) {
			if (null == fileUrls) {
				return false;
			}
			StringBuilder sBuilder = new StringBuilder();
			sBuilder.append(getCdnDomainOfBucket());
			sBuilder.append(getFolder());
	
			for (int i = 0; i < fileUrls.length; i++) {
				fileUrls[i] = sBuilder.toString() + fileUrls[i];
			}
	
			try {
				// 单次方法调用刷新的链接不可以超过100个
				CdnResult.RefreshResult result = getCdnManager().refreshUrls(fileUrls);
				if (null == result || 200 != result.code) {
					return false;
				}
				return true;
			} catch (Exception e) {
				log.error("refreshFiles Exception:" + e.getMessage());
				return false;
			}
		}
	
		/**
		 * 删除单个文件
		 * 
		 * @param bucket
		 * @param key
		 * @return
		 */
		public boolean deleteFile(String key) {
			try {
				String folderAndFile = getFolder() + key;
				// 调用delete方法移动文件
				Response response = getBucketManager().delete(getBucket(), folderAndFile);
				if (null == response || 200 != response.statusCode) {
					return false;
				}
				return true;
			} catch (Exception e) {
				log.error("deleteFile Exception:" + e.getMessage());
				return false;
			}
		}
	
	
		/**
		 * 获取domains
		 * 
		 * @param bucket
		 * @return
		 */
		public String[] getDomains() {
			try {
				String[] domainLists = getBucketManager().domainList(getBucket());
	
				if (null == domainLists || 0 == domainLists.length) {
					return null;
				}
				return domainLists;
			} catch (Exception e) {
				log.error("getDomains Exception:" + e.getMessage());
				return null;
			}
		}
	
		/**
		 * 获取下载地址
		 * 
		 * @param domainOfBucket
		 * @param key
		 * @return
		 */
		public String getDownloadUrl(String key) {
	
			String folderAndFile = getFolder() + key;
	
			// 构造私有空间的需要生成的下载的链接
			String URL = getDomainOfBucket() + folderAndFile;
			Auth auth = Auth.create(accessKey, secretKey);
			// 调用privateDownloadUrl方法生成下载链接,第二个参数可以设置Token的过期时间
			String downloadRUL = auth.privateDownloadUrl(URL, 3600);
			return downloadRUL;
		}
	
		/**
		 * 构造下载地址
		 * 
		 * @param domainOfBucket
		 * @param key
		 * @return
		 */
		public String generateDownloadUrl(String key) {
	
			String folderAndFile = getFolder() + key;
			String encodeKey = "";
			try {
				encodeKey = URLEncoder.encode(folderAndFile, "utf-8");
			} catch (UnsupportedEncodingException e) {
				log.error("exception:" + e.getMessage());
	
			}
			String downloadRUL = String.format("%s/%s", getDomainOfBucket(), encodeKey);
			return downloadRUL;
		}
	
		/**
		 * 获取文件信息
		 * 
		 * @param bucket
		 * @param key
		 * @return
		 */
		public Map getFileInfo(String key) {
			Auth auth = Auth.create(accessKey, secretKey);
			// 实例化一个BucketManager对象
			BucketManager bucketManager = new BucketManager(auth, cfg);
			// 要测试的空间和key,并且这个key在你空间中存在
	
			try {
				Map result = new HashMap();
				String folderAndFile = getFolder() + key;
				// 调用stat()方法获取文件的信息
				FileInfo info = bucketManager.stat(getBucket(), folderAndFile);
	
				if (null == info) {
					return null;
				}
	
				result.put("hash", info.hash);
				result.put("key", info.key);
				return result;
			} catch (Exception e) {
				log.error("getFileInfo Exception:" + e.getMessage());
				return null;
			}
		}
	
		/**
		 * 如果是Windows情况下,格式是 D:\\qiniu\\test.png String localFilePath =
		 * "/home/qiniu/test.png";
		 * 
		 * @param filePath
		 * @return
		 */
		public Map uploadPathFile(String filePath, String key) {
	
			// 密钥配置
			try {
				Auth auth = Auth.create(accessKey, secretKey);
	
				// :,表示只允许用户上传指定key的文件。在这种格式下文件默认允许“修改”,已存在同名资源则会被本次覆盖。
				// 如果希望只能上传指定key的文件,并且不允许修改,那么可以将下面的 insertOnly 属性值设为 1。
				// 第三个参数是token的过期时间
				// String upToken = auth.uploadToken(bucketname, key, 3600, new
				// StringMap().put("insertOnly", 1));
				String folderAndFile = getFolder() + key;
				String upToken = auth.uploadToken(getBucket(), folderAndFile);
	
				// 调用put方法上传
				Response response = uploadManager.put(filePath, folderAndFile, upToken);
	
				if (null == response) {
					return null;
				}
				// 解析上传成功的结果
				// DefaultPutRet putRet = new Gson().fromJson(response.bodyString(),
				// DefaultPutRet.class);
				DefaultPutRet putRet = Json.toObject(response.bodyString(), DefaultPutRet.class);
	
				Map result = new HashMap();
				result.put("hash", putRet.hash);
				result.put("key", putRet.key);
	
				return result;
			} catch (Exception e) {
				log.error("uploadPathFile Exception:" + e.getMessage());
				return null;
			}
		}
	
		/**
		 * 可以支持将内存中的字节数组上传到空间中
		 * 
		 * @param uploadBytes
		 * @param bucket
		 * @param key
		 * @return
		 */
		public Map uploadByteFile(byte[] uploadBytes, String key) {
			try {
				Auth auth = Auth.create(accessKey, secretKey);
				String folderAndFile = getFolder() + key;
				String upToken = auth.uploadToken(getBucket(), folderAndFile);
				Response response = uploadManager.put(uploadBytes, folderAndFile, upToken);
	
				if (null == response) {
					return null;
				}
	
				// 解析上传成功的结果
				// DefaultPutRet putRet = new Gson().fromJson(response.bodyString(),
				// DefaultPutRet.class);
				DefaultPutRet putRet = Json.toObject(response.bodyString(), DefaultPutRet.class);
	
				Map result = new HashMap();
				result.put("hash", putRet.hash);
				result.put("key", putRet.key);
	
				return result;
			} catch (Exception e) {
				log.error("uploadByteFile Exception:" + e.getMessage());
				return null;
			}
		}
	
		/**
		 * 可以支持将内存中的字节数组上传到空间中。
		 * 
		 * @param fileInputStream
		 * @return
		 */
		public Map uploadInputStramFile(InputStream fileInputStream, String key) {
			try {
				Auth auth = Auth.create(accessKey, secretKey);
				String folderAndFile = getFolder() + key;
				String upToken = auth.uploadToken(getBucket(), folderAndFile);
				Response response = uploadManager.put(fileInputStream, folderAndFile, upToken, null, null);
	
				if (null == response) {
					return null;
				}
	
				// 解析上传成功的结果
				// DefaultPutRet putRet = new Gson().fromJson(response.bodyString(),
				// DefaultPutRet.class);
				DefaultPutRet putRet = Json.toObject(response.bodyString(), DefaultPutRet.class);
				Map result = new HashMap();
				result.put("hash", putRet.hash);
				result.put("key", putRet.key);
	
				return result;
			} catch (Exception e) {
				log.error("uploadInputStramFile Exception:" + e.getMessage());
				return null;
			}
		}
	
		private String getFolder() {
			String folder = XxlConfClient.get("default.qiniuyun_folder", "");
			return folder;
		}
	
		private String getBucket() {
			String bucket = XxlConfClient.get("default.qiniuyun_bucket", "");
			return bucket;
		}
	
		private String getDomainOfBucket() {
			String domainOfBucket = XxlConfClient.get("default.qiniuyun_domainOfBucket", "");
			return domainOfBucket;
		}
	
		private String getCdnDomainOfBucket() {
			String domainOfBucket = getDomainOfBucket();
			domainOfBucket = domainOfBucket + "/";
			return domainOfBucket;
		}
	
		private BucketManager getBucketManager() {
			Auth auth = Auth.create(accessKey, secretKey);
			BucketManager bucketManager = new BucketManager(auth, cfg);
			return bucketManager;
		}
	
		private CdnManager getCdnManager() {
			Auth auth = Auth.create(accessKey, secretKey);
			CdnManager cdnManager = new CdnManager(auth);
			return cdnManager;
		}
	
		/**
		 * 封装单例的静态内部类
		 */
		private static class Singleton {
			private static QiNiuUtils instance;
	
			static {
				instance = new QiNiuUtils();
			}
	
			public static QiNiuUtils getInstance() {
				return instance;
			}
	
		}
	
		public static QiNiuUtils getInstance() {
			return Singleton.getInstance();
		}

	}

使用

public static void main(String[] args) {
	
	// String key = "v1/3.png";
	// String result = QiNiuUtils.getInstance().generateDownloadUrl(key);
	
	//String result = QiNiuUtils.getInstance().getDownloadUrl(key);
	 
	
	/*QiNiuUtils instance = QiNiuUtils.getInstance(); 
	String[] fileUrls = new String[]{ "v1/3.png" }; 
	boolean result =instance.refreshFiles(fileUrls); 
	log.info(result+"");*/
	
	/*boolean result = QiNiuUtils.getInstance().deleteFile(key);
	log.info(result+"");*/
	 
	// Map result =
	// QiNiuUtils.getInstance().uploadPathFile("C:\\Users\\Administrator\\Desktop\\3.png",key);
	// log.info(result+"");

	// Map result =
	// QiNiuUtils.getInstance().getFileInfo(key);
	
	/*String[] result = QiNiuUtils.getInstance().getDomains();
	
	for (String string : result) {
	
	}*/
	 


	/*byte[] fileBytes = null; 
	try { 
		fileBytes = file.getBytes(); 
	} catch(IOException e) { 
		e.printStackTrace(); 
	} 
	Map result = QiNiuUtils.getInstance().uploadByteFile(fileBytes,key);*/
	 

	
	/*InputStream fileInputStream = null; 
	try { 
		fileInputStream = file.getInputStream(); 
	} catch (IOException e) { 
		e.printStackTrace();
	} 
	Map result =QiNiuUtils.getInstance().uploadInputStramFile(fileInputStream,key);
	log.info(result+"");*/
	 

	
	/*QiNiuUtils instance = QiNiuUtils.getInstance(); String[] fileUrls =
	new String[]{ 
			"v1/"}; 
	boolean refreshFolders = instance.refreshFolders(fileUrls);
	log.info(refreshFolders+"");*/

}

#注意事项

  1. 参数配置我使用的是xxl-conf,具体根据个人项目进行处理

     accessKey = XxlConfClient.get("default.qiniuyun_accesskey", "");
     secretKey = XxlConfClient.get("default.qiniuyun_secretkey", "");
    
  2. 上传图片使用的是覆盖上传

     String upToken = auth.uploadToken(getBucket(), folderAndFile);
    
  3. 上传后需要刷新,不然显示的不是最新上传的图片

  4. 目录刷新的方法需要以""结尾

你可能感兴趣的:(Java)