fix: 修复升级v5.0.0导致图片上传失败的问题

- 当使用 `$.ajax`发起异步请求时 ,设置`dataType: "json"`会在请求头中自动添加`Accept: application/json`,表示客户端期望服务器返回`JSON`格式的数据。
- 当使用 `$.ajaxFileUpload` 上传文件时,它的行为与`$.ajax`不同,不会自动修改`Accept`请求头,即使设置了`dataType: "json"` `$.ajaxFileUpload`也不会在请求头中添加`Accept: application/json`。

Spring Boot 默认返回`JSON`格式的响应,但它支持内容协商,它会根据客户端请求的`Accept`头来决定返回的响应格式。如果浏览器发送的请求中
`Accept`头包含`application/xml`,并且 Spring Boot 支持`XML`格式响应的话,Spring Boot 会返`XML`格式的响应。但 Spring Boot 默认不支持`XML`格式的响应,当升级`Sharding-JDBC `版本后,自动引入了`jackson-dataformat-xml`依赖,才开始支持`XML`格式的响应,由于`$.ajaxFileUpload`上传文件的默认`Accept`头包含`application/xml`,所以需要在后端上传文件接口处明确指定返回的数据类型为`application/json`。
This commit is contained in:
xiongxiaoyang 2025-03-23 09:28:01 +08:00
parent 970ad407f1
commit 04fc8e878a

View File

@ -17,6 +17,7 @@ import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.client.utils.DateUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@ -61,11 +62,20 @@ public class FileController {
/**
* 图片上传
*
* @return
* - 当使用 `$.ajax`发起异步请求时 设置`dataType: "json"`会在请求头中自动添加`Accept: application/json`表示客户端期望服务器返回
* `JSON`格式的数据
* - 当使用 `$.ajaxFileUpload` 上传文件时它的行为与`$.ajax`不同不会自动修改`Accept`请求头即使设置了`dataType: "json"`
* `$.ajaxFileUpload`也不会在请求头中添加`Accept: application/json`
*
* Spring Boot 默认返回`JSON`格式的响应但它支持内容协商它会根据客户端请求的`Accept`头来决定返回的响应格式
* 如果浏览器发送的请求中`Accept`头包含`application/xml`并且 Spring Boot 支持`XML`格式响应的话Spring Boot 会返回`XML`格式的响应
* Spring Boot 默认不支持`XML`格式的响应当升级`Sharding-JDBC `版本后自动引入了`jackson-dataformat-xml`依赖才开始支持`XML`格式的响应
* 由于`$.ajaxFileUpload`上传文件的默认`Accept`头包含`application/xml`所以需要在后端上传文件接口处明确指定返回的数据类型为`application/json`
*
*/
@SneakyThrows
@ResponseBody
@PostMapping("/picUpload")
@PostMapping(value = "/picUpload", produces = MediaType.APPLICATION_JSON_VALUE)
RestResult<String> upload(@RequestParam("file") MultipartFile file) {
Date currentDate = new Date();
String savePath =