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 类型的请求入参。