3

Rest テンプレート、spring-android、および注釈を使用してマルチパート リクエストを作成する際に問題があります。マルチパートを使用して画像または文字列オブジェクトをアップロードする例を多数見つけましたが、一部の画像と 2 番目の部分の json であるリクエストの実装に関する解決策が見つかりません。

リクエストはこのようなものでなければなりません

ヘッダ:

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

体:

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

多くのバリエーションと組み合わせを試しました... MultiValueMap でリクエストを作成しましたが、サーバーですべての作業が終了し、コンテンツ タイプを消費できませんというエラーが表示されます

誰かがこのplzを実装する方法を知っているなら教えてください. 問題をもう少し明確にするために、apache mime や昔ながらの MultiPartBuilder などの他のライブラリは使用できません。

これはインターネット上で最も一般的な例で、1 つの部分が画像で、もう 1 つの部分が文字列です。

    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

1 に答える 1

4

私がやった方法:

// 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 + Android Spring の部分:

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

これがあなたを助けることを願っています...

于 2014-11-10T14:49:52.760 に答える