接下来写下service和controller。编写service的过程不需要刻意记忆,只需要查阅官网文档改写即可。

@Service
public class OssServiceImpl implements OssService {

    @Override
    public String uploadFileAvatar(MultipartFile file) {
        //工具类获取值
        String endpoint = ConstantPropertiesUtils.END_POINT;
        String accessKeyId = ConstantPropertiesUtils.KEY_ID;
        String accessKeySecret = ConstantPropertiesUtils.KEY_SECRET;
        String bucketName = ConstantPropertiesUtils.BUCKET_NAME;

        try {
            // 创建OSS实例
            OSS ossClient = new OSSClientBuilder().build(endpoint,accessKeyId,accessKeySecret);
            // 获取文件的输入流
            InputStream inputStream = file.getInputStream();
            String fileName = file.getOriginalFilename();
            // 调用oss的方法
            ossClient.putObject(bucketName, fileName, inputStream);
            ossClient.shutdown();
            // 拼接url 格式:https://edu-banjiu.oss-cn-hangzhou.aliyuncs.com/default.gif
            String url = "http://"+bucketName+"."+endpoint+"/"+fileName ;
            return url;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }

    }
}
@RestController
@CrossOrigin
@EnableSwagger2
@RequestMapping("eduoss/fileoss")
public class OssController {
    @Autowired
    private OssService ossservice;

    // 上传头像
    @PostMapping
    public R uploadOssFile(MultipartFile file){
        String url = ossservice.uploadFileAvatar(file);
        return R.ok().data("url", url);
    }
}

在网页输入Swagger UI进行测试。在oss控制台查看文件是否上传成功,请读者自测。

功能实现了,但是还存在问题,请读者设想:

(1)如果多次上传同名文件,岂不是就会出现文件覆盖的情况。在文件名上添加一个随机值。

String uuid = UUID.randomUUID().toString();
fileName = uuid + fileName;

(2)如果文件很多,都在同一目录,也太不方便管理了,因此我们需要分日期对文件进行分文件夹管理。

//org.joda.time.DateTime;
String path = new DateTime().toString("yyyy/MM/dd");
fileName = path + "/" +fileName;

结果如下图。

image-20211101222355716