首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法在OkHttp中为MultipartBody.Part设置内容类型

无法在OkHttp中为MultipartBody.Part设置内容类型
EN

Stack Overflow用户
提问于 2016-06-27 23:36:25
回答 1查看 3.2K关注 0票数 1

在这个问题上挣扎了几个小时后,我终于决定在这里请教一下。我在我的应用程序中使用Retrofit 2进行联网。下面是我在API接口中上传图片的方法:

代码语言:javascript
运行
复制
@POST(UPLOAD_PHOTO)
@Multipart
Call<UploadPhotoResponse> uploadPhoto(@Header("X-Auth-Token") String token, @Path("post_id") int postId
        , @Part("photo\"; filename=\"cover.jpg\"") MultipartBody.Part photo, @Part("photo_thumb\"; filename=\"cover_thumb.jpg\" ") MultipartBody.Part photoThumb);

我是这么说的:

代码语言:javascript
运行
复制
    RequestBody photoBody = RequestBody.create(MediaType.parse("image/jpeg"),bytePhoto);
    RequestBody thumbBody = RequestBody.create(MediaType.parse("image/jpeg"), byteThumb);
    MultipartBody.Part photoPart = MultipartBody.Part.createFormData("photo", photoFile.getName(), photoBody);
    MultipartBody.Part thumbPart = MultipartBody.Part.createFormData("photo_thumb", thumbFile.getName(), thumbBody);
    Call<UploadPhotoResponse> call = apiService
            .uploadPhoto(sessionToken, postId, photoPart, thumbPart);
    call.enqueue(new Callback<UploadPhotoResponse>() {
        @Override
        public void onResponse(Response<UploadPhotoResponse> response, Retrofit retrofit) {

        }

        @Override
        public void onFailure(Throwable t) {

        }
    });

我的问题是,由于主体参数不正确,我从服务器收到了错误消息。对于某些原因,每个部分的Content-Type都设置为"application/json“,正如您可以从Fiddler:Request body parameters的屏幕中看到的那样

我发现唯一与我的问题相关的讨论是Multipart request overriding content-type not working #1433

但它是关于请求头部的内容类型,而不是主体部分。也许有人在OkHttp上遇到了类似的问题,因为现在我不能做任何事情来解决我的问题,除了从这个库切换到这个特定的请求之外。

EN

回答 1

Stack Overflow用户

发布于 2016-10-12 19:28:48

我现在遇到了同样的问题,因为我正在尝试发送一个字符串和一个图片,它们都应该是multipart/form-data。

下面是界面的外观:

代码语言:javascript
运行
复制
@Multipart
    @POST("photos/setPhotos")
    Observable<SetPhotoResponseWrapper> uploadPhoto(@Part("userHash") RequestBody userHash, @Part("photos[]") MultipartBody.Part file);

以及对象是如何创建的:

代码语言:javascript
运行
复制
RequestBody reqFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);

        MultipartBody.Part multipart = MultipartBody.Part.createFormData("picture", file.getName(), reqFile);

        RequestBody userBody = RequestBody.create(MediaType.parse("multipart/form-data"), userHash);

下面是来自okHttp的日志:

代码语言:javascript
运行
复制
Content-Disposition: form-data; name="userHash"
10-12 14:23:43.951 29991-30723/com.gigrev.gigkev D/OkHttp: Content-Transfer-Encoding: binary
10-12 14:23:43.951 29991-30723/com.gigrev.gigkev D/OkHttp: Content-Type: multipart/form-data; charset=utf-8
10-12 14:23:43.951 29991-30723/com.gigrev.gigkev D/OkHttp: Content-Length: 32
10-12 14:23:43.952 29991-30723/com.gigrev.gigkev D/OkHttp: Content-Disposition: form-data; name="photos[]"
10-12 14:23:43.952 29991-30723/com.gigrev.gigkev D/OkHttp: Content-Transfer-Encoding: binary
10-12 14:23:43.952 29991-30723/com.gigrev.gigkev D/OkHttp: Content-Type: application/json; charset=UTF-8
10-12 14:23:43.952 29991-30723/com.gigrev.gigkev D/OkHttp: Content-Length: 111
10-12 14:23:43.952 29991-30723/com.gigrev.gigkev D/OkHttp: {"headers":{"namesAndValues":["Content-Disposition","form-data; name=\"picture\"; filename=\"IMAG0203.jpg\""]}}

因为后端不接受json,所以我必须自己解决这个问题。你设法找到解决方案了吗?

编辑:实际上我找到了一个解决方案。刚刚更新了翻新版本,这是我现在在日志中得到的:

代码语言:javascript
运行
复制
 Content-Disposition: form-data; name="userHash"
10-12 14:55:59.775 24479-25505/com.gigrev.gigkev D/OkHttp: Content-Transfer-Encoding: binary
10-12 14:55:59.775 24479-25505/com.gigrev.gigkev D/OkHttp: Content-Type: multipart/form-data; charset=utf-8
10-12 14:55:59.775 24479-25505/com.gigrev.gigkev D/OkHttp: Content-Length: 32
10-12 14:55:59.775 24479-25505/com.gigrev.gigkev D/OkHttp: Content-Disposition: form-data; name="picture"; filename="IMAG0204.jpg"
10-12 14:55:59.775 24479-25505/com.gigrev.gigkev D/OkHttp: Content-Type: multipart/form-data
10-12 14:55:59.775 24479-25505/com.gigrev.gigkev D/OkHttp: Content-Length: 848314

改装版本:

代码语言:javascript
运行
复制
compile 'com.squareup.retrofit2:retrofit:2.0.1'
    compile 'com.squareup.retrofit2:converter-gson:2.0.1'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38058017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档