客户端直接上传文件至七牛云
上传策略
参考官网文档七牛云上传策略
注意:
- Key必须采用 utf-8 编码,使用非 utf-8 编码的资源名访问时会报错。callbackUrl 与 callbackBody 配合使用。returnUrl 与 returnBody 配合使用。callbackXXX 与 returnXXX 不可混用,详情自定义响应。
- 文件上传后的命名将遵循以下规则:
(1)源 Bucket 和目标 Bucket 必须在同一区域,即处理结果不能跨区域另存。
(2)forceSaveKey=false,以客户端指定的 Key 为高优先级命名。
客户端已指定 Key,以 Key 命名;
客户端未指定 Key,上传策略中设置了 saveKey,以 saveKey 的格式命名。
客户端未指定 Key,上传策略中未设置 saveKey,以文件 hash(etag) 命名。
(3)forceSaveKey=true,以上传策略中的 saveKey 为高优先级命名;此时上传策略中的 saveKey 不允许为空。
客户端已指定 Key,以上传策略中 saveKey 的格式命名;
客户端未指定 Key,以上传策略中 saveKey 的格式命名; - 文件分片上传的创建文件步骤中。若未指定Key,为达到不覆盖同名资源效果,必须使用insertOnly字段。
代码示例
导入jar包
<!--七牛云上传图片服务-->
<dependency>
<groupId> com.qiniu</groupId>
<artifactId>qiniu-java-sdk</artifactId>
<version> 7.3.0 </version>
</dependency>
设置上传凭证
public String uploadToken() {
Auth auth = Auth.create({{AccessKey}}, {{SecretKey}});
String fileName = {{文件名}};
StringMap policyMap = new StringMap();
String callbackUrl ={{callbackUrl}}//上传成功的回调url
//设置上传参数
policyMap.put("scope", "static"); //设置 目标资源空间 Bucket 和资源键 Key
policyMap.put("deadline", System.currentTimeMillis() + 3600); //上传凭证有效截止时间
/*//设置是否强制使用saveKey属性对文件命名 policyMap.put("forceSaveKey",true);*/
policyMap.put("saveKey",fileName); //设置文件key文件名
policyMap.put("callbackUrl", callbackUrl); //设置上传成功回调url
policyMap.put("callbackBodyType", "application/json"); //设置回调参数格式json
policyMap.put("callbackBody", "{\"key\": $(key), \"hash\": $(etag)}"); //设置回调参数,魔法变量
String upToken = auth.uploadToken(constantQiniu.getBucket(), null,3600, policyMap);
return upToken;}
回调接口编写
/** * 客户端上传七牛云回调接口 * */
@RequestMapping("/uploadCallback")
public BaseResponse<FileDO> uploadCallback(@RequestBody Map<String, Object> param){
String key = (String) param.get("key");
return uploadService.uploadCallBack(key);
}
public BaseResponse<FileDO> uploadCallBack(String key){
FileDO fileDO = new FileDO();
if(StringUtils.isBlank(key)){
return BaseResponse.error("上传失败",-1);
}else {
String path = constantQiniu.getPath() + "/" + key;
fileDO.setUrl(path);
}
return BaseResponse.ok(fileDO);
}
客户端上传业务服务器
代码展示
上传方法
private String uploadQNImg(FileInputStream file, String key) {
// 构造一个带指定Zone对象的配置类
Configuration cfg = new Configuration();
// 其他参数参考类注释
UploadManager uploadManager = new UploadManager(cfg);
// 生成上传凭证,然后准备上传
String returnPath = null;
try {
Auth auth = Auth.create(constantQiniu.getAccessKey(), constantQiniu.getSecretKey());
String upToken = auth.uploadToken(constantQiniu.getBucket());
Response response = uploadManager.put(file, key, upToken, null, null);
// 解析上传成功的结果
DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
returnPath = constantQiniu.getPath() + "/" + putRet.key;
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
return returnPath;
}