【实战记录】使用阿里云的OSS云存储,上传与删除图片及遇到的问题

目录

    • 背景
    • 正文内容
      • 1.申请OSS云服务器
      • 2.添加依赖
      • 3.写一个简单的封装类(上传的时候直接调用就好了)
      • 4.调用
      • 5.查看
    • 注意事项:
      • 1.无法删除OSS端文件,路径错误
      • 2.无法删除OSS端文件,仅产生删除标记

背景

参加一个智能农业管理系统的项目,本人负责小程序及后端,在实现新设备添加时需要上传一张设备图片(用于页面展示等等),这张图片肯定不能放到本地,不然换个手机访问直接GG,所以特此利用阿里的OSS服务器来实现。

正文内容

1.申请OSS云服务器

阿里云官网
搜索 对象存储OSS,就行,创建 Bucket的过程省略,按需求选择即可。
创建 Bucket的过程中记录一下几样东西!!!

  1. Endpoint(这个是访问地址)
  2. Bucket 名称(你的设备的名字)

创建完成之后去个人中心看两个东西(版本不同位置不同,在哪看自行百度)

  1. ACCESS_KEY_ID(用户ID)
  2. 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端文件,仅产生删除标记

这是因为阿里云默认有保护机制,给同一文件规定了版本控制,贴一张图
【实战记录】使用阿里云的OSS云存储,上传与删除图片及遇到的问题_第1张图片
说白了就是给每一张图都加了一个ID,删除的时候不指定,就不会彻底删除,只会加一个删除标记。

解决方案:关闭版本控制
【实战记录】使用阿里云的OSS云存储,上传与删除图片及遇到的问题_第2张图片

你可能感兴趣的:(后端杂记,html5,spring,boot,后端,阿里云)