此处有一些链接建议使用multipart/form-data
以及如何在此处上传文件。对于通过CURL命令上传到接收FormDataMultiPart
的REST服务的多个文件的组合,实际上找不到一个。
当前服务中的代码如下:
@javax.ws.rs.POST
@javax.ws.rs.Path("/sample-bulk")
@javax.ws.rs.Consumes(javax.ws.rs.core.MediaType.MULTIPART_FORM_DATA)
public javax.ws.rs.core.Response bulkUpload(@FormDataParam("file") org.glassfish.jersey.media.multipart.FormDataMultiPart multiPart) {
log.info("{} log", multiPart.getField("file"));
return Response.ok().build();
}
我尝试调用该服务的CURL为:
卷曲-X POST “ http://localhost:37200/api/sample-bulk” -H“接受:应用程序/ json” -H“内容类型:多部分/表单数据” -F“文件= @ /用户/ naman /桌面/媒体/video.mp4;类型=视频/ mp4”
但这会导致multiPart
在服务中心null
当然是NPE。
我在这里错过了任何愚蠢的事情吗?
答案 0 :(得分:2)
问题出在方法参数上(@FormDataParam
的存在)
public Response bulkUpload(@FormDataParam("file") FormDataMultiPart multiPart) {}
@FormDataParam
用于从多部分请求中声明性地提取单个部分,而FormDataMultiPart
用于获取整个多部分主体并以编程方式< / em>提取每个部分。 It's possible具有嵌套的多部分,其中完整的多部分是一个单独的部分(在这种情况下,您可以使用的部分),但是这里不是这种情况。
如果您删除@FormDataParam("file")
,则它将按预期工作。您可以使用getField(fieldName)
的方法开始从多部分中提取部分。这将为您提取的每个部分提供FormDataBodyPart
。如果希望将该部分作为FormDataBodyPart#getValueAs(InputStream.class)
,则可以使用InputStream
获取数据,也可以使用File.class
或byte[].class
,无论您喜欢什么。这是从FormDataMultiPart
中提取数据的方法。
每个部分都有其自己的名称,然后使用该名称提取该部分。对于您的cURL请求,您发送了一部分,该部分的名称为file
。即"file=@/Users/..."
。因此,如果要发送另一部分,只需添加另一个名称as mentioned by Vladimir:
curl -X POST "http://localhost:37200/api/sample-bulk"\
-H "accept: application/json"\
-H "Content-Type: multipart/form-data"\
-F "file1=@/Users/naman/Desktop/Media/video.mp4"\
-F "file2=@/Users/naman/Desktop/Media/another_video.mp4"
正如我之前提到的,@FormDataParam
用于声明性提取部分。您可以使用零件名称作为注释值。因此,使用前面的cURL命令,您可以做到。
public Response bulkUpload(
@FormDataParam("file1") InputStream file1,
@FormDaraParam("file1") FormDataContentDisposition file1Fdcd,
@FormDataParam("file2") InputStream file2,
@FormDaraParam("file2") FormDataContentDisposition file2Fdcd) {
}
您可以从FormDataContentDisposition
获取有关零件的信息,例如文件名。
答案 1 :(得分:1)
Use this parameter
public Response uploadFile(@FormDataParam("files") List<FormDataBodyPart> file)
Use for loop
for (int j = 0; j < files.size(); j++) {
FormDataBodyPart this_formDataBodyPartFile = files.get(j);
ContentDisposition this_contentDispositionHeader = this_formDataBodyPartFile
.getContentDisposition();
InputStream this_fileInputStream = this_formDataBodyPartFile.getValueAs(InputStream.class);
FormDataContentDisposition fileDetail = (FormDataContentDisposition) this_contentDispositionHeader;
//Write the code upload code }
答案 2 :(得分:0)
尝试对每个多部分条目使用单独的-F标志,诸如此类:
卷曲-X POST “ http://localhost:37200/api/sample-bulk” -H“接受:应用程序/ json” -H“内容类型:多部分/表单数据” -F“文件= @ /用户/ naman /桌面/媒体/video.mp4” -F“类型=视频/ mp4”