跳到主要内容

swagger文件上传问题

问题出现版本:

        <springdoc-openapi-ui.version>1.7.0</springdoc-openapi-ui.version>
<knife4j.version>4.3.0</knife4j.version>
<!--https://doc.xiaominfo.com/docs/quick-start-->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-openapi3-spring-boot-starter</artifactId>
<version>${knife4j.version}</version>
</dependency>

<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-ui</artifactId>
<version>${springdoc-openapi-ui.version}</version>
</dependency>

后端上传文件的逻辑:

    // 上传文件
@PostMapping(value = "/upload")
public BaseResponse<String> upload(@RequestPart("file") MultipartFile file) {
xxx
}

然而这样我们使用umi的openapi插件生成的代码,会变成json

/** 此处后端没有提供注释 POST /minio/upload */
export async function upload(body: {}, options?: { [key: string]: any }) {
return request<API.BaseResponseString>('/minio/upload', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || {}),
});
}

前端显示的时候也是json

image-20240729215952013

要想解决这个问题,只要修改如下consumes = MediaType.MULTIPART_FORM_DATA_VALUE

@PostMapping(value = "/upload",consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public BaseResponse<String> upload(@RequestPart("file") MultipartFile file) {
xxx
}

此时生成的ts接口代码也有了文件:

/** 此处后端没有提供注释 POST /minio/upload */
export async function upload(body: {}, file?: File, options?: { [key: string]: any }) {
const formData = new FormData();

if (file) {
formData.append('file', file);
}

Object.keys(body).forEach((ele) => {
const item = (body as any)[ele];

if (item !== undefined && item !== null) {
if (typeof item === 'object' && !(item instanceof File)) {
if (item instanceof Array) {
item.forEach((f) => formData.append(ele, f || ''));
} else {
formData.append(ele, JSON.stringify(item));
}
} else {
formData.append(ele, item);
}
}
});

return request<API.BaseResponseString>('/minio/upload', {
method: 'POST',
data: formData,
requestType: 'form',
...(options || {}),
});
}