图片存储解决方案---阿里云OSS

实现图片上传服务,方案:

  1. 直接将图片保存到服务所在的硬盘 优点:开发便捷,成本低 缺点:扩容困难
  2. 使用分布式文件系统进行存储 优点:容易实现扩容 缺点:部署复杂、开发复杂度稍大(有成熟的产品可以使用,比如:FastDFS)
  3. 使用第三方的存储服务 优点:开发简单,拥有强大功能,免维护 缺点:付费

1、导入依赖

<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-core</artifactId>
    <version>4.0.6</version>
</dependency>

<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.10.2</version>
</dependency>

2、Propeties 属性类

@Data
@ConfigurationProperties(prefix = "oss")// 指定yml文件全路径,获取属性
public class OssProperties {

    private String accessKey;
    private String secret;
    private String bucketName;
    private String url;
    private String Endpoint;
}

3、定义模板类

public class OssTemplate {

    private OssProperties properties;

    public OssTemplate(OssProperties properties) {
        this.properties = properties;
    }
    
    /**
     * 文件上传到阿里云OSS
     * @param fileName 上传文件名
     * @param inputStream 文件输入流
     * @return 图片的访问地址
     */
    public String upload(String fileName, InputStream inputStream) {

        // Endpoint以杭州为例,其它Region请按实际情况填写。
        String endpoint = properties.getEndpoint();
        // 阿里云主账号AccessKey拥有所有API的访问权限
        String accessKeyId = properties.getAccessKey();
        String accessKeySecret = properties.getSecret();
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        //获取上传后缀名
        String sufix = fileName.substring(fileName.lastIndexOf("."));
        /**
         * 文件名称:
         *   images/2020/10/31/uuid(格式)
         * 拼接图片名称如下:
         */
        String name = "images/"+new SimpleDateFormat("yyyy/MM/dd").format(new Date()) +"/"
                + UUID.randomUUID().toString() + sufix;
        ossClient.putObject(properties.getBucketName(), name, inputStream);
        // 关闭OSSClient。
        ossClient.shutdown();

        return "https://" + properties.getUrl() + "/" + name;
    }

}

4、自动配置类

@Configuration
// 自动的读取yml中配置信息,并赋值到OssProperties对象中,将此对象存入容器
@EnableConfigurationProperties({   
        OssProperties.class
})
public class TanhuaAutoConfiguration {


    @Bean
    public OssTemplate ossTemplate(OssProperties ossProperties) {
        return new OssTemplate(ossProperties);
    }
}

5、application.yml配置

# 阿里云oss上的信息
oss:
    accessKey: 
    secret: 
    bucketName: 
    endpoint: 
    url:

测试:

/**
 * 测试文件上传
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class OssTest {

    @Autowired
    private OssTemplate ossTemplate;

    @Test
    public void testSendMsg() throws FileNotFoundException {
        String file = "D:\123.jpg";// 图片的路径
        String url = ossTemplate.upload(file, new FileInputStream(file));
        System.out.println("url = " + url);
    }
}
经验分享 程序员 微信小程序 职场和发展