文件上传
约 564 字大约 2 分钟
2025-03-04
前端表单中文件上传代码,选择enctype="multipart/form-data"
<form action="/upload" method="post" enctype="multipart/form-data">
姓名: <input type="text" name="username"><br>
年龄: <input type="text" name="age"><br>
头像: <input type="file" name="image"><br>
<input type="submit" value="提交">
</form>
1. 本地存储
后端Controller层,使用UUID重新生成文件名,将文件存储到固定磁盘目录中。
@RequestMapping("/upload")
public Result upload(String username, Integer age, MultipartFile image) throws Exception {
log.info("username=" + username + ",age=" + age + ",image=" + image);
// 获取文件名
String originalFilename = image.getOriginalFilename();
// 使用UUID重新生成文件名
int index = originalFilename.lastIndexOf(".");
String newName = UUID.randomUUID().toString() + originalFilename.substring(index);
// 将文件存储到固定磁盘目录中
image.transferTo(new File("F:\\LovMay\\JAVA_Web\\images\\" + newName));
return Result.success();
}
配置文件上传大小限制
# 配置单个文件上传大小限制,默认为1MB
spring.servlet.multipart.max-file-size=10MB
# 配置单个请求最大大小限制,默认为10MB
spring.servlet.multipart.max-request-size=100MB
2. 阿里云OSS
- 构建阿里云 OSS 工具类AliOSSUtils,使用自己的accessKeyId、accessKeySecret、bucketName。
package com.ham.utils;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.util.UUID;
/**
* 阿里云 OSS 工具类
*/
public class AliOSSUtils {
private String endpoint = "*";
private String accessKeyId = "*";
private String accessKeySecret = "*";
private String bucketName = "*";
/**
* 实现上传图片到OSS
*/
public String upload(MultipartFile file) throws IOException {
// 获取上传的文件的输入流
InputStream inputStream = file.getInputStream();
// 避免文件覆盖
String originalFilename = file.getOriginalFilename();
String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));
//上传文件到 OSS
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
ossClient.putObject(bucketName, fileName, inputStream);
//文件访问路径
String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;
// 关闭ossClient
ossClient.shutdown();
return url;// 把上传到oss的路径返回
}
}
将工具类的参数分离到application.yml
# 阿里云oss相关配置 aliyun: oss: endpoint: * accessKeyId: * accessKeySecret: * bucketName: *
使用
@Value
注解,${key}
注入properties中的配置
@Value("${aliyun.oss.endpoint}")
private String endpoint;
@Value("${aliyun.oss.accessKeyId}")
private String accessKeyId;
@Value("${aliyun.oss.accessKeySecret}")
private String accessKeySecret;
@Value("${aliyun.oss.bucketName}")
private String bucketName;
避免多次使用@Value
注解,将参数封装,上传到Spring容器,并使用@ConfigurationProperti
注解,其参数prefix添加前缀补充完整key,后续使用时注入该类并用get方法获取参数即可
@Data
@Component
@ConfigurationProperties(prefix = "aliyun.oss")
public class AliOSSProperties {
private String endpoint;
private String accessKeyId;
private String accessKeySecret;
private String bucketName;
}
可以添加如下依赖,使得配置时有提示:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>