gpt4 book ai didi

将多部分表单数据发布到 seam+RESTeasy 无法编码到 InputStream

转载 作者:行者123 更新时间:2023-12-03 17:56:08 24 4
gpt4 key购买 nike

我正在尝试将图像数据发布到 seam+RESTeasy 端点,但在 JBoss 启动期间遇到了一个非常神秘的错误。我发送的 HTTP 请求的内容类型为 multipart/form-data,它有一个名为“attachment”的图像/jpeg 部分。我的服务方法如下所示:

@POST
@Path("uploadSymptomsImage/{appointmentGUID}")
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces("application/json")
public String uploadSymptomsImage( @FormParam("attachment") InputStream fileInputStream,
@PathParam("appointmentGUID") String strAppointmentGUID )
{ ...

我得到的错误是在启动期间:
Caused by: java.lang.RuntimeException: Unable to find a constructor that takes a String param or a valueOf() or fromString() method for javax.ws.rs.FormParam("attachment") on public java.lang.String com....AppointmentRestService.uploadSymptomsImage(java.io.InputStream,java.lang.String) for basetype: java.io.InputStream
at org.jboss.resteasy.core.StringParameterInjector.initialize(StringParameterInjector.java:206) [:]
at org.jboss.resteasy.core.StringParameterInjector.<init>(StringParameterInjector.java:57) [:]
at org.jboss.resteasy.core.FormParamInjector.<init>(FormParamInjector.java:22) [:]

我的理解是媒体类型可以自动编码到 InputStream。我也试过 java.io.File, java.io.Reader - 两者都有相同的错误。当我用 byte[] 或 String 替换时,我得到一个零长度数组,或 null 作为参数值。

你会如何调试这个?另外,是否可以访问原始请求或预编码的值?

这里的任何建议将不胜感激。

最佳答案

您应该使用 MultipartFormDataInput 检索内容.请参阅以下示例:

@POST
@Path("uploadSymptomsImage/{appointmentGUID}")
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces("application/json")
public String uploadSymptomsImage(@PathParam("appointmentGUID") String strAppointmentGUID,
MultipartFormDataInput formData) {

Map<String, List<InputPart>> formDataMap = formData.getFormDataMap();

List<InputPart> attachments = formDataMap.get("attachment");
for(InputPart attachment : attachments) {
String fileName = extractFilename(attachment);
if(fileName.isEmpty()) continue;
InputStream in = attachment.getBody(new GenericType<InputStream>() {});
// Interact with stream
}

// Respond
}

extractFilename 方法是一个辅助方法 I wrote :
private static String extractFilename(final InputPart attachment) {
Preconditions.checkNotNull(attachment);
MultivaluedMap<String, String> headers = attachment.getHeaders();
String contentDispositionHeader = headers.getFirst("Content-Disposition");
Preconditions.checkNotNull(contentDispositionHeader);

for(String headerPart : contentDispositionHeader.split(";(\\s)+")) {
String[] split = headerPart.split("=");
if(split.length == 2 && split[0].equalsIgnoreCase("filename")) {
return split[1].replace("\"", "");
}
}

return null;
}

关于将多部分表单数据发布到 seam+RESTeasy 无法编码到 InputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11253305/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com