七牛雲文件上傳、處理工具類

概述

項目需要,後臺所有圖片需要上傳到七牛雲。

以下是自己寫的工具類

實現

	/**
	 * 七牛雲工具類
	 */
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<String, Object> getFileInfo(String key) {
			Auth auth = Auth.create(accessKey, secretKey);
			// 實例化一個BucketManager對象
			BucketManager bucketManager = new BucketManager(auth, cfg);
			// 要測試的空間和key,並且這個key在你空間中存在
	
			try {
				Map<String, Object> result = new HashMap<String, Object>();
				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<String, Object> uploadPathFile(String filePath, String key) {
	
			// 密鑰配置
			try {
				Auth auth = Auth.create(accessKey, secretKey);
	
				// <bucket>:<key>,表示只允許用戶上傳指定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<String, Object> result = new HashMap<String, Object>();
				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<String, Object> 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<String, Object> result = new HashMap<String, Object>();
				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<String, Object> 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<String, Object> result = new HashMap<String, Object>();
				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<String, Object> result =
	// QiNiuUtils.getInstance().uploadPathFile("C:\\Users\\Administrator\\Desktop\\3.png",key);
	// log.info(result+"");

	// Map<String, Object> 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<String, Object> result = QiNiuUtils.getInstance().uploadByteFile(fileBytes,key);*/
	 

	
	/*InputStream fileInputStream = null; 
	try { 
		fileInputStream = file.getInputStream(); 
	} catch (IOException e) { 
		e.printStackTrace();
	} 
	Map<String, Object> 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. 目錄刷新的方法需要以""結尾

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章