经过几个小时的努力,我终于决定在这里征求意见。 我在我的应用程序中使用Retrofit 2进行联网。这就是我在API界面中上传图像的方法:
@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);
广告这就是我所说的:
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) {
}
});
我的问题是我从服务器收到错误消息,因为身体参数不正确。对于一些共振,每个部分的内容类型设置为“application / json”,您可以从Fiddler的屏幕上看到: Request body parameters
我遇到的唯一与我的问题相关的讨论是Multipart request overriding content-type not working #1433
但它是关于请求标题的内容类型,而不是正文部分。 也许有人遇到与OkHttp类似的问题,因为现在我无法解决我的问题,除了从这个特定请求的库中切换。
答案 0 :(得分:0)
我目前遇到同样的问题,因为我正在尝试发送字符串和图片,两者都应该是multipart / form-data。
以下是界面的外观:
@Multipart
@POST("photos/setPhotos")
Observable<SetPhotoResponseWrapper> uploadPhoto(@Part("userHash") RequestBody userHash, @Part("photos[]") MultipartBody.Part file);
如何创建对象:
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的日志:
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,我必须把它弄清楚。您是否设法找到解决方案?
编辑:我实际上找到了一个解决方案。刚刚更新了改装版本,这就是我现在在日志中获得的内容: 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
改装版本:
compile 'com.squareup.retrofit2:retrofit:2.0.1'
compile 'com.squareup.retrofit2:converter-gson:2.0.1'