尝试在 Jax-RS 球衣中发送 FormData() 时的 415 状态

415 Status when trying to send FormData() in Jax-RS jersey

我正在尝试使用 jquery ajax 发送附加到 FormData 的文件。参考了一些mozilla和IBM的文档,总结如下

ajax代码:

var sessionId = $.cookie("referenceId");
var myFormData = { sessionId: sessionId,
                    cipherData: cipherData,   // Encrypted xml data
                    payslip: document.getElementById('payslip').files[0]};
var formData = new FormData();
for (var key in myFormData) {
    console.log(key, myFormData[key]);
    formData.append(key, myFormData[key]);
}
$.ajax({
    url : 'api/rootpath/childpath',
    type : 'POST',
    processData: false,
    contentType: false,    // Here the contentType is set to false, so what should I put at @Consumes in java code
    data : {
        formData: formData
    },
    success : function(data,status) {
        alert('success');
    },
    failure : function(data) {

    }
});

Java代码:

@POST
@Path("/childpath")
@Consumes(MediaType.MULTIPART_FORM_DATA)  // I tried removing it, changing it to various formats, but none worked
public Response createLoan(@FormParam("cipherData") String cipherData,@FormParam("sessionId") String sessionId,
                           @FormParam("payslip") File payslip);

我已经试了一天了。我确实通过直接提交 enctype="multipart/form-data" 的形式来接收文件,但我需要在 ajax 中完成。如果我查看 tomcat 的日志,它在访问 api/rootpath/childpath 时总是给我 415 状态代码。我认为问题是由于与原始内容类型进行比较时收到的内容类型不同。我尝试将 MediaType. 更改为 "multipart/form-data" 等,但失败了。

我认为您应该将 ajax 片段中的 contentType(目前显示 false)更改为 "multipart/form-data",因为这是 Java常数MediaType.MULTIPART_FORM_DATA

后端

415 在这种情况下不受支持很可能意味着没有可用于处理多部分的提供程序

多部分支持未标准化。您将需要添加特定于实现的依赖项,可能(取决于实现),配置支持,并使用特定于实现的多部分注释(它不是 @FormaParam,用于 x-www-form-urlencoded 数据),或其他一些多部分对象。

不同的支持文档和示例

前端

一堆不同的例子可以found here

好的,终于弄清楚我的错误了。我希望这个答案对以后希望在 JAX-RS

中使用 ajax 上传文件的访问者有很大帮助

Ajax代码:

var myFormData = { sessionId: sessionId,
                    cipherData: cipherData,   // encrypted xmlData
                    payslip: document.getElementById('payslip').files[0]};
var formData = new FormData();
for (var key in myFormData) {   // Just to make sure everything set correctly, I would recomment to do like this
    console.log(key, myFormData[key]);
    formData.append(key, myFormData[key]);
}
$.ajax({
    url : 'api/rootpath/childpath',
    type : 'POST',
    data : formData,    // Do not send it as - data: { formData: formData }
    processData: false, // Tell jquery to don't process the data
    contentType: false, // If you do not set it as false, most probably you would get 400 or 415 error
    success : function(data,status) {
        alert('success');
    },
    failure : function(data) {

    }
});

Java代码:

@POST
@Path("/childpath")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response createLoan(
         @FormDataParam("cipherData") String cipherData,  // encrypted xml data
         @FormDataParam("sessionId") String sessionId,   // sessionId (you can also get it through httpHeader)
         @FormDataParam("payslip") InputStream payslipS,  // this is your file
         @FormDataParam("payslip") FormDataContentDisposition payslipD ) {   // this is your file details like file name and file type

// If you need to store the file in DB as blob
byte[] byte = IOUtils.toByteArray(payslipS);   // IOUtils is org.apache.commons.io.IOUtils (you need to add its dependency in pom.xml or build.gradle)
// Now store the byte[] in Blob field of DB
return Response.status(200).entity('success').build();
}