package com.okancha.utils.uploadimage;
import com.okancha.utils.UUIDUtil;
import com.qiniu.common.Zone;
import com.qiniu.http.Response;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.persistent.FileRecorder;
import com.qiniu.util.Auth;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.file.Paths;
public class QiNiuYunUploadUtil {
// 设置需要操作的账号的AK,https://developer.qiniu.com/kodo/sdk/1239/java#upload-token
private static final String ACCESS_KEY = "XXXXXXXXXX";
// 设置需要操作的账号的SK,https://developer.qiniu.com/kodo/sdk/1239/java#upload-token
private static final String SECRET_KEY = "XXXXXXXXXXXXX";
// 要上传的空间,https://developer.qiniu.com/kodo/sdk/1239/java#upload-token
private static final String BUCKET = "XXXXXXXXXX";
// 域名domainOfBucket
private static final String DOMAIN_OF_BUCKET = "XXXXXXXXXX";
// 华东是Zone.zone0(),华北是Zone.zone1(),华南是Zone.zone2(),北美是Zone.zoneNa0(), https://developer.qiniu.com/kodo/manual/1671/region-endpoint
private static final Zone ZONE = Zone.zone2(); // todo
public static Auth getAuth() {
return Auth.create(ACCESS_KEY, SECRET_KEY);
}
/**
* 获取上传凭证,https://developer.qiniu.com/kodo/sdk/1239/java#upload-flow
*/
public static String getUploadCredential() {
return getAuth().uploadToken(BUCKET);
}
/**
* 构造一个带指定 Region 对象的配置类
*/
public static UploadManager buildUploadManager() {
return new UploadManager(new Configuration(ZONE));
}
/**
* 文件上传
*
* @param localFilePath 需要上传的文件本地路径
* @param fileNameKey 需要自定义保存在七牛云的文件名字,即上传文件后保存在七牛云服务器中的文件名(默认不指定的情况下,以文件内容的hash值作为文件名)
*/
public static String fileUpload(String localFilePath, String fileNameKey) {
try {
Response response = buildUploadManager().put(localFilePath, fileNameKey, getUploadCredential());
MyPutRet myPutRet = response.jsonToObject(MyPutRet.class);
// DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class); // 解析上传成功的结果
return buildPublicFileUrl(myPutRet.getKey()); // 返回的图片url
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
/**
* 根据文件名和域名返回图片的url,然后访问url直接就可以看到图片了
*
* @param fileNameKey 需要自定义保存在七牛云的文件名字,即上传文件后保存在七牛云服务器中的文件名(默认不指定的情况下,以文件内容的hash值作为文件名)
*/
public static String buildPublicFileUrl(String fileNameKey) {
try {
String encodedFileName = URLEncoder.encode(fileNameKey, "utf-8");
return String.format("%s/%s", DOMAIN_OF_BUCKET, encodedFileName);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
/**
* 私有空间返回文件URL
*
* @param fileNameKey 需要自定义保存在七牛云的文件名字,即上传文件后保存在七牛云服务器中的文件名(默认不指定的情况下,以文件内容的hash值作为文件名)
* @param expireInSeconds 过期时间,私有空间文件的访问链接超时时间,单位(秒)
*/
public static String buildPrivateFileUrl(String fileNameKey, long expireInSeconds) {
try {
return getAuth().privateDownloadUrl(buildPublicFileUrl(fileNameKey), expireInSeconds);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 字节数组上传文件,然后返回文件的url,然后可以直接在公网上访问url看到文件了
*
* @param fileNameKey 需要自定义保存在七牛云的文件名字,即上传文件后保存在七牛云服务器中的文件名(默认不指定的情况下,以文件内容的hash值作为文件名)
*/
public static String charArrayUpload(String fileNameKey, byte[] uploadBytes) {
try {
Response response = buildUploadManager().put(uploadBytes, fileNameKey, getUploadCredential());
// DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class); // 解析上传成功的结果
MyPutRet myPutRet = response.jsonToObject(MyPutRet.class);
return buildPublicFileUrl(myPutRet.getKey()); // 返回的文件url
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
/**
* 断点续传
*
* @param fileNameKey 需要自定义保存在七牛云的文件名字,即上传文件后保存在七牛云服务器中的文件名(默认不指定的情况下,以文件内容的hash值作为文件名)
* @param localFilePath 文件路径, 如果是Windows情况下,格式是 D:\\qiniu\\test.png
*/
public static String breakPointUpload(String localFilePath, String fileNameKey) {
try {
// 如果是Windows情况下,格式是 D:\\qiniu\\test.png
String localTempDir = Paths.get(System.getenv("java.io.tmpdir"), BUCKET).toString();
// 设置断点续传文件进度保存目录
FileRecorder fileRecorder = new FileRecorder(localTempDir);
// 构造一个带指定Zone对象的配置类
Configuration cfg = new Configuration(ZONE);
UploadManager uploadManager = new UploadManager(cfg, fileRecorder);
Response response = uploadManager.put(localFilePath, fileNameKey, getUploadCredential());
// 解析上传成功的结果
// DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
MyPutRet myPutRet = response.jsonToObject(MyPutRet.class);
return buildPublicFileUrl(myPutRet.getKey()); // 返回的文件url
} catch (Exception ex2) {
ex2.printStackTrace();
}
return null;
}
// 测试
public static void main(String[] args) {
// // 上传图片
// DefaultPutRet defaultPutRet = fileUpload(Zone.zone2(), getUploadCredential(), "D:\\wulin.jpg", "微软微软微软认为");
// String fileNameKey = defaultPutRet.key; // key是文件名
//
// String s = buildPublicFileUrl(fileNameKey, "pygx2kf5f.bkt.clouddn.com"); // 返回的图片网址
// System.out.println("ssss****" + s);
String url = fileUpload("D:\\1.jpg", "zhouxiang");
System.out.println(url);
}
}
package com.okancha.utils.uploadimage;
/**
* 官方说:有些情况下,七牛返回给上传端的内容不是默认的hash和key形式,
* 这种情况下,可能出现在自定义returnBody或者自定义了callbackBody的情况下,
* 前者一般是服务端直传的场景,而后者则是接受上传回调的场景,这两种场景之下,
* 都涉及到需要将自定义的回复内容解析为Java的类对象,一般建议在交互过程中,
* 都采用JSON的方式,这样处理起来方法比较一致,而且JSON的方法最通用。
* 详情:https://developer.qiniu.com/kodo/sdk/1239/java#server-upload
* ctrl+f 输入关键字搜索:解析自定义回复内容
*/
public class MyPutRet {
public String key;
public String hash;
public String bucket;
public long fsize;
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getHash() {
return hash;
}
public void setHash(String hash) {
this.hash = hash;
}
public String getBucket() {
return bucket;
}
public void setBucket(String bucket) {
this.bucket = bucket;
}
public long getFsize() {
return fsize;
}
public void setFsize(long fsize) {
this.fsize = fsize;
}
}