quarkus文件上传报415问题

quarkus文件上传报415问题


问题描述

入参:


import org.jboss.resteasy.annotations.jaxrs.FormParam;

@Data
public class FormData {

    @FormParam("file")
    @PartType(MediaType.APPLICATION_OCTET_STREAM)
    public InputStream file;

    @FormParam("fileName")
    @PartType(MediaType.TEXT_PLAIN)
    public String fileName;
}

请求resource

import org.jboss.resteasy.annotations.providers.multipart.MultipartForm;

@Path("/upload")
@Tag(name = "ChatGPTResource", description = "chatGPT相关接口")
@RunOnVirtualThread
public class UploadResource {

    @Inject
    ChatGPTFileService chatGPTFileService;

    @Path("/image")
    @POST
    @Operation(summary = "/image", description = "上传图片")
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    @Produces(MediaType.APPLICATION_JSON)
    public BaseResponse<Boolean> uploadImage(@MultipartForm FormData formData) {
        InputStream inputStream = formData.file;
        return BaseResponse.success(true);
    }
}

这样的话就可能会报一个http 415的问题

原因分析:

HTTP 415 错误状态码表示“Unsupported Media Type”,即服务器无法处理请求中所包含的数据格式或媒体类型。当客户端(如Web浏览器、移动应用或者API客户端,如Postman)向服务器发送一个请求,但请求体的内容类型(Content-Type)与服务器期望接收的不匹配时,服务器会返回这个错误。

具体引起415问题的可能原因,感兴趣可以自己百度一下,我们这里的原因是字段类型不对,准确地说应该是导入的@FormParam注解不对 不应该用org.jboss.resteasy.annotations.jaxrs.FormParam;
得用 jakarta.ws.rs.FormParam;


解决方案:

把 FormData 实体的

import org.jboss.resteasy.annotations.jaxrs.FormParam;

改成

import jakarta.ws.rs.FormParam;

PS:

如果项目中添加了过滤器 filter 的话检查一下是否处理了请求参数,例如:

 // 读取请求体并保存到成员变量中
 InputStream entityStream = requestContext.getEntityStream();
 String requestParams = readInputStream(entityStream);
 // 将请求体重新放入输入流,以便后续资源方法可以读取
 requestContext.setEntityStream(new ByteArrayInputStream(requestParams.getBytes()));
 requestContext.setProperty("requestParams", requestParams);

这段代码只能处理 application/json 类型的参数无法处理 multipart/form-data 类型的参数,如果过滤器中有这种入参处理的话会出现报报错Connection terminated parsing multipart request(连接已终止解析多部分请求),解决方案就是不要在过滤器里处理 multipart/form-data 类型的请求入参。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值