学习笔记--文件上传
本地存储
服务端接受文件
@Slf4j
@RestController
public class UploadController {@PostMapping("/upload")public Result upload(String name,Integer age,MultipartFile file) {log.info("文件上传:{},{},{}",name,age,file);return Result.success();}
}
使用UUID确保保存到本地的文件名不会冲突
@Slf4j
@RestController
public class UploadController {@PostMapping("/upload")public Result upload(String name,Integer age,MultipartFile file) throws IOException {log.info("文件上传:{},{},{}",name,age,file);//获取文件原始名称String originalFilename = file.getOriginalFilename();String newFileName = UUID.randomUUID().toString()+"."+originalFilename.substring(originalFilename.lastIndexOf("."));//保存文件file.transferTo(new File("/home/feitwnd/下载/"+ newFileName));return Result.success();}
}
配置文件上传大小限制
application.yml
spring:servlet:#文件上传配置multipart:#单个文件最大值max-file-size: 10MB#单次请求最大值max-request-size: 100MB
OSS
问题:1.保存在服务器本地磁盘中的文件,在浏览器端无法直接去访问
2.服务器磁盘容量有限
3.服务器磁盘坏了就炸了
中小型项目可以使用云服务商提供的相关服务--阿里云对象存储OSS
第三方服务使用思路
OSS使用步骤
文件上传工具类
package cc.feitwnd.utils;import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
import com.aliyun.oss.common.comm.SignVersion;
import org.springframework.stereotype.Component;
import java.io.ByteArrayInputStream;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.UUID;@Component
public class AliyunOSSOperator {private String endpoint = "https://oss-cn-beijing.aliyuncs.com";private String bucketName = "";private String region = "cn-beijing";public String upload(byte[] content, String originalFilename) throws Exception {// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();// 填写Object完整路径,例如202406/1.png。Object完整路径中不能包含Bucket名称。//获取当前系统日期的字符串,格式为 yyyy/MMString dir = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy/MM"));//生成一个新的不重复的文件名String newFileName = UUID.randomUUID() + originalFilename.substring(originalFilename.lastIndexOf("."));String objectName = dir + "/" + newFileName;// 创建OSSClient实例。ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);OSS ossClient = OSSClientBuilder.create().endpoint(endpoint).credentialsProvider(credentialsProvider).clientConfiguration(clientBuilderConfiguration).region(region).build();try {ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(content));} finally {ossClient.shutdown();}return endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + objectName;}}
文件上传控制器
@Slf4j
@RestController
public class UploadController {@Autowiredprivate AliyunOSSOperator aliyunOSSOperator;@PostMapping("/upload")public Result upload(MultipartFile file) throws Exception {log.info("文件上传:{}",file.getOriginalFilename());//将文件交给OSS存储管理String url = aliyunOSSOperator.upload(file.getBytes(),file.getOriginalFilename());log.info("文件访问地址:{}",url);return Result.success(url);}
}
程序优化
利用注解,将这些配置写在yml文件里
@Value("${aliyun.oss.endpoint}")private String endpoint;@Value("${aliyun.oss.bucket-name}")private String bucketName;@Value("${aliyun.oss.region}")private String region;
aliyun:oss:#阿里云OSS配置endpoint: https://oss-cn-beijing.aliyuncs.combucket-name: xxxxxregion: cn-beijing
@ConfigurationProperties注解,封装配置,一起注入到属性