阿里云oss上传文件,删除文件

179 阅读2分钟

有关阿里云oss怎么开通,怎么获取有关参数,请看黑马老师的这个视频:www.bilibili.com/video/BV1m8…
官方文档在这里:help.aliyun.com/zh/oss/deve…
你可以跟着官方文档写,也可以写的跟我的一样,我没写异常处理部分(捕获异常,抛出异常)

image.png

image.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";
    // 请使用你自己的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;
    }
}