使用Java SDK上传图片到阿里云对象存储OSS

该文章已同步收录到我的博客网站,欢迎浏览我的博客网站,xhang’s blog

1.获取到Java SDK

  1. 到阿里云对象存储的SDK下载,选择Java SDK
image-20221110104644192
  1. 查看SDK文档,选择简单上传

image-20221110104939626

  1. 选择上传文件流,获取到源码

更改源码步骤详见 4.测试 单元

2.在配置类中填写参数

# 阿里云OSS对象存储
oss:
  #  配置地域节点Endpoint
  endpoint: https://oss-cn-shanghai.aliyuncs.com
  accessKeyId: LTAI5tMp**************
  accessKeySecret: TWrV2y************
  bucketName: ************
  1. 地域节点endpoint获取方式:

​ 点击Bucket实例概览

image-20221110105604856

  1. 访问密钥ID accessKeyId和访问密钥accessKeySecret

​ 在头像的位置,点击AccessKey管理,生成对应的accessKeyId和accessKeySecret

image-20221110105800991

​ 点击创建AccessKey

image-20221110105917425

  1. bucketName即创建的Bucket名

3.Oss配置类

此配置类是为了读取application.yaml配置文件当中的OSS参数

采用@Value的方式读取配置文件当中的OSS参数

@Component
public class OssUtils implements InitializingBean {

    //读取配置文件中的内容
    @Value("${oss.endpoint}") //属性注解,能将括号中的值注入到属性中去
    private String endpoint;

    @Value("${oss.accessKeyId}")
    private String accessKeyId;

    @Value("${oss.accessKeySecret}")
    private String accessKeySecret;

    @Value("${oss.bucketname}")
    private String bucketName;


    public static String END_POINT;
    public static String ACCESS_KEY_ID;
    public static String ACCESS_KEY_SECRET;
    public static String BUCKET_NAME;

    public void afterPropertiesSet() throws Exception {
        END_POINT = endpoint;
        ACCESS_KEY_ID = accessKeyId;
        ACCESS_KEY_SECRET = accessKeySecret;
        BUCKET_NAME = bucketName;
    }
}

4.代码具体实现

  1. 加入阿里云OSS对象存储依赖
<!--阿里云OSS-->
<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.10.2</version>
</dependency>
  1. Controller层
@RestController
public class UploadController {

    @Resource
    private UploadService uploadService;

    @PostMapping("/upload")
    public ResponseResult uploadImg(MultipartFile img){
       return uploadService.uploadImg(img);
    }
}
  1. Service层接口
public interface UploadService {
    ResponseResult uploadImg(MultipartFile img);
}
  1. Service层实现类

​ 说明objectName是上传到BUCKET_NAME中(即Bucket)文件的路径和文件名

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.ObjectMetadata;
import com.xha.domain.ResponseResult;
import com.xha.service.UploadService;
import com.xha.utils.ImgUtils;
import com.xha.utils.OssUtils;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;


@Service
public class UploadServiceImpl implements UploadService {

    /**
     * 文件上传阿里云OSS
     *
     * @param imgFile
     * @return
     */
    @Override
    public ResponseResult uploadImg(MultipartFile imgFile) {
//        1.获取到原始文件名
        String originalFilename = imgFile.getOriginalFilename();
        String fileName = ImgUtils.generateFilePath(originalFilename);
        String imgUrl = ossUpload(imgFile, fileName);
        return ResponseResult.okResult(imgUrl);
    }


    private String ossUpload(MultipartFile multipartFile, String fileName) {
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder()
                .build(OssUtils.END_POINT, OssUtils.ACCESS_KEY_ID, OssUtils.ACCESS_KEY_SECRET);


        // 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。
        String objectName = "文件目录/" + fileName;
        try {

            InputStream inputStream = multipartFile.getInputStream();
            // 创建PutObject请求。
            ossClient.putObject(OssUtils.BUCKET_NAME, objectName, inputStream);
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
//        返回对象存储中的图片路径        
        return "https://" + OssUtils.BUCKET_NAME + "." + OssUtils.END_POINT + "/" + objectName;
    }
}

5.接口测试

  1. 采用ApiFox发送请求

image-20221110132413685

文件列表中已经存在了上传的图片

image-20221110132446505

  1. 前端项目测试

    上传成功

GIF 2022-11-10 13-27-53
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值