2014-11-10 3 views
3

나머지 템플릿, spring-android 및 주석으로 Multipart 요청을 만드는 데 문제가 있습니다. Multipart를 사용하여 이미지 나 String 객체를 업로드하는 예를 많이 찾았지만 하나의 파트 이미지와 두 번째 파트 인 요청 구현에 대한 해결책을 찾을 수 없습니다.한 부분 이미지와 한 부분으로 구성된 Android REST 다중 요청 요청

Content-Type: multipart/form-data; boundary=--abcd12345 
Authorization:Basic 1234567890 

바디 :

요청이

헤더과 같이해야 내가 MultiValueMap하지만 함께 요청을 만들 ... 나는 많은 변화와 조합을 시도

--abcd12345 
Content-Disposition: form-data; name="photo"; filename="image123.jpg" 
Content-Type: image/jpeg 

<@INCLUDE *C:\Users\John\Desktop\image123.jpg*@> 
--abcd12345 
Content-Disposition: form-data; name="item" 
Content-Type: application/json 

{ 
    "name": "My item", 
    "description": "My item description", 
    "categories": [1,2] 
} 
--abcd12345-- 

내 모든를 노력 서버 끝내주는 컨텐트 형식을 사용할 수 없습니다 오류

누군가이 PLZ를 구현하는 방법을 알고 있다면 알려주십시오. 그리고 문제를 좀 더 명확히하기 위해 아파치 마임이나 구식 MultiPartBuilder 등의 다른 라이브러리를 사용할 수 없습니다.

이것은 인터넷에서 한 부분 이미지와 다른 부분 문자열이있는 가장 일반적인 예입니다.

MultiValueMap<String, Object> parts = new LinkedMultiValueMap<String, Object>(); 
       parts.add("file", new FileSystemResource(fileToUpload)); 
       parts.add("method", "hello,world"); 
       String response = mRestClient.uploadFile(parts); 

@Rest(rootUrl = "...", converters = {ByteArrayHttpMessageConverter.class, FormHttpMessageConverter.class, StringHttpMessageConverter.class}) 
public interface RestClient { 
    @Post("") 
    public String uploadFile(MultiValueMap data); 
} 

답변

4

의 I는 그것을 한 방법 :

// convert image to Base64 String 
ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
Bitmap image = getImageFile(imagePath); 
image.compress(Bitmap.CompressFormat.JPEG, 100, stream); 
byte[] imageBytes = stream.toByteArray(); 
String encodedImage = Base64.encodeToString(imageBytes, Base64.DEFAULT); 

// create new item 
ItemCreateDto newItemDto = new ItemCreateDto(); 
newItemDto.setName(new_item_name.getText().toString()); 
newItemDto.setDescription(new_item_description.getText().toString()); 
ObjectMapper obj = new ObjectMapper(); 
String body = obj.writeValueAsString(newItemDto); 

MultiValueMap<String, Object> multiValueMap = new LinkedMultiValueMap<String, Object>(); 

// create header with content-disposition for image part 
HttpHeaders imageHeaders = new HttpHeaders(); 
imageHeaders.add("Content-Disposition", "form-data; name=photo; filename=photo.jpeg"); 
imageHeaders.setContentType(MediaType.IMAGE_JPEG); 
HttpEntity<String> imageEntity = new HttpEntity<String>(encodedImage, imageHeaders); 

// create header for data part 
HttpHeaders dataHeaders = new HttpHeaders(); 
dataHeaders.add("Content-Disposition", "form-data; name=item"); 
dataHeaders.setContentType(MediaType.APPLICATION_JSON); 
HttpEntity<String> dataEntity = new HttpEntity<String>(body, dataHeaders); 

// add headers to multiValueMap 
multiValueMap.add("photo", imageEntity); 
multiValueMap.add("item", dataEntity); 

newItemAPI.createItem(multiValueMap); 

그리고 AndroidAnnotation + 안드로이드 봄 부분이 당신을 도울 것입니다

@Rest(rootUrl = "", converters = { ByteArrayHttpMessageConverter.class, MappingJackson2HttpMessageConverter.class, FormHttpMessageConverter.class }) 
public interface INewItemRestClient { 

@Post("") 
@Accept(MediaType.APPLICATION_JSON) 
@RequiresHeader({"Authorization", "Content-Type"}) 
String createItem(MultiValueMap<String, Object> data); 

희망 ...

+0

대단히 감사합니다! 이건 내가 필요한 것 뿐이야 ... BRAVO Good Sir! – tibortru