我以前问过这样的问题,但是在重新阅读我的原始帖子时,很难理解我真正问的是什么。我有以下情况。我们有(或者至少我正在尝试开始工作)一个自定义文件上传程序,该程序将接收文件、一组“已知”元数据值(并且它们将永远存在),以及潜在的未知附加元数据值的数量。当前存在的服务使用 Jersey 框架(1.16)
我目前有处理文件上传部分和已知元数据值的客户端和服务器代码(下面的服务器代码)
@POST
@Path("asset/{obfuscatedValue0}/")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public UUID uploadBlob(@PathParam("obfuscatedValue0") Integer obfuscatedValue0,
@FormDataParam("obfuscatedValue1") String obfuscatedValue1,
@FormDataParam("obfuscatedValue2") String obfuscatedValue2,
@FormDataParam("obfuscatedValue3") String obfuscatedValue3,
@FormDataParam("obfuscatedValue4") String obfuscatedValue4,
@FormDataParam("obfuscatedValue5") String obfuscatedValue5,
@FormDataParam("file") InputStream uploadedInputStream) {
.....
}
...以及客户端代码的摘录:
Builder requestBuilder = _storageService
.path("asset")
.path(obfuscatedValue0.toString())
.type(MediaType.MULTIPART_FORM_DATA)
.accept(MediaType.APPLICATION_JSON);
FormDataMultiPart part = new FormDataMultiPart()
.field("file", is, MediaType.TEXT_PLAIN_TYPE) // 'is' is an inputstream from earlier in code.
.field("obfuscatedValue1", obfuscatedValue1)
.field("obfuscatedValue2", obfuscatedValue2)
.field("obfuscatedValue3", obfuscatedValue3)
.field("obfuscatedValue4", obfuscatedValue4)
.field("obfuscatedValue5", obfuscatedValue5);
storedAsset = requestBuilder.post(UUID.class, part);
但是,我需要传递一个包含未知数量的值/名称的附加参数的映射。从我所见,没有像我之前的示例那样使用 FormDataParam 注释的简单方法。
基于与泽西岛文件上传相关的各种互联网搜索,我尝试将其转换为使用 MultivaluedMap 并将内容类型设置为“application/x-www-form-urlencoded”,因此它类似于:
@POST
@Path("asset/{value}/")
@Consumes("application/x-www-form-urlencoded")
public UUID uploadBlob(@PathParam(value), MultivaluedMap<String,String> formParams) {
....
}
我的理解是 MultivaluedMap 旨在获取表单参数的一般映射(因此,不能在带有 @FormDataParam 注释的同一方法中很好地协同工作。)如果我可以在某种映射中从客户端传递所有这些信息,我想我可以弄清楚如何处理解析地图以获取数据并在数据上执行“doMagic()”以完成我想要完成的事情;我认为我在那里不会有问题。
我相当困惑的是在球衣框架中使用第二种方法时如何格式化请求客户端代码。任何人都可以为这种情况提供一些指导,或者就如何进行一些建议?我正在考虑尝试这里提出的解决方案并开发一个自定义 xml 适配器来处理这种情况,并发送 xml 而不是 multipart-form-data 但我仍然很困惑这将如何与需要的 InputStream 值交互通过了。我见过的 MultivaluedMap 示例似乎只处理字符串数据。