依赖解决:
1.七牛云的Java SDK从7.2.24开始要求Java1.8及以上(因为依赖的okhttp3 升级到 3.14.2,不支持jdk7),官方提示:若一定 java 1.7 ,请手动指定 okhttp3 依赖 3.12,要求 3.12.3 及以上, com.squareup.okhttp3:okhttp:3.12.3
。如果是用jdk8可以直接跳到使用示例。
咱们先看一下SDK7.2.23的依赖:
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.11.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
<scope>compile</scope>
</dependency>
这里本人亲测,7.2.23版本所依赖的okhttp:3.11.0现在依然可用,如果我们想用更高版本的okhttp可以通过先排除低版本依赖再导入高版本依赖的方式解决:
<!-- https://mvnrepository.com/artifact/com.qiniu/qiniu-java-sdk -->
<dependency>
<groupId>com.qiniu</groupId>
<artifactId>qiniu-java-sdk</artifactId>
<version>7.2.23</version>
<exclusions><!-- 排除低版本的okhttp依赖 -->
<exclusion>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp -->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.12.10</version>
</dependency>
推荐用以上方式使用最新依赖,当然我们也可以简单粗暴直接修改maven本地的qiniu-java-sdk-7.2-23.pom文件指定okhttp的更高版本解决。
使用示例:
1.配置文件
# 七牛云配置
# bucket是创建的存储空间名
# path对应存储空间的访问域名
qiniu:
accessKey: xxxxxx
secretKey: xxxxxx
bucket: xxxxxxx
path: https://cdn.xxxxx.com
2.读取配置
@Component
@ConfigurationProperties(prefix = "qiniu")
public class QiniuConfig {
private String accessKey;
private String secretKey;
private String bucket;
private String path;
public String getAccessKey() {
return accessKey;
}
public void setAccessKey(String accessKey) {
this.accessKey = accessKey;
}
public String getSecretKey() {
return secretKey;
}
public void setSecretKey(String secretKey) {
this.secretKey = secretKey;
}
public String getBucket() {
return bucket;
}
public void setBucket(String bucket) {
this.bucket = bucket;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
}
3.通用结果返回类
/**
* @Description 通用返回结果集
*/
public class ResultMap extends HashMap<String, Object> {
public ResultMap() {
put("state", true);
put("code", 0);
put("msg", "success");
}
public static ResultMap error(int code, String msg) {
ResultMap r = new ResultMap();
r.put("state", false);
r.put("code", code);
r.put("msg", msg);
return r;
}
public static ResultMap error(String msg) {
return error(HttpStatus.METHOD_NOT_ALLOWED.value(), msg);
}
public static ResultMap error() {
return error(HttpStatus.METHOD_NOT_ALLOWED.value(), "未知异常,请联系管理员");
}
public static ResultMap ok(String msg) {
ResultMap r = new ResultMap();
r.put("msg", msg);
return r;
}
public static ResultMap ok(Map<String, Object> par) {
ResultMap r = new ResultMap();
r.putAll(par);
return r;
}
public static ResultMap ok() {
return new ResultMap();
}
public ResultMap put(String key, Object value) {
super.put(key, value);
return this;
}
}
4.编写接口类
public interface QiniuService {
public ResultMap upToken();
public ResultMap localUpload(String localFilePath, String key);
}
5.接口实现类
@Service
public class QiniuServiceImpl implements QiniuService {
@Autowired
private QiniuConfig qiniuConfig;
/**
* 简单上传的凭证
* 最简单的上传凭证只需要AccessKey,SecretKey和Bucket就可以
* @return
*/
@Override
public ResultMap upToken() {
Auth auth = Auth.create(qiniuConfig.getAccessKey(), qiniuConfig.getSecretKey());
String upToken = auth.uploadToken(qiniuConfig.getBucket());
Map<String, Object> map = new HashMap<>();
map.put("upToken",upToken);
return ResultMap.ok(map);
}
/**
* 服务器端上传本地文件
* 利用七牛服务端SDK从服务端直接上传文件到七牛云,服务端可以自己生成上传凭证,然后利用SDK中的上传逻辑进行上传,最后从七牛云获取上传的结果
* @param localFilePath 本地路径 如果是Windows情况下,格式是 D:\\qiniu\\test.png
* @param key 目标目录+文件名,默认不指定key的情况下,以文件内容的hash值作为文件名
* @return
*/
@Override
public ResultMap localUpload(String localFilePath, String key) {
if(StringUtils.isEmpty(localFilePath)){
return ResultMap.error("localFilePath不能为空");
}
//构造一个带指定 Region 对象的配置类
//Configuration cfg = new Configuration(Region.region2());//此行用于最新版本
Configuration cfg = new Configuration(Zone.zone2());//7.2.23版本用Zone配置地区
UploadManager uploadManager = new UploadManager(cfg);
//...生成上传凭证,然后准备上传
String accessKey = qiniuConfig.getAccessKey();
String secretKey = qiniuConfig.getSecretKey();
String bucket = qiniuConfig.getBucket();
Auth auth = Auth.create(accessKey, secretKey);
String upToken = auth.uploadToken(bucket);
try {
Response response = uploadManager.put(localFilePath, key, upToken);
//解析上传成功的结果
DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
return ResultMap.ok(putRet.key);
} catch (QiniuException ex) {
Response r = ex.response;
return ResultMap.error(r.toString());
}
}
}
6.控制器上传
@RestController
public class UploadController {
@Autowired
private QiniuService qiniuService;
/**
* 测试上传凭证
* @return
*/
@GetMapping("/getToken")
public ResultMap getToken(){
return qiniuService.upToken();
}
/**
* 测试上传本地文件
* @return
*/
@GetMapping("/localUpLoad")
public ResultMap localUpLoad() {
return qiniuService.localUpload("E:\\www\\test.png","test.png");
}
}
7.测试结果示例
- getToken上传凭证
{"state":true,"code":0,"msg":"success","upToken":"_SgskDI_xxxxxxxxxxxxxxxx"}
- localUpLoad本地上传
{"state":true,"code":0,"msg":"test.png"}
来源:oschina
链接:https://my.oschina.net/u/4087795/blog/3216737