本地存储
服务端接受文件
java
@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确保保存到本地的文件名不会冲突
java
@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
bash
spring:
servlet:
#文件上传配置
multipart:
#单个文件最大值
max-file-size: 10MB
#单次请求最大值
max-request-size: 100MB
OSS
问题:1.保存在服务器本地磁盘中的文件,在浏览器端无法直接去访问
2.服务器磁盘容量有限
3.服务器磁盘坏了就炸了
中小型项目可以使用云服务商提供的相关服务--阿里云对象存储OSS

第三方服务使用思路

OSS使用步骤


文件上传工具类
java
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/MM
String 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;
}
}
文件上传控制器
java
@Slf4j
@RestController
public class UploadController {
@Autowired
private 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文件里
java
@Value("${aliyun.oss.endpoint}")
private String endpoint;
@Value("${aliyun.oss.bucket-name}")
private String bucketName;
@Value("${aliyun.oss.region}")
private String region;
bash
aliyun:
oss:
#阿里云OSS配置
endpoint: https://oss-cn-beijing.aliyuncs.com
bucket-name: xxxxx
region: cn-beijing
@ConfigurationProperties注解,封装配置,一起注入到属性
