目录
- Aliyun OSS
- OSS 简介
- OSS 基本概念
- OSS 功能概述
- OSS 使用
- 创建存储空间Bucket
- 创建子目录
- Java编码
- 测试
 
 
Aliyun OSS
OSS 简介
阿里云对象存储OSS(Object Storage Service)是阿里云提供的海量、安全、低成本、高持久的云存储服务。
OSS 基本概念
官方文档:点我传送
- 存储空间(Bucket)
- 对象(Object)
- ObjectKey
- Region(地域)
- Endpoint(访问域名)
- AccessKey(访问密钥)
OSS 功能概述
官方文档:点我传送
- 创建存储空间
- 上传文件
- 简单上传: 包括流式上传和文件上传。最大不能超过5GB。
- 表单上传: 最大不能超过5GB。
- 追加上传: 最大不能超过5GB。
- 断点续传上传: 支持并发、断点续传、自定义分片大小。大文件上传推荐使用断点续传。最大不能超过48.8TB。
- 分片上传: 当文件较大时,可以使用分片上传,最大不能超过48.8TB。
 
- 下载文件
OSS 使用
使用步骤:
 
创建存储空间Bucket
官方文档:点我传送

创建子目录
创建目录,更好的区分图片存放的位置。也可以直接放在创建的Bucket上。
 
Java编码
- controller 层
/**
 * 图片上传 Controller
 */
@RestController
@RequestMapping("/images")
public class ImagesController {
    @PostMapping("/upload")
    public void upload(@RequestParam("imageString") String imageString) throws UnsupportedEncodingException {
        String list = seafoodService.upload(imageString);
    }
    
}
- Service层
interface Service
/**
 * 上传图片 service接口
 */
public interface ISeafoodService {
    /**
     * 图片上传
     * @author Hosystem
     * @create 2021-2-24
     * @desc 图片上传
     **/
    String upload(String imageString) throws UnsupportedEncodingException;
}
ServiceImpl
/**
 * 上传图片 service
 */
@Service
public class SeafoodServiceImpl implements ISeafoodService {
    /**
     *  阿里云 OSS 配置抽取yml
     */
    @Autowired
    AliPayClientProperties aliPayClientProperties;
    
    /**
     * 图片上传
     * @author HYH
     * @create 2021-2-24
     * @desc 图片上传 将图片转换成base64编码然后传进来
     * 
     * 参考文档:https://help.aliyun.com/document_detail/84781.html?spm=a2c4g.11186623.2.10.e50c46a19Q1Q52
     **/
    @Override
    public String upload(String imageString) {
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(appProps.getAliOssClientProperties().getEndpoint(), appProps.getAliOssClientProperties().getAccessKeyId(), appProps.getAliOssClientProperties().getAccessKeySecret());
        // 创建一个Base64 对象
        Base64 base64 = new Base64();
        // 将传进来的base64编码 进行解码
        byte[] imageByte = base64.decode(imageString.toString());
        // 创建字节流 将base64解码后进行字节流转换
        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(imageByte);
        // 上传路径 bucket目录名 + 图片的名称  使用UUID随机生成
        // OSS管理控制台将所有文件名以正斜线(/)结尾的文件显示为文件夹;
        // 如:abc/efg/123.jpg这个路径的文件,在OSS管理控制台上看起来就是123.jgp存放在abc文件夹下的efg子文件夹中。
        // 若想上传到bucket 则 String url = UUID.randomUUID().toString() + "." + "jpg";
        String url = appProps.getAliOssClientProperties().getDirectoryPath() + UUID.randomUUID().toString() + "." + "jpg";
        // 文件元信息(Object Meta):包括HTTP header和自定义元信息
        // 创建上传文件的元信息,可以通过文件元信息设置HTTP header。
        // 参考文档:https://help.aliyun.com/document_detail/84840.html
        ObjectMetadata objectMetadata = new ObjectMetadata();
        objectMetadata.setContentType("image/jpg");
        // 上传文件
        // 格式:ossClient.putObject("<yourBucketName>", "<yourObjectName>", new ByteArrayInputStream(content.getBytes()), meta);
        ossClient.putObject(appProps.getAliOssClientProperties().getBucketName(), url, byteArrayInputStream, objectMetadata);
        // 关闭OSSClient
        ossClient.shutdown();
        // 返回上传图片的OSS路径
        return appProps.getAliOssClientProperties().getUrl() + url;
    }
    
}
- yml配置抽取
@Data
@Component
@Accessors(chain = true)
@ConfigurationProperties(prefix = "aliOssClientProperties")
public class AliOssClientProperties {
    /**
     *  阿里云OSS endpoint
     */
    private String endpoint;
    /**
     *  阿里云OSS AccessKey
     */
    private String accessKeyId;
    /**
     *  阿里云OSS AccessKeySecret
     */
    private String accessKeySecret;
    /**
     *  阿里云OSS bucketName
     */
    private String bucketName;
    /**
     *  阿里云OSS url
     */
    private String url;
    /**
     *  阿里云OSS directoryPath 目录路径
     */
    private String directoryPath;
}
- yml配置
  # http://<bucket>.<endpoint>/<yourfile>+<yourdirectoryPath>
aliOssClientProperties:
  endpoint: oss-cn-shenzhen.aliyuncs.com
  accessKeyId: #accessKey
  accessKeySecret: #accessKeySecret
  bucketName: #bucketName
  url: https://<bucketName>.<endpoint>
  directoryPath: images/
测试
这里我通过swagger进行测试,也可以通过postman进行测试,直接定义常量imageString 当作参数使用。
 
参考文档1:点我传送
参考文档2:点我传送
参考文档3:点我传送


