使用 Postman 上传二进制类型的图片到后端接口写法

我们有的时候会有需求,就是通过 postman 传递二进制图片到后端接口,如下图:

在这里插入图片描述

那我们的 Java 接口需要怎么写呢?

Spring Boot 接收这些数据的方式需要使用 @RequestBody 注解来处理原始的二进制数据(byte[])。

1. 使用 @RequestBody 接收二进制数据

如果在 Postman 中选择了 binary,那么将直接上传文件的二进制数据。可以在 Spring Boot 中通过 @RequestBody 来接收这些二进制数据,并将其保存为文件。

2. Controller 代码示例

下面是一个简单的 Spring Boot 控制器,用于接收 Postman 上传的图片并保存到本地磁盘:

import org.springframework.web.bind.annotation.*;
import org.springframework.http.ResponseEntity;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

@RestController
@RequestMapping("/api/upload")
public class FileUploadController {

    private static final String UPLOAD_DIR = "uploads/";

    @PostMapping("/image")
    public ResponseEntity<String> uploadImage(@RequestBody byte[] fileBytes) {
        // 判断文件是否为空
        if (fileBytes.length == 0) {
            return ResponseEntity.badRequest().body("No file uploaded");
        }

        try {
            // 保存文件到服务器指定路径(这里假设保存为 uploaded_image.jpg)
            File dest = new File(UPLOAD_DIR + "uploaded_image.jpg");

            // 确保目标目录存在
            dest.getParentFile().mkdirs();

            // 写入文件
            try (FileOutputStream fos = new FileOutputStream(dest)) {
                fos.write(fileBytes);
            }

            return ResponseEntity.ok("File uploaded successfully: " + dest.getName());
        } catch (IOException e) {
            return ResponseEntity.status(500).body("File upload failed: " + e.getMessage());
        }
    }
}

3. 详细说明

  1. @RequestBody byte[] fileBytes:

    • @RequestBody 用于接收请求体中的数据,Postman 发送的二进制数据将被自动映射为 byte[] 数组。
  2. 保存文件:

    • 文件会被保存到 uploads/ 目录下,可以根据需要修改保存路径和文件名。
    • 如果目标文件夹不存在,会自动创建。
  3. 返回响应:

    • 如果文件上传成功,会返回 “File uploaded successfully”。
    • 如果上传失败,会返回错误信息。
  4. 配置文件上传大小(可选)

    • 如果你的文件比较大,可以在 application.properties 或 application.yml 中设置上传文件的最大大小。例如:
# 设置文件上传的最大大小
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB

扩展:

我使用 postman 传二进制类型图片到后端的时候遇到一个坑,可以参考这篇文章 - 《使用 postman 传递 binary 类型的图片到后端接口遇到的坑》


扩展:

前端如何传递二进制图片到后端接口?

info 是使用 Antd 的 Upload 的 Dragger 的 onChange 回调参数,参考 Antd 官方文档 - Upload 上传

const updateLoad = (info) => {
    const file = info.file;

    // 使用 FileReader 来读取文件为二进制数据
    const reader = new FileReader();

    reader.onload = () => {
      // 获取二进制数据(ArrayBuffer)
      const binaryData = reader.result;
	  sendRequest(binaryData).then((res) => {
          if (res) {
            setUploadFile(res);
          }
      }).catch((err) => {
          showErrorMsg(err);
      });
    };

    // 读取文件为 ArrayBuffer(二进制)
    reader.readAsArrayBuffer(file);
  }
<think>好的,用户之前问过如何使用EasyExcel导入Excel文件,现在他们遇到了“没有读取到文件”的问题。我需要分析可能的原因并提供解决方案。首先,用户提到的问题可能出现在前端或后端。前端可能没有正确上传文件,比如表单的enctype不是multipart/form-data,或者文件字段名和后端不一致。后端方面,可能没有正确处理MultipartFile,或者文件流读取有问题。 接下来,我需要考虑用户的实际使用场景。他们可能是在Spring Boot应用中实现文件上传功能,可能经验不足,遇到问题不知道如何排查。用户的需求是解决文件读取不到的问题,但深层需求可能是确保整个上传流程正确无误,包括前后端配置和错误处理。 常见的错误点包括:前端表单配置错误,后端Controller参数不正确,文件处理时的异常未被捕获,或者文件路径问题。例如,用户可能忘记添加@RequestParam注解,或者参数名不匹配。另外,Spring Boot可能需要配置multipart文件大小限制,否则大文件上传会失败。 需要分步骤解答,从前后端可能的错误点逐一排查。首先检查前端表单,确保enctype和方法正确;然后检查后端Controller,确认参数绑定是否正确,是否有处理异常;接着查看日志,是否有相关错误信息;最后考虑服务器配置,比如文件大小限制或临时目录权限。 还要提醒用户使用工具测试接口,比如Postman,排除前端问题。同时,提供代码示例,帮助用户对照检查自己的代码是否正确。例如,确保Controller方法参数有@RequestParam,并且正确处理IOException。 可能用户没有处理异常导致的问题被忽略,或者文件流未正确关闭。此外,临时目录权限可能导致文件无法保存,需要检查服务器配置。总之,需要系统地从各个可能环节进行排查,并提供具体的解决方案和代码示例,帮助用户解决问题。</think>以下是解决 **EasyExcel 无法读取上传文件** 的常见原因及排查方案: --- ### **一、前端问题排查** #### 1. 检查表单提交方式 ```html <!-- 错误示例(缺少 enctype) --> <form method="post" action="/upload"> <input type="file" name="file"> <!-- 正确写法 --> <form method="post" action="/upload" enctype="multipart/form-data"> <input type="file" name="file"> <!-- 确保 name="file" 与后端参数名一致 --> ``` #### 2. 使用 Postman 测试接口 通过 Postman 发送请求,排除前端代码问题: 1. 选择 `POST` 方法 2. Body 选择 `form-data` 3. Key 填写 `file` (与后端 `@RequestParam("file")` 一致) 4. 选择文件上传 --- ### **二、后端问题排查** #### 1. 检查 Controller 参数绑定 ```java // 错误示例(缺少 @RequestParam) public ResponseEntity<String> uploadExcel(MultipartFile file) // 正确写法 public ResponseEntity<String> uploadExcel(@RequestParam("file") MultipartFile file) ``` #### 2. 验证文件是否为空 ```java @PostMapping("/upload") public ResponseEntity<String> uploadExcel(@RequestParam("file") MultipartFile file) { if (file.isEmpty()) { // 关键检查 return ResponseEntity.badRequest().body("文件不能为空"); } // ...后续处理 } ``` #### 3. 检查文件流关闭问题 ```java try (InputStream inputStream = file.getInputStream()) { // 自动关闭资源 EasyExcel.read(inputStream, User.class, listener).sheet().doRead(); } ``` --- ### **三、服务器配置问题** #### 1. Spring Boot 文件大小限制 在 `application.properties` 中调整: ```properties # 默认限制为 1MB,需根据实际情况调整 spring.servlet.multipart.max-file-size=10MB spring.servlet.multipart.max-request-size=10MB ``` #### 2. 临时存储目录权限 检查服务器临时目录(通过 `System.getProperty("java.io.tmpdir")` 获取)是否有写入权限。 --- ### **四、日志分析** #### 1. 开启 DEBUG 日志 在 `application.properties` 中添加: ```properties logging.level.org.springframework.web=DEBUG logging.level.com.alibaba.excel=DEBUG ``` #### 2. 典型错误日志分析 | 日志内容 | 解决方案 | |---------|---------| | `FileNotFoundException` | 检查文件路径是否正确 | | `MultipartException: Current request is not a multipart request` | 检查前端表单 enctype | | `FileSizeLimitExceededException` | 调整 `max-file-size` 配置 | --- ### **五、代码完整示例** ```java @PostMapping("/upload") public ResponseEntity<String> uploadExcel( @RequestParam("file") @NonNull MultipartFile file) { // 使用@NonNull注解 try { if (file.isEmpty()) { return ResponseEntity.badRequest().body("上传文件为空"); } UserDataListener listener = new UserDataListener(); try (InputStream inputStream = file.getInputStream()) { EasyExcel.read(inputStream, User.class, listener) .sheet() .doRead(); } return ResponseEntity.ok("成功导入数据:" + listener.getData().size()); } catch (IOException e) { return ResponseEntity.internalServerError().body("文件处理失败: " + e.getMessage()); } } ``` --- ### **六、高级调试技巧** 1. **断点位置**: - `file.isEmpty()` 判断处 - `file.getInputStream()` 调用处 - `AnalysisEventListener` 的 `invoke()` 方法 2. **二进制验证**: ```java // 检查文件头判断是否真的是Excel文件 byte[] header = new byte[4]; file.getInputStream().read(header); if (!Arrays.equals(header, new byte[]{0x50, 0x4B, 0x03, 0x04})) { throw new IllegalArgumentException("非标准Excel文件"); } ``` --- 通过以上步骤可系统性定位问题根源,建议使用 **Postman + 日志分析 + 断点调试** 三结合的方式排查。如果问题仍未解决,可检查防火墙设置或Nginx反向代理配置是否拦截了大文件请求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值