目录
背景
参加一个智能农业管理系统的项目,本人负责小程序及后端,在实现新设备添加时需要上传一张设备图片(用于页面展示等等),这张图片肯定不能放到本地,不然换个手机访问直接GG,所以特此利用阿里的OSS服务器来实现。
正文内容
1.申请OSS云服务器
阿里云官网
搜索 对象存储OSS,就行,创建 Bucket的过程省略,按需求选择即可。
创建 Bucket的过程中记录一下几样东西!!!
- Endpoint(这个是访问地址)
- Bucket 名称(你的设备的名字)
创建完成之后去个人中心看两个东西(版本不同位置不同,在哪看自行百度)
- ACCESS_KEY_ID(用户ID)
- ACCESS_KEY_SECRET(用户密钥)
以上四个东西至关重要,缺一不可,建议找记事本单独保存。
2.添加依赖
回到 IDEA
<!-- https://mvnrepository.com/artifact/com.aliyun.oss/aliyun-sdk-oss -->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.6.0</version>
</dependency>
3.写一个简单的封装类(上传的时候直接调用就好了)
我这里因为需求只需要上传图片和删除文件所以只写了这个,其他上传需求的可以看官方文档或者C站其他大佬的博客(记得把参数改成你自己的!!)
@Controller
public class OSSClientUtil {
public String uploadFile(MultipartFile multipartFile) throws IOException {
OSSClient ossClient = new OSSClient(ALiYunOSS.URL, ALiYunOSS.ACCESS_KEY_ID, ALiYunOSS.ACCESS_KEY_SECRET);
// 获取文件名
String fileName = multipartFile.getOriginalFilename();
// 获取文件后缀名
String suffixName = fileName.substring(fileName.lastIndexOf("."));
// 最后上传生成的文件名
String finalFileName = System.currentTimeMillis() + "" + new SecureRandom().nextInt(0x0400) + suffixName;
// oss中的文件夹名
String objectName = "smart_ag/newEquipment/" + finalFileName;
// 创建上传文件的元信息,可以通过文件元信息设置HTTP header(设置了才能通过返回的链接直接访问)。
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentType("image/jpg");
// 文件上传
ossClient.putObject(ALiYunOSS.BUCKET_NAME, objectName, new ByteArrayInputStream(multipartFile.getBytes()), objectMetadata);
// 设置URL过期时间
Date expiration = new Date(System.currentTimeMillis() + 3600 * 596523);
String url = ossClient.generatePresignedUrl(ALiYunOSS.BUCKET_NAME, objectName, expiration).toString();
ossClient.shutdown();
return url;
}
/**
* 删除单个图片
*
* @param url
*/
public void deleteImg(String url) {
// 填写文件完整路径。文件完整路径中不能包含Bucket名称。(这里根据自己的地址改)
url = url.replace("http://桶名.地域节点/", "");
int index = url.indexOf("?");
url = url.substring(0, index);
System.out.println("拆分后的路径"+url);
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(ALiYunOSS.URL, ALiYunOSS.ACCESS_KEY_ID, ALiYunOSS.ACCESS_KEY_SECRET);
// 删除文件或目录。如果要删除目录,目录必须为空。
ossClient.deleteObject(ALiYunOSS.BUCKET_NAME, url);
// 关闭OSSClient。
ossClient.shutdown();
}
}
4.调用
前端传过来的刚好是 MultipartFile 类型,直接调用,拿到URL
上传:
@Autowired
private OSSClientUtil ossClientUtil;
public int AddNewEquipment(MultipartFile uploadImage, HttpServletRequest request) throws IOException {
// 保存图片到云端
System.out.println(ossClientUtil.uploadFile(uploadImage));
return 1;
}
删除:
@Autowired
private OSSClientUtil ossClientUtil;
public int delEquipmentById() {
ossClientUtil.deleteImg(url);
return 1;
}
5.查看
通过后台打印的地址,直接访问浏览器就能看到效果了
注意事项:
1.无法删除OSS端文件,路径错误
在写封装类的删除的时候,一定记得要把文件名截取出来!!!
因为ossClient.deleteObject(ALiYunOSS.BUCKET_NAME, url);
里的 url 不能写原本的地址!!
例如:(经过处理的地址,仅记录如何拆分)
http://abcdefg.oss-cn-hangzhou.aliyuncs.com/smart_ag/newEquipment/1631498883856872.jpeg?Expires=1633246367&OSSAccessKeyId=LTAI4tNju6tSEYrD6Ivwm9TZ&Signature=i56yibtYGixA25DVhA8C7%2BG4Ac4%3D
截取后的url:
smart_ag/newEquipment/1631498883856872.jpeg
2.无法删除OSS端文件,仅产生删除标记
这是因为阿里云默认有保护机制,给同一文件规定了版本控制,贴一张图
说白了就是给每一张图都加了一个ID,删除的时候不指定,就不会彻底删除,只会加一个删除标记。
解决方案:关闭版本控制