之前我问了这样的事情,但是在重新阅读我原来的帖子后,要理解我真正的问题并不容易。我有以下情况。我们(或者至少我试图开始工作)一个自定义文件上传程序将接收文件,一定数量的“已知”元数据值(并且它们将始终存在),以及可能是未知的其他元数据值的数量。当前存在的服务使用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注释没有简单的方法,就像我之前的例子一样。
基于与Jersey文件上传相关的各种互联网搜索,我试图将其转换为使用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()'的数据,以获得我想要的东西;我认为那里不会有问题。
我 AM 相当困惑的是如何在jersey框架中使用第二种方法时格式化请求客户端代码。任何人都可以为这种情况提供一些指导,或者有关如何进行的一些建议?我正在考虑尝试解决方案提出here并开发一个自定义xml适配器来处理这种情况,并发送xml而不是multipart-form-data但我仍然感到困惑,这将如何与InputStream值进行交互需要通过。看来我见过的MultivaluedMap示例只处理String数据。