概述
項目需要,後臺所有圖片需要上傳到七牛雲。
以下是自己寫的工具類
實現
/**
* 七牛雲工具類
*/
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+"");*/
}
#注意事項
-
參數配置我使用的是xxl-conf,具體根據個人項目進行處理
accessKey = XxlConfClient.get("default.qiniuyun_accesskey", ""); secretKey = XxlConfClient.get("default.qiniuyun_secretkey", "");
-
上傳圖片使用的是覆蓋上傳
String upToken = auth.uploadToken(getBucket(), folderAndFile);
-
上傳後需要刷新,不然顯示的不是最新上傳的圖片
-
目錄刷新的方法需要以""結尾