1引入七牛依赖
<dependency> <groupId>com.qiniu</groupId> <artifactId>qiniu-java-sdk</artifactId> <version>[7.2.0, 7.2.99]</version> </dependency>
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>19.0</version> </dependency>
2:七牛工具类
import com.google.gson.Gson; import com.qiniu.common.QiniuException; import com.qiniu.common.Zone; import com.qiniu.http.Response; import com.qiniu.storage.BucketManager; import com.qiniu.storage.Configuration; import com.qiniu.storage.UploadManager; import com.qiniu.storage.model.BatchStatus; import com.qiniu.storage.model.DefaultPutRet; import com.qiniu.util.Auth; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import java.io.*; import java.net.URLEncoder; import java.util.*; @Component @Slf4j public class QiNiuUtils { @Value(value = "${qiNiu.images.accessKey}") private String accessKey; @Value(value = "${qiNiu.images.secretKey}") private String secretKey; @Value(value = "${qiNiu.images.bucket}") private String bucket; @Value(value = "${qiNiu.images.domainOfBucket}") private String domainOfBucket; public Map<String, String> uploadImages(File file) { Configuration cfg = new Configuration(Zone.zone0()); //zong1() 代表华北地区 UploadManager uploadManager = new UploadManager(cfg); String fileName = UUID.randomUUID().toString().replace("-", "") + "_" + file.getName();//在七牛云中图片的命名 Auth auth = Auth.create(accessKey, secretKey); String upToken = auth.uploadToken(bucket); Map<String, String> map = new HashMap<>(); try { Response response = uploadManager.put(file, fileName, upToken); //解析上传成功的结果 DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class); map.put("imageName", putRet.key); map.put("imageHash", putRet.hash); } catch (QiniuException ex) { Response r = ex.response; try { log.error(r.bodyString()); } catch (QiniuException ex2) { //ignore } } return map; } public String downLoadImage(String path) throws Exception { String encodedFileName = URLEncoder.encode(path, "utf-8").replace("+", "%20"); return String.format("%s/%s", domainOfBucket, encodedFileName); // Auth auth = Auth.create(accessKey, secretKey); // long expireInSeconds = 3600;//1小时,可以自定义链接过期时间 // return auth.privateDownloadUrl(publicUrl, expireInSeconds); } public List<Map<Integer, String>> deleteImages(String[] keyList) { //构造一个带指定Zone对象的配置类 Configuration cfg = new Configuration(Zone.zone0()); Auth auth = Auth.create(accessKey, secretKey); BucketManager bucketManager = new BucketManager(auth, cfg); try { //单次批量请求的文件数量不得超过1000 BucketManager.BatchOperations batchOperations = new BucketManager.BatchOperations(); batchOperations.addDeleteOp(bucket, keyList); Response response = bucketManager.batch(batchOperations); BatchStatus[] batchStatusList = response.jsonToObject(BatchStatus[].class); List<Map<Integer, String>> mapList = new ArrayList<>(); Map<Integer, String> map = new HashMap<>(); for (int i = 0; i < keyList.length; i++) { BatchStatus status = batchStatusList[i]; String key = keyList[i]; System.out.print(key + "\t"); if (status.code != 200) { log.error("七牛删除文件出错了-------{}", status.data.error, key); map.put(status.code, key); mapList.add(map); } } return mapList; } catch (QiniuException ex) { log.error("七牛删除文件出错了-------{}", ex.response.toString()); } return null; } }
3:接口
import com.lemo.saas.result.ResultData; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.util.List; import java.util.Map; @Api(tags = "通用图片上传至七牛服务器接口") @RequestMapping(value = "lemo/image") public interface ImageManagementApiClient { @PostMapping(value = "upload", consumes = "multipart/form-data") @ApiOperation(value = "图片上传接口,返回data中的imageName为图片的名称") ResultData<Map<String, String>> imageUpload(@RequestParam("file")MultipartFile file); @GetMapping @ApiOperation(value = "根据图片的名称进行图片的下载,返回图片路径") ResultData<String> downloadImage(String name); @DeleteMapping @ApiOperation(value = "根据图片名称集合删除图片信息,如果返回data不为null,说明有部分图片未删除,已记录到日志中,实施手动删除,其中key为删除状态码,值为文件名称") ResultData<List<Map<Integer, String>>> deleteImage(String[] names); }
4: 接口实现
import com.lemo.saas.constant.ExceptionEnum; import com.lemo.saas.exception.MyException; import com.lemo.saas.qiniu.QiNiuUtils; import com.lemo.saas.qiniu.client.ImageManagementApiClient; import com.lemo.saas.result.ResultData; import com.lemo.saas.utils.MyFileUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.util.List; import java.util.Map; @RestController public class ImageManagementApiImpl implements ImageManagementApiClient { @Autowired private QiNiuUtils qiNiuUtils; @Override public ResultData<Map<String, String>> imageUpload(@RequestParam("file")MultipartFile file) { if (file.isEmpty()) { throw new MyException(ExceptionEnum.FILE_NOT_FOUND_ERROR); } File toFile = MyFileUtils.MultipartFileToFile(file); Map<String, String> map = qiNiuUtils.uploadImages(toFile); return ResultData.success(map); } @Override public ResultData<String> downloadImage(String path) { String loadImage; try { loadImage = qiNiuUtils.downLoadImage(path); }catch (Exception e ){ return ResultData.success("图片下载错误"); } return ResultData.success(loadImage); } @Override public ResultData<List<Map<Integer, String>>> deleteImage(String[] names) { List<Map<Integer, String>> mapList = qiNiuUtils.deleteImages(names); return ResultData.success(mapList); } }