当前位置: 首页 > 知识库问答 >
问题:

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

郏志学
2023-03-14

我正在尝试使用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);

我已经试了一天了。我确实通过直接提交表单来接收文件,但我需要在ajax中完成。如果我查看tomcat的日志,当访问api/rootpath/childpath时,它总是给我415个状态代码。我认为问题是因为与原始内容类型相比,收到的内容类型不同。我尝试更改媒体类型 到“多部分/表单数据”等,但失败。

共有3个答案

郜联
2023-03-14

我认为您应该将ajax代码段中的内容类型(当前显示为false)更改为“多部分/表单数据”,因为这是Java常量MediaType的值。MULTIPART\u FORM\u数据。

公冶高义
2023-03-14

后端

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

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

不同的支持文档和示例

  • Jersey 2支持-示例

前端

这里可以找到很多不同的例子

司徒骞尧
2023-03-14

好了,终于发现我的错误了。我希望这个答案对希望在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();
}
 类似资料:
  • 我似乎无法找出控制器接收空数据的原因。我能够到达控制器,但没有数据传输。当我使用Postman测试API的主体和正确的键/数据内容时,在控制器端一切都正常。 我的控制器方法: 文件模型: 以及客户端Axios调用: 我想问题在于我发送的数据类型?特别是,使用s属性类型。欢迎所有想法! Axios 0.19.2的使用版本

  • 问题内容: 我需要使用ajax和FormData发送一些数据,因为我想发送文件和其他一些参数。我通常发送数据的方式是这样的: 如果我不使用FormData(),就没有问题,但是当使用FormData()时,只有Lvl1上的数据可以,但是嵌套的任何内容都显示为这样的字符串 如果我使用FormData()对Lvl1-3中的数据进行编码,而不是得到 如何在Lvl1-3上获取数组而不是字符串? 注意:如果

  • 每当我尝试在 Mozilla Firefox 浏览器中按如下方式在 URL 中放置特殊字符时 https://URL/| 或 https://URL/] Tomcat返回HTTP状态400-错误请求和异常堆栈跟踪,如下所示。 令人惊讶的是,同一个带有特殊字符的URL在Google Chrome浏览器中正常工作。 我有以下几个问题 我应该在tomcat配置文件中做哪些更改,以便它不应该返回400状态

  • 问题内容: 我在使用jQuery的ajax函数将文件发送到服务器端PHP脚本时遇到问题。可以获取File- List,但是如何将此数据发送到服务器呢?使用文件输入时,服务器端php脚本上的结果数组()为0()。 我知道这是可能的(尽管直到现在我还没有找到任何jQuery解决方案,只有Prototye代码(http://webreflection.blogspot.com/2009/03/safar

  • 我的源提供商向我发送。gz文件(zip文件)通过POST请求发送到我的服务器。 我试图实现。NET代码将拦截POST请求并解压缩文件以打开里面的文件。 我只是想截取POST请求并解压缩内容,这样做: 它返回415 Unsupport tedMediaType。 如何截获POST请求,这是一个ZIP文件,以及如何解压缩它以返回其中的文件? 谢谢你。 编辑:

  • 我使用PHP CURL发送POSTFIELD,但我得到错误415不支持的媒体类型这是我的代码: 我收到错误信息 HTTP/1.1 415不支持的媒体类型日期:周三,01月2018 18:19:00格林尼治标准时间服务器:Apache缓存控制:无缓存缓存控制:无存储Pragma:无缓存内容长度: 903过期:周四,01月1970 00:00:00格林尼治标准时间设置-Cookie: WMONID=R