实现图片上传服务,需要有存储的支持,那么我们的解决方案有以下几种:
1. 直接将图片保存到服务的硬盘 优点:开发便捷,成本低 缺点:扩容困难 2. 使用分布式文件系统进行存储(Minio FastDFS) 优点:容易实现扩容 缺点:开发复杂度稍大 3. 使用第三方的存储服务(阿里云 华为云 七牛云) 优点:开发简单,拥有强大功能,免维护 缺点:付费
因此建议使用阿里云OSS来进行存储图片。
添加依赖
<!--阿里云-->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.10.2</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.0.6</version>
</dependency>
添加配置: application.yml
在配置文件application.yml中添加oss的配置 注意: 按照自己的阿里云配置修改
aliyun:
oss:
endpoint: xxxxx //区域
accessKeyId: xxxxxxxx //秘钥key
accessKeySecret: xxxxxxx //秘钥
bucketName: xxxxx //存储空间
url: xxxxx //访问域名
创建配置类: OssProperties
@Data
@Component
@ConfigurationProperties(prefix = "aliyun.oss")//读取配置信息
public class OssProperties{
private String endpoint; //区域
private String accessKeyId;//秘钥key
private String accessKeySecret;//秘钥
private String bucketName;//存储空间
private String url;//访问域名
}
创建工具类: OssTemplate
在项目中创建
com.itheima.util.OssTemplate
package com.itheima.util;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.ObjectMetadata;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
//阿里存储工具类
@Component
public class OssTemplate {
//注入配置参数实体类对象
@Autowired
private OssProperties ossProperties;
//文件上传
public String upload(String fileName, InputStream inputStream) {
//创建客户端
OSS ossClient = new OSSClientBuilder().build(ossProperties.getEndpoint(),
ossProperties.getAccessKeyId(), ossProperties.getAccessKeySecret());
//设置文件最终的路径和名称
String objectName = "images/" + new SimpleDateFormat("yyyy/MM/dd").format(new Date())
+ "/" + System.currentTimeMillis() + fileName.substring(fileName.lastIndexOf("."));
//meta设置请求头,解决访问图片地址直接下载
ObjectMetadata meta = new ObjectMetadata();
meta.setContentType(getContentType(fileName.substring(fileName.lastIndexOf("."))));
//上传
ossClient.putObject(ossProperties.getBucketName(), objectName, inputStream, meta);
//关闭客户端
ossClient.shutdown();
return ossProperties.getUrl() + "/" + objectName;
}
//文件后缀处理
private String getContentType(String FilenameExtension) {
if (FilenameExtension.equalsIgnoreCase(".bmp")) {
return "image/bmp";
}
if (FilenameExtension.equalsIgnoreCase(".gif")) {
return "image/gif";
}
if (FilenameExtension.equalsIgnoreCase(".jpeg") ||
FilenameExtension.equalsIgnoreCase(".jpg") ||
FilenameExtension.equalsIgnoreCase(".png")) {
return "image/jpg";
}
return "image/jpg";
}
}
测试
在测试类中进行测试
com.itheima.test.OssTemplateTest
package com.itheima.test;
import com.itheima.util.OssTemplate;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
@SpringBootTest
@Slf4j
public class OssTemplateTest {
@Autowired
private OssTemplate ossTemplate;
@Test
public void testFileUpload() throws FileNotFoundException {
String filePath = ossTemplate.upload("1.jpg", new FileInputStream("D:/upload/1.jpg"));
log.info("文件上传完毕之后的路径{}", filePath);
}
}
以上就是对于文件上传的一些配置类与测试案例源码。