Java 使用spring for android压缩的jpeg字节数组生成多部分post请求

Java 使用spring for android压缩的jpeg字节数组生成多部分post请求,java,android,spring,post,multipartform-data,Java,Android,Spring,Post,Multipartform Data,我已经在我的android应用程序中成功地使用spring for android从/向服务器获取/发布数据。现在,我必须对一个多部分表单进行post请求,但我一直无法让它按我想要的方式工作 用例: 1.从图库中挑选一张照片 2.使用文件源将其加载到位图 3.将位图压缩为ByteArrayOutputStream 4.将字节数组(ByteArrayOutputStream.toByteArray())传递给服务器。(我需要以jpeg格式发送,而不是应用程序/八位字节流) 上载照片的服务器端点只接

我已经在我的android应用程序中成功地使用spring for android从/向服务器获取/发布数据。现在,我必须对一个多部分表单进行post请求,但我一直无法让它按我想要的方式工作

用例: 1.从图库中挑选一张照片 2.使用文件源将其加载到位图 3.将位图压缩为ByteArrayOutputStream 4.将字节数组(ByteArrayOutputStream.toByteArray())传递给服务器。(我需要以jpeg格式发送,而不是应用程序/八位字节流)

上载照片的服务器端点只接受具有以下Mime类型的多部分文件(注意,它不接受MimeType:application/octet stream
):

我试过使用,但到目前为止没有成功

使用以下代码,我得到以下错误: org.springframework.web.bind.MissingServletRequest参数异常:所需的多部分文件参数“file”不存在

非常感谢您在这件事上的帮助。谢谢,继续努力

这是我的密码:

bitmap = BitmapFactory.decodeFile("/mnt/sdcard/DCIM/Camera/20130205_162546.jpg");
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bitmap.compress(CompressFormat.JPEG, 60, bos);
byte[] data = bos.toByteArray();

// populate the data to post
MultiValueMap<String, Object> formData = new LinkedMultiValueMap<String, Object>();
formData.add("caption", "Test Caption");
formData.add("file", data);

// The URL for making the POST request
final String url = "http://api.example.com/imageUpload?oauth_token=XXXXXX";

HttpHeaders requestHeaders = new HttpHeaders();

// Sending multipart/form-data
requestHeaders.setContentType(MediaType.MULTIPART_FORM_DATA);

// Populate the MultiValueMap being serialized and headers in an HttpEntity object to use for the request
HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<MultiValueMap<String, Object>>(formData, requestHeaders);

// Create a new RestTemplate instance
RestTemplate restTemplate = new RestTemplate(true);

//    // Set a custom message converter that supports the application/json media type
//    final GsonHttpMessageConverter gsonMessageConverter = new GsonHttpMessageConverter();
//    gsonMessageConverter.setSupportedMediaTypes(Collections.singletonList(MediaType.APPLICATION_JSON));
//    final ByteArrayHttpMessageConverter byteArrayMessageConverter = new ByteArrayHttpMessageConverter();
//    byteArrayMessageConverter.setSupportedMediaTypes(Collections.singletonList(MediaType.IMAGE_JPEG));
//    final FormHttpMessageConverter formMessageConverter = new FormHttpMessageConverter();
//    formMessageConverter.setSupportedMediaTypes(Collections.singletonList(MediaType.IMAGE_JPEG));
//    restTemplate.getMessageConverters().addAll(Arrays.asList(gsonMessageConverter, byteArrayMessageConverter, formMessageConverter));

// Make the network request, posting the message, expecting a String in response from the server
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, requestEntity, String.class);

// Return the response body to display to the user
Log.i(TAG, "**** response.body : " + response.getBody());
bitmap=BitmapFactory.decodeFile(“/mnt/sdcard/DCIM/Camera/20130205_162546.jpg”);
ByteArrayOutputStream bos=新建ByteArrayOutputStream();
压缩(CompressFormat.JPEG,60,bos);
字节[]数据=bos.toByteArray();
//填充要发布的数据
MultiValueMap formData=新链接的MultiValueMap();
添加(“标题”、“测试标题”);
formData.add(“文件”,数据);
//用于发出POST请求的URL
最终字符串url=”http://api.example.com/imageUpload?oauth_token=XXXXXX";
HttpHeaders requestHeaders=新的HttpHeaders();
//发送多部分/表单数据
requestHeaders.setContentType(MediaType.MULTIPART\u FORM\u数据);
//在HttpEntity对象中填充要序列化的多值映射和头以用于请求
HttpEntity requestEntity=新的HttpEntity(formData,RequestHeader);
//创建一个新的RestTemplate实例
RestTemplate RestTemplate=新的RestTemplate(true);
////设置支持应用程序/json媒体类型的自定义消息转换器
//最终GsonHttpMessageConverter gsonMessageConverter=新的GsonHttpMessageConverter();
//gsonMessageConverter.setSupportedMediaTypes(Collections.singletonList(MediaType.APPLICATION_JSON));
//final ByteArrayHttpMessageConverter byteArrayMessageConverter=新ByteArrayHttpMessageConverter();
//byteArrayMessageConverter.setSupportedMediaTypes(Collections.singletonList(MediaType.IMAGE_JPEG));
//final FormHttpMessageConverter formMessageConverter=新FormHttpMessageConverter();
//formMessageConverter.setSupportedMediaTypes(Collections.singletonList(MediaType.IMAGE_JPEG));
//restemplate.getMessageConverters().addAll(Arrays.asList(gsonMessageConverter、byteArrayMessageConverter、formMessageConverter));
//发出网络请求,发布消息,期望服务器响应字符串
ResponseEntity response=restemplate.exchange(url,HttpMethod.POST,requestEntity,String.class);
//将要显示的响应正文返回给用户
Log.i(标记“**response.body:”+response.getBody());

我遇到了同样的问题,解决方案是覆盖
org.springframework.core.io.Resource#getFileName()
实现

就我而言:

MultiValueMap<String, Object> map = new LinkedMultiValueMap<String, Object>();
// add values to map ... and when it comes to image:
Resource res = new ByteArrayResource(Utils.uriToByteArray(context, itemImage)) {
                    @Override
    public String getFilename() throws IllegalStateException {
        return imageFileName;
    }
};
HttpHeaders imageHeaders = new HttpHeaders();
imageHeaders.setContentType(MediaType.IMAGE_JPEG);
HttpEntity<Resource> imageEntity = new HttpEntity<Resource>(res, imageHeaders);
map.add("item[image]", imageEntity);
MultiValueMap=newlinkedMultivaluemap();
//添加值到映射。。。说到形象:
Resource res=new ByteArrayResource(Utils.uriToByteArray(context,itemImage)){
@凌驾
公共字符串getFilename()引发IllegalStateException{
返回imageFileName;
}
};
HttpHeaders imageHeaders=新的HttpHeaders();
imageHeaders.setContentType(MediaType.IMAGE_JPEG);
HttpEntity imageEntity=新的HttpEntity(res,ImageHeader);
map.add(“项目[图像]”,imageEntity);
其中imageFilename是文件名。稍后将包含为多部分标题:
Content-Disposition:form-data;name=“您的图片表单项目”;filename=“20130520_142401.jpg”


我希望有帮助

我也遇到了这个问题。事实证明,问题的主体在服务器上,服务器未配置为处理/解析多部分请求


看看我的详细答案。希望有帮助。

我采用了这种方法,但未能达到要求的结果。如果你能给我一个解决方案,请看看这个。
MultiValueMap<String, Object> map = new LinkedMultiValueMap<String, Object>();
// add values to map ... and when it comes to image:
Resource res = new ByteArrayResource(Utils.uriToByteArray(context, itemImage)) {
                    @Override
    public String getFilename() throws IllegalStateException {
        return imageFileName;
    }
};
HttpHeaders imageHeaders = new HttpHeaders();
imageHeaders.setContentType(MediaType.IMAGE_JPEG);
HttpEntity<Resource> imageEntity = new HttpEntity<Resource>(res, imageHeaders);
map.add("item[image]", imageEntity);