添加pom
<!-- OSS各个项目单独加依赖,根据需要进行添加--> <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>3.10.2</version> </dependency>
配置文件添加
#阿里云OSS配置 aliyun: oss: endpoint: oss-cn-shenzhen.aliyuncs.com access-key-id: LTAI4GJR7bL8JEzBv7zx69J4 access-key-secret: CNfxHJeTTLlFQA2a2X5BprjqjK047l bucketname: xdclass-1024shop-img
中间那两个,就是生成的时候出现的,说了只出现一次的,我这里就不放出来了!
这里弄一个配置类
import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; @ConfigurationProperties(prefix = "aliyun.oss") @Configuration @Data public class OSSConfig { private String endpoint; private String accessKeyId; private String accessKeySecret; private String bucketname; }
现在完成了基本的配置,接下来我们创建一个service,一个impl类,并且在usercontroller里面尝试直接上传的操作,代码依次放出
import org.springframework.web.multipart.MultipartFile; public interface FileService { String uploadUserImg(MultipartFile file); }
import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.model.PutObjectRequest; import com.aliyun.oss.model.PutObjectResult; import lombok.extern.slf4j.Slf4j; import net.xdclass.config.OSSConfig; import net.xdclass.service.FileService; import net.xdclass.utils.CommonUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import javax.sql.rowset.serial.SerialStruct; import java.io.IOException; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; @Service @Slf4j public class FileServiceImpl implements FileService { @Autowired private OSSConfig ossConfig; @Override public String uploadUserImg(MultipartFile file) { //获取相关配置 String bucketname = ossConfig.getBucketname(); String endpoint = ossConfig.getEndpoint(); String accessKeyId = ossConfig.getAccessKeyId(); String accessKeySecret = ossConfig.getAccessKeySecret(); //创建OSS对象 OSS ossClient = new OSSClientBuilder().build(endpoint,accessKeyId,accessKeySecret); //获取原生文件名 String originalFileName = file.getOriginalFilename(); //JDK8的日期格式 _获取当前时间 LocalDateTime ldt = LocalDateTime.now(); DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd"); //拼装路径,oss上的存储的路径 2022/13/1/qweqwe.jpg String folder = dtf.format(ldt); String fileName = CommonUtil.generateUUID(); String extension = originalFileName.substring(originalFileName.lastIndexOf(".")); String newFileName = "user/"+folder+"/"+fileName+extension; try { PutObjectResult putObjectResult = ossClient.putObject(bucketname,newFileName,file.getInputStream()); //拼装返回路径 if (putObjectResult!=null){ String imgUrl = "https://"+bucketname+"."+endpoint+"/"+newFileName; return imgUrl; } } catch (IOException e) { log.error("文件上传失败:"+e); }finally { //oss关闭服务,不然回造成OOM(内存泄露) ossClient.shutdown(); } return null; } }
@Autowired private FileService fileService; /** * 上传用户头像 * @param file * @return */ @ApiOperation("用户头像上传") @PostMapping(value = "upload") public JsonData uploadUserImg( @ApiParam(value = "文件上传",required = true) @RequestPart("file")MultipartFile file){ String result = fileService.uploadUserImg(file); return result!=null?JsonData.buildSuccess(result):JsonData.buildResult(BizCodeEnum.FILE_UPLOAD_USER_IMG_FAIL); } }
三步走之后我们就已经实现了,让我们来测试一下吧
来到阿里OSS对象存储,我们可以看到,已经上传成功啦




spring: servlet: multipart: max-file-size: 30MB max-request-size: 30MB
OK,大功告成!这一波又学习了文件上传,又学习了OSS的存储!
本文作者为DBC,转载请注明。