有关阿里云oss怎么开通,怎么获取有关参数,请看黑马老师的这个视频:www.bilibili.com/video/BV1m8…
官方文档在这里:help.aliyun.com/zh/oss/deve…
你可以跟着官方文档写,也可以写的跟我的一样,我没写异常处理部分(捕获异常,抛出异常)
上传文件
package com.akbar.util;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;
@Component
public class AliyunOssUtil {
// OSS参数
private final String ENDPOINT = "https://oss-cn-beijing.aliyuncs.com";
// 请使用你自己的OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET
private final String OSS_ACCESS_KEY_ID = "XXX";
private final String OSS_ACCESS_KEY_SECRET = "YYY";
private final String BUCKET_NAME = "blog-ultimate";
private final String UTIL_PATH = "oss-cn-beijing.aliyuncs.com/";
// 上传文件
public String upload(MultipartFile file) throws IOException {
// 1. 获取上传文件流
InputStream inputStream = file.getInputStream();
// 2. 避免文件名被覆盖
String originalFilename = file.getOriginalFilename();
String fileName = UUID.randomUUID() + originalFilename.substring(originalFilename.lastIndexOf("."));
// 3. 上传文件到OSS
OSS ossClient = new OSSClientBuilder().build(ENDPOINT, OSS_ACCESS_KEY_ID, OSS_ACCESS_KEY_SECRET);
ossClient.putObject(BUCKET_NAME, fileName, inputStream);
// 4. 关闭OSS客户端
ossClient.shutdown();
// 5. 返回OSS文件路径
// 比如这样:https://blog-ultimate.oss-cn-beijing.aliyuncs.com/e5eee207-03a2-4e51-9b50-5d9f32c7983c.png
return ENDPOINT.split("//")[0] + "//" + BUCKET_NAME + "." + ENDPOINT.split("//")[1] + "/" + fileName;
}
}
删除文件
package com.akbar.util;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;
@Component
public class AliyunOssUtil {
// OSS参数
private final String ENDPOINT = "https://oss-cn-beijing.aliyuncs.com";
// 请使用你自己的OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET
private final String OSS_ACCESS_KEY_ID = "XXX";
private final String OSS_ACCESS_KEY_SECRET = "YYY";
private final String BUCKET_NAME = "blog-ultimate";
private final String UTIL_PATH = "oss-cn-beijing.aliyuncs.com/";
// 删除文件
public void delete(String url) {
/*
从url中提取objectName
例如url为https://blog-ultimate.oss-cn-beijing.aliyuncs.com/e5eee207-03a2-4e51-9b50-5d9f32c7983c.png
objectName为e5eee207-03a2-4e51-9b50-5d9f32c7983c.png
*/
String objectName = url.substring(url.indexOf(UTIL_PATH) + UTIL_PATH.length());
OSS ossClient = new OSSClientBuilder().build(ENDPOINT, OSS_ACCESS_KEY_ID, OSS_ACCESS_KEY_SECRET);
ossClient.deleteObject(BUCKET_NAME, objectName);
ossClient.shutdown();
}
}
注意:ossClient.deleteObject(BUCKET_NAME, objectName);
这里的objectName不能传图片完整的url,一定要传objectName
,比如https://blog-ultimate.oss-cn-beijing.aliyuncs.com/e5eee207-03a2-4e51-9b50-5d9f32c7983c.png
这里的objectName是e5eee207-03a2-4e51-9b50-5d9f32c7983c.png
。
完整上传和删除代码:
package com.akbar.util;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;
@Component
public class AliyunOssUtil {
// OSS参数
private final String ENDPOINT = "https://oss-cn-beijing.aliyuncs.com";
private final String OSS_ACCESS_KEY_ID = "XXX";
private final String OSS_ACCESS_KEY_SECRET = "YYY";
private final String BUCKET_NAME = "blog-ultimate";
private final String UTIL_PATH = "oss-cn-beijing.aliyuncs.com/";
// 上传文件
public String upload(MultipartFile file) throws IOException {
// 获取上传文件流
InputStream inputStream = file.getInputStream();
// 避免文件名被覆盖
String originalFilename = file.getOriginalFilename();
String fileName = UUID.randomUUID() + originalFilename.substring(originalFilename.lastIndexOf("."));
// 上传文件到OSS
OSS ossClient = new OSSClientBuilder().build(ENDPOINT, OSS_ACCESS_KEY_ID, OSS_ACCESS_KEY_SECRET);
ossClient.putObject(BUCKET_NAME, fileName, inputStream);
// 关闭OSS客户端
ossClient.shutdown();
// 返回OSS文件路径
return ENDPOINT.split("//")[0] + "//" + BUCKET_NAME + "." + ENDPOINT.split("//")[1] + "/" + fileName;
}
// 删除文件
public void delete(String url) {
/*
从url中提取objectName
例如url为https://blog-ultimate.oss-cn-beijing.aliyuncs.com/e5eee207-03a2-4e51-9b50-5d9f32c7983c.png
objectName为e5eee207-03a2-4e51-9b50-5d9f32c7983c.png
*/
String objectName = url.substring(url.indexOf(UTIL_PATH) + UTIL_PATH.length());
OSS ossClient = new OSSClientBuilder().build(ENDPOINT, OSS_ACCESS_KEY_ID, OSS_ACCESS_KEY_SECRET);
ossClient.deleteObject(BUCKET_NAME, objectName);
ossClient.shutdown();
}
}
在FileContoller中实现上传和删除操作
package com.akbar.controller;
import com.akbar.util.AliyunOssUtil;
import com.akbar.util.Result;
import com.akbar.util.ValidateImageExtension;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
@RestController
@RequestMapping("/file")
public class FileController {
private final AliyunOssUtil aliyunOssUtil;
@Autowired
public FileController(AliyunOssUtil aliyunOssUtil) {
this.aliyunOssUtil = aliyunOssUtil;
}
// 上传文件
@PostMapping("/upload")
public Result<String> upload(@RequestParam MultipartFile file) throws IOException {
String originalFilename = file.getOriginalFilename();
// 获取文件扩展名(小写形式)
String fileExtension = originalFilename != null ? originalFilename.substring(originalFilename.lastIndexOf(".") + 1) : "";
if (!ValidateImageExtension.isValidImageExtension(fileExtension)) {
return new Result<>(0, "文件格式不支持,仅支持png, jpg, jpeg, gif, webp格式的图片", null);
}
String url = aliyunOssUtil.upload(file);
return new Result<>(1, "success", url);
}
// 删除文件
@PostMapping("/delete")
public Result<Void> delete(@RequestParam String url) {
aliyunOssUtil.delete(url);
return Result.success("删除成功!");
}
}
我自己写了一个检查文件扩展名的工具类ValidateImageExtension
:
package com.akbar.util;
public class ValidateImageExtension {
public static boolean isValidImageExtension(String extension) {
String[] allowedExtensions = {"jpg", "jpeg", "png", "gif", "webp"};
for (String ext : allowedExtensions) {
if (ext.equalsIgnoreCase(extension)) {
return true;
}
}
return false;
}
}