引言:在搭建项目时如果把上传的文件存储在该项目运行的主机上,会导致访问该项目时加载非常缓慢,因此需要对象存储。并且对象存储具有网站数据动静分离,大幅提升网页性能,储存节点多,支持跨地域实时同步,成本低,可节省服务器空间等优点。本文讲诉的是如何使用七牛云对象存储,用七牛云是因为七牛云送10G空间,对于小网站来说足够了。
1.先在pom.xml中导包
<!--第一种导包方式-->
<!--导入指定的7.7.0版本-->
<dependency>
<groupId>com.qiniu</groupId>
<artifactId>qiniu-java-sdk</artifactId>
<version>7.7.0</version>
</dependency>
<!--第二种导包方式-->
<!--这里指定了一个版本范围,每次更新pom.xml的时候会下载7.7.x版本中的最新版本-->
<dependency>
<groupId>com.qiniu</groupId>
<artifactId>qiniu-java-sdk</artifactId>
<version>[7.7.0, 7.10.99]</version>
</dependency>
2.创建一个QiniuCloudUtil工具类并定义几个必要的变量
不知道这些变量在哪的可以参考 文章 该文章有提及以下变量在哪和如何创建存储空间
public class QiniuCloudUtil {
private static final String QiniuCloud_accessKey = "你七牛云的accessKey";
private static final String QiniuCloud_secretKey = "你七牛云的secretKey";
private static final String QiniuCloud_bucket = "你七牛云的存储空间名称";
private static final String QiniuCloud_domainName = "http://你七牛云的存储空间链接";
private static final String customSuffix = ".png";//定义图片保存后的后缀
}
3.上传文件
public class QiniuCloudUtil {
/**
* 上传图片到七牛云
* @param file 图片
* @return 返回图片存储后的新图片名
* @throws Exception
*/
public static Object QiniuCloudUploadImage(MultipartFile file) throws Exception{
if(file.isEmpty()) {
return "文件为空";
}else if(file.getSize() > 1024*1024*10){
return "文件大于10M";
}
//获取图片后缀
String originalFilename = file.getOriginalFilename();
String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
//允许上传的图片格式集合
String[] suffixes = new String[]{".bmp", ".jpeg", ".jpg", ".png"};
boolean bool = false;
//判断格式是否在suffixes中
for(String string : suffixes){
if (string.equals(suffix)){
bool = true;
break;
}
}
if(!bool){
return "图片格式错误";
}
//构造一个带指定 Region 对象的配置类
Configuration cfg = new Configuration(Region.autoRegion());
cfg.resumableUploadAPIVersion = Configuration.ResumableUploadAPIVersion.V2;//指定分片上传版本
UploadManager uploadManager = new UploadManager(cfg);
//生成上传凭证,然后准备上传
String accessKey = QiniuCloud_accessKey;
String secretKey = QiniuCloud_secretKey;
String bucket = QiniuCloud_bucket;
byte[] bytes = file.getBytes();
String imageName = DigestUtils.md5DigestAsHex(bytes);//将图片md5的值作为图片名,避免重复图片浪费空间
//默认不指定key的情况下,以文件内容的hash值作为文件名
String key = imageName + customSuffix;//图片保存到七牛云后的文件名
try {
byte[] uploadBytes = file.getBytes();
ByteArrayInputStream byteInputStream=new ByteArrayInputStream(uploadBytes);
Auth auth = Auth.create(accessKey, secretKey);
String upToken = auth.uploadToken(bucket);
try {
uploadManager.put(byteInputStream,key,upToken,null, null);
} catch (QiniuException ex) {
Response r = ex.response;
System.err.println("七牛云ERROR:" + r.toString());
try {
System.err.println("七牛云ERROR:" + r.bodyString());
} catch (QiniuException ex2) {
//ignore
}
}
} catch (UnsupportedEncodingException ex) {
//ignore
}
return key;
}
}
4.获取文件链接
public class QiniuCloudUtil {
/**
* 获取七牛云图片链接
* @param fileName 图片名
* @return 返回图片链接
*/
public static Object QiniuCloudDownloadImage(String fileName){
String fileUrl = String.format("%s/%s", QiniuCloud_domainName, fileName);
return fileUrl;
}
}
5.批量删除文件(可以只删除一个)
public class QiniuCloudUtil {
/**
* 从七牛云删除图片
* @param fileNameList 图片名集合
* @return 返回每张图片的删除结果
*/
public static Object QiniuCloudDeleteImage(String[] fileNameList){
//用Json格式传数组时直接传["xxx", "xxx", "xxx", "xxx"]
//构造一个带指定 Region 对象的配置类
Configuration cfg = new Configuration(Region.region0());
//生成凭证
String accessKey = QiniuCloud_accessKey;
String secretKey = QiniuCloud_secretKey;
String bucket = QiniuCloud_bucket;
Auth auth = Auth.create(accessKey, secretKey);
BucketManager bucketManager = new BucketManager(auth, cfg);
//创建一个用来接收删除结果的集合
List<String> list = new ArrayList<>();
try {
//单次批量请求的文件数量不得超过1000
BucketManager.BatchOperations batchOperations = new BucketManager.BatchOperations();
batchOperations.addDeleteOp(bucket, fileNameList);
Response response = bucketManager.batch(batchOperations);
BatchStatus[] batchStatusList = response.jsonToObject(BatchStatus[].class);
for (int i = 0; i < fileNameList.length; i++) {
BatchStatus status = batchStatusList[i];
if (status.code == 200) {//成功返回文件名+true并添加进集合
list.add("{fileName:"+fileNameList[i]+",deleteResult:true}");
}else {//失败返回文件名+false并添加进集合
list.add("{fileName:"+fileNameList[i]+",deleteResult:false}");
}
}
} catch (QiniuException ex) {
System.err.println("七牛云ERROR:" + ex.response.toString());
}
return list;
}
}
6.创建一个Controller类来调用QiniuCloudUtil中的方法
我这里接收参数的类是自封装返回工具类,记得改
@RestController
@RequestMapping()
public class Test {
//上传图片
@PostMapping("/test1")
public Result<Object> test1(@RequestParam("file") MultipartFile file) throws Exception {
return QiniuCloudUtil.QiniuCloudUploadImage(file);
}
//获取图片链接
@PostMapping("/test2")
public Result<Object> test2(@RequestParam("fileName") String fileName){
return QiniuCloudUtil.QiniuCloudDownloadImage(fileName);
}
//删除图片
@PostMapping("/test3")
public Result<Object> test3(@RequestBody String[] fileNameList){
return QiniuCloudUtil.QiniuCloudDeleteImage(fileNameList);
}
}
7.功能演示
演示中用到的软件是Apifox