【问题标题】:Getting 400 BAD REQUEST when uploading a blob to JAVA server Jersey API将 blob 上传到 JAVA 服务器 Jersey API 时收到 400 BAD REQUEST
【发布时间】:2017-04-10 15:27:12
【问题描述】:

我正在尝试上传裁剪后的图像,将其作为 blob 发送并收到 400 http 错误。 仔细检查时,我注意到以下异常:

java.lang.IllegalStateException: 实体输入流已经关闭。

JavaScript 代码:

var fd = new FormData();
fd.append("pic", cblob); //append the blob
$.ajax("/wsbasestructure/ws/users/test", {
  data: fd,
  type: "PUT",
  processData: false,
  contentType: false,
  success: function (data) {
  }
});

Java 代码:

@PUT
@Path("/test")
public String updatePic(@FormDataParam("pic") InputStream file){
    System.out.println(file);
    return null;
}

我在这里缺少什么? 感谢您的宝贵时间。

【问题讨论】:

  • Ajax 代码 sn-p 中是 HTTP PUT 还是 POST
  • @harshavmb,PUT。

标签: java ajax html5-canvas multipartform-data jersey-2.0


【解决方案1】:

见:

您需要您的表单是多部分/表单数据内容类型。 所以你需要:

contentType: multipart/form-data

也许你应该改变网络服务。

试试这个:

@PUT
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Path("/test")
public String updatePic(
    @FormDataParam("pic") InputStream file,
    @FormDataParam("pic") FormDataContentDisposition fileDisposition) {
    ...
}

来源:Jersey doc

【讨论】:

  • 这似乎不是你指出的。仍然得到同样的例外。 (我忘了在我已经尝试过的问题中描述)
  • 您是否也尝试添加注释@Consumes(MediaType.MULTIPART_FORM_DATA_TYPE)?
  • 是的,它是在类本身中定义的。当我发送像$("#input")[0].files[0] 这样的文件时,我认为这与多部分定义无关。有用。我在上传 blob 时遇到了这个问题,我真的需要上传从 html5 画布中提取的这个 blob。
  • 变量cblob是如何初始化的?
  • 我正在像这样初始化这个变量:function canvasToBlob(canvas, type) { var byteString = atob(canvas.toDataURL().split(",")[1]), ab = new ArrayBuffer(byteString.length), ia = new Uint8Array(ab), i; for (i = 0; i < byteString.length; i++) { ia[i] = byteString.charCodeAt(i); } return new Blob([ab], { type: type }); } var cblob = canvasToBlob(canvas, "jpg");。我错过了什么吗?
猜你喜欢
  • 2017-11-06
  • 2011-09-23
  • 2022-11-29
  • 1970-01-01
  • 1970-01-01
  • 2016-11-28
  • 1970-01-01
  • 1970-01-01
  • 2021-02-28
相关资源
最近更新 更多