前言
最近在做某个业务开发,需要实现图片批量上传到七牛云,并将资源url存到数据库。这一个看似简单的流程,在实际开发中确实最常用的。所以,稍微总结一下。
上传流程
整个流程很简单,前端指定好文件的name属性,调用后台接口,Java程序通过遍历文件数组,通过七牛提供的API进行文件流上传,最终将文件存储到七牛的url插入到数据库。咱们直接贴上核心代码即可。
@AutoWird
private IRemarkService remarkService;
@RequestMapping(value = "/remarkUploadImg",headers ="content-type=multipart/form-data" ,method = RequestMethod.POST)
public CommonResultDTO uploadImg(@RequestParam("files") MultipartFile[]files,Long remarkId,HttpServletRequest request){
CommonResultDTO dto = CommonResultDTO.createSuccessDTO();
Account account = SessionUtil.getCurrentAccount(request, accountService);
if (account == null) {
dto.setMessage("请先登录");
dto.setCode("000003");
return dto;
}
if (StringUtils.isEmpty(remarkId)){
dto.setMessage("请传入备注ID");
dto.setCode("000004");
return dto;
}
List<String>imgUrls=new ArrayList<>();
//获取文件流
if (files.length>0&&files!=null){
for (MultipartFile file:files){
try {
String imgUrl=imgUpload(file,remarkId);
imgUrls.add(imgUrl);
} catch (IOException e) {
logger.info("请上传有效的文件");
}
}
}
return CommonResultDTO.createSuccessDTO(imgUrls);
}
/**
* 七牛图片上传
* @param file
* @return
*/
private String imgUpload(MultipartFile file,Long remarkId) throws IOException {
InputStream inputStream=file.getInputStream();
String token=qiniuUtil.generateUploadToken();
String orgName= file.getOriginalFilename();
String newName=orgName.substring(orgName.lastIndexOf("."));
String uuid=UUID.randomUUID().toString().replace("-","");
String key=uuid+newName;
String relKey=qiniuUtil.uploadFile(inputStream,key,token);
if (!StringUtil.isEmpty(relKey)){
String imgUrl=QiniuUtil.baseUrl+relKey;
Resimg resimg=new Resimg();
resimg.setImgUrl(imgUrl);
resimg.setRemarkId(remarkId);
resimgService.addImg(resimg);
return imgUrl;
}
return "";
}
批量就是后端通过接收一个MultipartFile 数组文件,这里要注意参数名,方法类型以及headers指定contentType。这是controller层的实现,最终的上传重点在QiniuUtil 工具类中:
@Component
@Slf4j
public class QiniuUtil {
public static final String UPLOAD_TOKEN ="qiniuToken";
public static final Integer TOKEN_EXPIRE = 3400;
public static final String AccessKey="yourAccessKey";
public static final String SecretKey="yourSecretKey";
private static final String bucket = "yourBucket";
public static final String baseUrl="https://example.com/";
//生成上传Token
public String generateUploadToken(){
Auth auth = Auth.create(AccessKey, SecretKey);
String upToken = auth.uploadToken(bucket);
return upToken;
}
public String uploadFile(InputStream inputStream, String key, String upToken){
//构造一个带指定 Region 对象的配置类
Configuration cfg = new Configuration(Region.huadong());
UploadManager uploadManager = new UploadManager(cfg);
try {
Response response = uploadManager.put(inputStream, key, upToken,null,null);
//解析上传成功的结果
DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
log.info("上传图片成功,返回的key:{}",putRet.key);
return putRet.key;
} catch (QiniuException ex) {
Response r = ex.response;
log.error(r.toString());
try {
log.info(r.bodyString());
} catch (QiniuException ex2) {
}
}
return "";
}
}
测试
上传成功后,我们可以看到数据库表中插入了新的记录:
总结
文件上传在实际开发中比较常见,不过大体的代码思路都差不多,主要是要搞懂整个流程