在一个请求中上传JSON和二进制文件

时间:2012-08-18 23:05:21

标签: java google-app-engine rest

我希望创建一个RESTful API,用于Android和iOS应用。到目前为止,我一直在尝试在服务器上使用Jersey,然后在客户端使用相应的http库。目前我一直使用multipart/related作为请求的mimetype,JSON构成了身体的第一部分,然后是jpeg图像作为第二部分。

到目前为止,我遇到了向服务器发出请求的问题,从泽西岛获得了406 Not Acceptable。我注意到multipart/related主要用于发送电子邮件。实际上是否有一种方法可以支持混合类型内容作为上传,或者我完全误解了multipart/related在此上下文中的用法?

2 个答案:

答案 0 :(得分:2)

您可以查看此博客,了解更多信息,但这是帮助您的重要部分:

http://www.mkyong.com/webservices/jax-rs/file-upload-example-in-jersey/

@POST
@Path("/upload")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadFile(
    @FormDataParam("file") InputStream uploadedInputStream,
    @FormDataParam("file") FormDataContentDisposition fileDetail) {

    String uploadedFileLocation = "d://uploaded/" + fileDetail.getFileName();

    // save it
    writeToFile(uploadedInputStream, uploadedFileLocation);

    String output = "File uploaded to : " + uploadedFileLocation;

    return Response.status(200).entity(output).build();
}

我希望你想要multipart / form-data,因为这是multipart / related描述的一部分:

  

Multipart / Related介质类型适用于复合对象
  由几个相互关联的身体部位组成。对于一个   多部分/相关对象,无法通过
实现正确显示   单独显示组成的身体部位。内容类型   Multipart / Related对象的类型由type参数指定   如果给出“开始”参数,则通过内容ID指向
  包含对象根的正文部分。默认的根是
  Multipart / Related团体中的第一个身体部位。

有关此mime类型的更多信息,请查看

http://tools.ietf.org/html/rfc2387

答案 1 :(得分:0)

如果您想要将图像与json主体一起提交,则可以对图像进行base64编码并在json中包含base64字符串。然后在服务器端,base64解码字符串并将图像文件上传到blobstore。请在此处查看文件上传示例(位于页面底部)https://developers.google.com/appengine/docs/java/blobstore/overview

或者,您可以单独上载到blobstore并获取上传图像的blobkey。然后,您可以将blobkey包含在发布到服务器的json正文中。使用此方法,每次需要执行新的图像上载时,都需要获取uploadurl。