大家好,这里是盛码笔记。本篇主要关于用java实现文件上传的功能。
(一)传输数据的方式
1. none(无)
含义:不发送请求体。常用于:GET 请求、DELETE 请求或其他不需要请求体的场景。默认 GET 请求不需要 body。
2. form-data(表单数据,multipart/form-data)
含义:以 multipart/form-data 格式发送数据。每个字段会被分开,适合包含文件上传。结构:键值对,每个字段都可以是文本或文件。常用于:
文件上传(图片、文档等)表单提交(比如注册表单) 类似 HTML 表单 enctype="multipart/form-data"
3. x-www-form-urlencoded(表单编码)
含义:以 URL 编码的格式发送数据,类似查询参数:key1=value1&key2=value2结构:键值对常用于:
提交简单表单后端是 PHP、Java Servlet 等传统服务的表单接口 常用于登录注册接口(很多网站后台默认支持这种)
4. raw(原始数据)
含义:发送原始文本,可以是 JSON、XML、Text、JavaScript、HTML 等格式结构:开发者自由输入内容,并手动设置 Content-Type常用于:
RESTful API(如发送 JSON 对象)GraphQL 查询 需要手动设置 Content-Type,如 application/json
示例 JSON 请求体:
{
"username": "admin",
"password": "123456"
}
5. binary(二进制数据)
含义:直接发送二进制文件数据。常用于:
上传文件(如图片、PDF、音频等)文件流传输(服务器直接读取字节流) 需配合设置 Content-Type,如 application/octet-stream
6. GraphQL
含义:专门用于发送 GraphQL 查询。结构:分为两个字段:
query:GraphQL 查询语句variables:可选变量对象 常用于:调用支持 GraphQL 接口的服务器(如 GitHub GraphQL API)
类型内容格式常见用途none无GET、DELETEform-data键值对 + 文件表单、上传图片等x-www-form-urlencodedkey=value登录、简单表单提交raw自定义(如 JSON)REST API 通信binary文件字节流上传文件GraphQLGraphQL 查询GraphQL 接口调用
(二)文件上传
文件上传指将本地视频、图片、音频等上传到服务器,供其他用户浏览或下载的过程。
注意:数据类型要选择"multipart/form-data"才能传输数据
本地存储
本地存储是指将上传的资源存储到服务器本地目录下
@RestController
public class FileController {
@PostMapping("/upload")
public String upload(String username, Integer age, MultipartFile image) throws IOException {
// 1.获取原始文件名
String originalFilename = image.getOriginalFilename();
// 2.构造唯一的文件名(不重复)
int index = originalFilename.lastIndexOf(".");
String extendName = originalFilename.substring(index);
String newFileName = UUID.randomUUID().toString() + extendName;
// 3.保存到服务器磁盘目录中
image.transferTo(new File("D:\\test\\" + newFileName));
return "success";
}
}
springboot中,文件上传允许单个文件最大为1MB,如果需要上传大文件。需要进行如下配置:
# 配置上传单个文件大小限制
spring.servlet.multipart.max-file-size= 10MB
# 配置单次请求上传文件大小限制(一次请求可以上传多个文件)
spring.servlet.multipart.max-request-size= 100MB
云存储
云存储是通过互联网将数据存储在远程服务器上,提供可扩展、灵活的数据存取服务。
以下用阿里云OSS为例
官方参考文档OSS Java SDK_对象存储(OSS)-阿里云帮助中心
导入依赖
配置文件
aliyun.oss.endpoint=your-oss-endpoint
aliyun.oss.accessKeyId=your-access-key-id
aliyun.oss.accessKeySecret=your-access-key-secret
aliyun.oss.bucketName=your-bucket-name
创建OSS配置类
为了方便管理OSS客户端,你可以创建一个配置类来初始化OSSClient。
@Configuration
public class OssConfig {
@Value("${aliyun.oss.endpoint}")
private String endpoint;
@Value("${aliyun.oss.accessKeyId}")
private String accessKeyId;
@Value("${aliyun.oss.accessKeySecret}")
private String accessKeySecret;
@Bean
public OSS ossClient() {
return new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
}
}
实现文件上传功能
创建一个服务类或直接在控制器中实现文件上传逻辑。
@RestController
public class FileUploadController {
@Autowired
private OSS ossClient;
@Value("${aliyun.oss.bucketName}")
private String bucketName;
@PostMapping("/upload")
public ResponseEntity
try {
// 确保文件不为空
if (file.isEmpty()) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("文件为空");
}
// 文件名
String fileName = file.getOriginalFilename();
// 创建PutObject请求
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, fileName, file.getInputStream());
ossClient.putObject(putObjectRequest);
return ResponseEntity.ok("文件上传成功");
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("文件上传失败");
}
}
}