Java实现文件上传

Java实现文件上传

大家好,这里是盛码笔记。本篇主要关于用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"才能传输数据

Title

action="/upload"

method="post"

enctype="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)-阿里云帮助中心

导入依赖

com.aliyun.oss

aliyun-sdk-oss

3.17.4

javax.xml.bind

jaxb-api

2.3.1

javax.activation

activation

1.1.1

org.glassfish.jaxb

jaxb-runtime

2.3.3

配置文件

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 uploadFile(@RequestParam("file") MultipartFile file) throws IOException {

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("文件上传失败");

}

}

}

相关推荐

四、各具特色的草原类型
在线365bet盘口

四、各具特色的草原类型

📅 08-25 👁️ 4954
《光遇》鳐鲲位置及刷新时间介绍
365bet365用址

《光遇》鳐鲲位置及刷新时间介绍

📅 09-22 👁️ 6985
轻松掌握时间艺术:浪琴手表日期与时间设置指南
在线365bet盘口

轻松掌握时间艺术:浪琴手表日期与时间设置指南

📅 07-23 👁️ 3021