2013-02-06 15 views
8

アンドロイド用のspringを使用してアンドロイドアプリで正常にデータを取得/投稿しています。今、私はマルチパートフォームの投稿要求をしなければならないが、私はそれが私が望むように働くことができなかった。アンドロイド用のスプリング付き圧縮jpegバイト配列のマルチパート投稿リクエスト

ユースケース: 1.ギャラリーから写真を選択 ファイルソース 3.圧縮ByteArrayOutputStream 4.パスバイト配列(ByteArrayOutputStream.toByteArrayにビットマップを使用してビットマップへ2.ロード、それを() )をサーバーに送信します。アプリケーション/ octet-streamの:写真をアップロードするためのサーバのエンドポイントのみが次のMIMEタイプを持つMultipartFileは(は、MIMEタイプを受け入れていない、それを注意してください受け入れ

(私はJPEGでないアプリケーション/オクテットストリームとしてこれを送信する必要があります) ):私はsample codeを使用してみましたが、これまでのところ成功してきた

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

。 org.springframework.web.bind.MissingServletRequest ParameterException:私は次のエラーを取得する次のコードで

必要MultipartFileパラメータ「ファイル」は、この問題に存在

ヘルプ大幅に高く評価されていません。ありがとう、良い仕事を続けてください。

は、ここに私のコードです:私は、問題の同じ種類にぶつかってきた

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()); 

答えて

9

、溶液をorg.springframework.core.io.Resource#getFileName()実装をオーバーライドすることでした。私の場合は

:imageFilenameはファイル名です

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); 

。これは後でマルチパートヘッダーに含まれます:Content-Disposition: form-data; name="your_image_form_item"; filename="20130520_142401.jpg"

私はそれが助けてくれることを願っています!

0

私もこの問題を抱えました。私の問題の本体がサーバー上にあり、サーバーがマルチパートリクエストを処理/解決するように構成されていないことが判明しました。

詳細な回答はhereです。それが役に立てば幸い。

関連する問題