2013-02-06 32 views
8

के लिए वसंत के साथ संपीड़ित जेपीजी बाइट सरणी के साथ एक मल्टीपार्ट पोस्ट अनुरोध बनाना मैं अपने एंड्रॉइड ऐप में सफलतापूर्वक एंड्रॉइड के लिए वसंत का उपयोग कर रहा हूं ताकि सर्वर से डेटा प्राप्त/पोस्ट हो सके। अब, मुझे मल्टीपार्ट फॉर्म के लिए एक पोस्ट अनुरोध करना है, लेकिन मैं जिस तरह से चाहता हूं उसे काम करने में असमर्थ हूं।एंड्रॉइड

उपयोग मामला: 1. गैलरी से एक तस्वीर लेने 2. एक बिटमैप फ़ाइल स्रोत 3. कम्प्रेस एक ByteArrayOutputStream 4. दर्रा बाइट सरणी (ByteArrayOutputStream.toByteArray लिए बिटमैप का उपयोग करने के लोड यह()) सर्वर के लिए।

फोटो अपलोड के लिए सर्वर endpoint केवल निम्नलिखित माइम प्रकार (नोट के साथ एक MultipartFile स्वीकार करता है (मैं jpeg नहीं आवेदन/ओकटेट धारा के रूप में इस भेजने की जरूरत है), यह माइम प्रकार स्वीकार नहीं करता है: आवेदन/ओकटेट धारा):

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 पैरामीटर 'फ़ाइल' इस मामले पर वर्तमान

सहायता बहुत सराहना कर रहा है नहीं है। धन्यवाद और अच्छा काम करते रहो।

यहाँ मेरी कोड है:

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() कार्यान्वयन ओवरराइड करने के लिए किया गया था।

मेरे मामले में:

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 फ़ाइल का नाम है। बाद में इसे मल्टीपार्ट हेडर के रूप में शामिल किया जाएगा: Content-Disposition: form-data; name="your_image_form_item"; filename="20130520_142401.jpg"

मुझे आशा है कि इससे मदद मिलती है!

0

मुझे भी इस मुद्दे का सामना करना पड़ा। यह पता चला कि मेरी समस्या का मुख्य सर्वर सर्वर पर था, सर्वर को मल्टीपार्ट अनुरोध को संभालने/हल करने के लिए कॉन्फ़िगर नहीं किया गया था।

मेरा विस्तृत उत्तर here देखें। आशा करता हूँ की ये काम करेगा।