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