gpt4 book ai didi

java - 使用 spring for android 使用压缩的 jpeg 字节数组发出多部分发布请求

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:04:05 26 4
gpt4 key购买 nike

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

用例:1. 从图库中挑选一张照片2.使用文件源将其加载到位图3. 将位图压缩为 ByteArrayOutputStream4. 将字节数组 (ByteArrayOutputStream.toByteArray()) 传递给服务器。 (我需要将其作为 jpeg 而不是 application/octet-stream 发送)

上传照片的服务器端点接受仅具有以下 Mime 类型的 MultipartFile(注意,它不接受 MimeType: application/octet-stream):

GIF("image/gif")
PNG("image/png", "image/x-png")
JPG("image/jpeg", "image/jpg", "image/pjpeg")
BMP("image/bmp")

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

使用以下代码我得到以下错误:org.springframework.web.bind.MissingServletRequest ParameterException:所需的 MultipartFile 参数"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());

最佳答案

我遇到过同样的问题,解决方案是覆盖 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);

其中 imageFilename 是文件名。稍后将作为多部分 header 包含在内:Content-Disposition: form-data; name="your_image_form_item"; filename="20130520_142401.jpg"

希望对您有所帮助!

关于java - 使用 spring for android 使用压缩的 jpeg 字节数组发出多部分发布请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14738394/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com