项目需要,后台所有图片需要上传到七牛云。
以下是自己写的工具类
/**
* 七牛云工具类
*/
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+"");*/
}
#注意事项
参数配置我使用的是xxl-conf,具体根据个人项目进行处理
accessKey = XxlConfClient.get("default.qiniuyun_accesskey", "");
secretKey = XxlConfClient.get("default.qiniuyun_secretkey", "");
上传图片使用的是覆盖上传
String upToken = auth.uploadToken(getBucket(), folderAndFile);
上传后需要刷新,不然显示的不是最新上传的图片
目录刷新的方法需要以""结尾