我正在使用Retrofit2处理我的Android应用程序中的API调用。该应用程序包含多个图像上传功能。所有的图像上传功能都最多可连接两个API调用,并且会依次触发。
第一个API将图像内容上传到服务器,服务器将生成一个动态签名的AWS S3图像URL作为响应。
第二个API使用的是上面签名的URL,并将数据放入AWS S3。
它非常适合小图像。对于大图像,API已失败。该问题的可能解决方案是将上传API分为多个部分。因此,我将第二个API更改为“ Retrofit2-multipart ”。但是这里的问题是,上传图像后,文件在S3中损坏了。
所以我的问题是,加装改装零件是否适合ASW S3上传? 我们有解决此问题的解决方案吗?。
请检查我的实施
Retrofit API接口
@Multipart
@PUT
Call<Void> uploadFile(@Url String url,
@Part MultipartBody.Part file);
改装服务创建者
private ApiServicesList createService() {
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.readTimeout(300, TimeUnit.SECONDS)
.connectTimeout(360, TimeUnit.SECONDS)
.cache(null)
.addInterceptor(new NetworkInterceptor(context))
.addInterceptor(createLoggingInterceptor())
.addInterceptor(createSessionExpiryInterceptor())
.addInterceptor(createContextHeaderInterceptor())
.build();
return new Retrofit.Builder()
.baseUrl(FirebaseConfig.getInstance().getStagingBaseURl())
.addConverterFactory(GsonConverterFactory.create())
.client(okHttpClient)
.build()
.create(ApiServicesList.class);
}
文件上传类
public void uploadFileTos3(String url, MultipartBody.Part file, Callback<Void> listener) {
Call<Void> call = mAPIServices.uploadFile(url,file);
call.enqueue(listener);
}
演示者API调用
networkServices.uploadFileTos3(credentials.getSignedUrl(), prepareRequestBody(file), new Callback<Void>() {
@Override
public void onFailure(Call<Void> call, Throwable t) {
//App Action
}
@Override
public void
onResponse(Call<Void> call, Response<Void> response) {
//App Action
}
});
请求正文方法
public static MultipartBody.Part prepareRequestBody(File file) {
RequestBody requestFile = RequestBody.create(MediaType.parse(CONTENT_TYPE), file); // Checked Both "image/jpeg" and "multipart/form-data"
return MultipartBody.Part.createFormData("image", file.getName(), requestFile);
}
DDMS日志
2019-04-10 19:07:13.926 18761-18874/com.xxx D/OkHttp: --> PUT https:Signed URL(Removed actual URL)
2019-04-10 19:07:13.926 18761-18874/com.xxx D/OkHttp: Content-Type: multipart/form-data; boundary=60561d1c-ff3f-4a43-8022-ca2be3e8ec4e
2019-04-10 19:07:13.926 18761-18874/com.xxx D/OkHttp: Content-Length: 71154
2019-04-10 19:07:13.931 18761-18874/com.xxx D/OkHttp: --60561d1c-ff3f-4a43-8022-ca2be3e8ec4e
2019-04-10 19:07:13.931 18761-18874/com.xxx D/OkHttp: Content-Disposition: form-data; name="image"; filename="forest-trees-fog-foggy.jpg"
2019-04-10 19:07:13.931 18761-18874/com.xxx D/OkHttp: Content-Type: image/jpeg
2019-04-10 19:07:13.931 18761-18874/com.xxx D/OkHttp: Content-Length: 70934
2019-04-10 19:07:13.931 18761-18874/com.xxx D/OkHttp: Image Body
2019-04-10 19:07:13.942 18761-18874/com.xxx D/OkHttp: --60561d1c-ff3f-4a43-8022-ca2be3e8ec4e--
2019-04-10 19:07:13.942 18761-18874/com.xxx D/OkHttp: --> END PUT (71154-byte body)
2019-04-10 19:07:15.648 18761-18874/com.xxx D/OkHttp: <-- 200 OK
答案 0 :(得分:1)
尝试使用“ file”而不是“ image”跟踪对createFormData的调用:
public static MultipartBody.Part prepareRequestBody(File file) {
RequestBody requestFile = RequestBody.create(MediaType.parse(CONTENT_TYPE), file); // Checked Both "image/jpeg" and "multipart/form-data"
return MultipartBody.Part.createFormData("file", file.getName(), requestFile);
}