@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
}
1
由于唯一缺少的例子是 ANDROID example ,我会添加它 . 此技术使用应在Activity类中声明的自定义AsyncTask .
private class UploadFile extends AsyncTask<Void, Integer, String> {
@Override
protected void onPreExecute() {
// set a status bar or show a dialog to the user here
super.onPreExecute();
}
@Override
protected void onProgressUpdate(Integer... progress) {
// progress[0] is the current status (e.g. 10%)
// here you can update the user interface with the current status
}
@Override
protected String doInBackground(Void... params) {
return uploadFile();
}
private String uploadFile() {
String responseString = null;
HttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost("http://example.com/upload-file");
try {
AndroidMultiPartEntity ampEntity = new AndroidMultiPartEntity(
new ProgressListener() {
@Override
public void transferred(long num) {
// this trigger the progressUpdate event
publishProgress((int) ((num / (float) totalSize) * 100));
}
});
File myFile = new File("/my/image/path/example.jpg");
ampEntity.addPart("fileFieldName", new FileBody(myFile));
totalSize = ampEntity.getContentLength();
httpPost.setEntity(ampEntity);
// Making server call
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
int statusCode = httpResponse.getStatusLine().getStatusCode();
if (statusCode == 200) {
responseString = EntityUtils.toString(httpEntity);
} else {
responseString = "Error, http status: "
+ statusCode;
}
} catch (Exception e) {
responseString = e.getMessage();
}
return responseString;
}
@Override
protected void onPostExecute(String result) {
// if you want update the user interface with upload result
super.onPostExecute(result);
}
}
11 回答
我在这里问了一个类似的问题:
How do I upload a file with metadata using a REST web service?
你基本上有三个选择:
Base64对文件进行编码,代价是将数据大小增加约33% .
首先在
multipart/form-data
POST中发送文件,然后将ID返回给客户端 . 然后,客户端发送带有ID的元数据,服务器重新关联文件和元数据 .首先发送元数据,然后将ID返回给客户端 . 然后,客户端发送带有ID的文件,服务器将文件和元数据重新关联 .
您可以使用multipart/form-data内容类型在一个请求中发送文件和数据:
来自http://www.faqs.org/rfcs/rfc2388.html:
您可以在边界之间的每个部分中包含文件信息或字段信息 . 我已成功实现了RESTful服务,该服务要求用户提交数据和表单,并且multipart / form-data完美地工作 . 该服务是使用Java / Spring构建的,客户端使用的是C#,所以很遗憾,我没有任何Grails示例可以为您提供有关如何设置服务的信息 . 在这种情况下,您不需要使用JSON,因为每个“表单数据”部分都为您提供了指定参数名称及其值的位置 .
使用multipart / form-data的好处在于您使用的是HTTP定义的头文件,因此您坚持使用现有HTTP工具创建服务的REST理念 .
我想发送一些字符串到后端服务器 . 我没有使用json与multipart,我使用了请求参数 .
网址看起来像
我正在传递两个参数(uuid和type)以及文件上传 . 希望这将有助于谁没有复杂的json数据发送 .
由于唯一缺少的例子是 ANDROID example ,我会添加它 . 此技术使用应在Activity类中声明的自定义AsyncTask .
因此,当您要上传文件时,只需致电:
如果您正在开发休息服务器,则可以执行此操作
让客户端通过HTTP公开文件
客户端然后可以使用您的json数据发送url,例如图像文件
{"file_url":"http://cockwombles.com/blah.jpg"}
然后服务器可以下载该文件 .
我知道这个帖子很老了,但是,我在这里错过了一个选项 . 如果您要将要发送的元数据(以任何格式)与要上载的数据一起发送,则可以发出单个
multipart/related
请求 .您可以查看RFC 2387规范以获得更深入的详细信息 .
基本上,这种请求的每个部分可以具有不同类型的内容,并且所有部分都以某种方式相关(例如,图像和它的元数据) . 部件由边界字符串标识,最后的边界字符串后跟两个连字符 .
Example:
这是我的方法API(我使用示例) - 正如您所看到的,您在API中不使用任何file_id(在服务器中上传的文件identyicator):
1.在服务器上创建“照片”对象:
2.上传文件(注意'文件'是单数形式,因为每张照片只有一个):
然后例如:
3.阅读照片列表
4.阅读一些照片细节
5.阅读照片文件
所以结论是,首先你通过POST创建对象(照片),然后然后你发送带文件的secod请求(再次POST) .
FormData对象:使用Ajax上传文件
XMLHttpRequest Level 2增加了对新FormData接口的支持 . FormData对象提供了一种方法,可以轻松构造一组表示表单字段及其值的键/值对,然后可以使用XMLHttpRequest send()方法轻松发送 .
https://developer.mozilla.org/en-US/docs/Web/API/FormData
请确保您有以下导入 . 当然其他标准进口
我知道这个问题已经过时了,但是在最后几天我搜索了整个网络以解决同样的问题 . 我有grails REST webservices和iPhone Client发送图片, Headers 和描述 .
我不知道我的方法是否最好,但是简单易行 .
我使用UIImagePickerController拍照并使用请求的标头标签向服务器发送NSData以发送图片的数据 .
在服务器端,我使用以下代码收到照片:
我不知道将来是否有问题,但现在在 生产环境 环境中工作正常 .