others - 如何以JSON 的方式提交一个文件和数据到 RESTful WebService

在开发RESTful API的应用程序中,我希望客户端使用JSON发送数据,

有没有可能将文件数据转换为JSON字符串?

时间:

你基本上有三个选择:

  1. Base64编码文件,以增加大约33%的数据大小为代价,
  2. multipart/form-data POST中先发送文件,然后向客户端返回一个ID ,客户端然后使用ID发送元数据,服务器将文件和元数据关联起来,
  3. 先发送元数据,然后向客户端返回一个ID ,客户端然后使用ID发送文件,服务器将把文件和元数据关联起来。

我不知道我的方法是不是最好的,但是很简单。

使用UIImagePickerController发送图片,并使用请求的头标签发送NSData,并将图片的数据发送给服务器。


NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"myServerAddress"]];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:UIImageJPEGRepresentation(picture, 0.5)];
[request setValue:@"image/jpeg" forHTTPHeaderField:@"Content-Type"];
[request setValue:@"myPhotoTitle" forHTTPHeaderField:@"Photo-Title"];
[request setValue:@"myPhotoDescription" forHTTPHeaderField:@"Photo-Description"];

NSURLResponse *response;

NSError *error;

[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

在服务器端,我使用以下代码接收照片:


InputStream is = request.inputStream

def receivedPhotoFile = (IOUtils.toByteArray(is))

def photo = new Photo()
photo.photoFile = receivedPhotoFile //photoFile is a transient attribute
photo.title = request.getHeader("Photo-Title")
photo.description = request.getHeader("Photo-Description")
photo.imageURL ="temp" 

if (photo.save()) { 

 File saveLocation = grailsAttributes.getApplicationContext().getResource(File.separator +"images").getFile()
 saveLocation.mkdirs()

 File tempFile = File.createTempFile("photo",".jpg", saveLocation)

 photo.imageURL = saveLocation.getName() +"/" + tempFile.getName()

 tempFile.append(photo.photoFile);

} else {

 println("Error")

}

我不知道将来会不会问题,但是现在在生产环境中工作良好。


@RequestMapping(value ="/uploadImageJson", method = RequestMethod.POST)
 public @ResponseBody Object jsongStrImage(@RequestParam(value="image") MultipartFile image, @RequestParam String jsonStr) {
-- use com.fasterxml.jackson.databind.ObjectMapper convert Json String to Object
}

...