java - 根据下图使用 Retrofit 上传图片
问题描述
解决方案
首先为您的 POST API 创建接口
public interface APIInterface {
@Multipart
@POST("you_api_node")
Call<MediaTransfer> PostMedia(@Part("key") RequestBody key,
@Part("AwsAccesskeyID") RequestBody AwsAccesskeyID,
@Part("x-amz-security-token") RequestBody x-amz-security-token,
@Part("policy") RequestBody policy,
@Part("signature") RequestBody signature,
@Part MultipartBody.Part file);
}
您已在其中初始化改造的 API 客户端类
public class APIClient {
public static Retrofit retrofit;
public static Retrofit getClient() {
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build();
Gson gson = new GsonBuilder()
.setLenient()
.create();
if (retrofit == null) {
retrofit = new Retrofit.Builder()
.baseUrl("http://mybaseurl.com")
.addConverterFactory(GsonConverterFactory.create(gson))
.client(client)
.build();
}
return retrofit;
}
}
现在在您的 Activity/Class 中创建 PostMedia 功能
public void PostMedia(RequestBody key,RequestBody AwsAccessKeyID,RequestBody x-amz-security-token, RequestBody policy, RequestBody signature,MultipartBody.Part file ){
APIInterface apiInterface = APIClient.getClient().create(APIInterface.class);
Call<MediaTransfer> call = apiInterface.PostMedia(key, AwsAccessKeyID, x-amz-security-token, policy, signature,file);
call.enqueue(new Callback<MediaTransfer>() {
@Override
public void onResponse(Call<MediaTransfer> call, Response<MediaTransfer> response) {
if (response.isSuccessful()) {
//Do Something
}
}
@Override
public void onFailure(Call<MediaTransfer> call, Throwable t) {
mediaTimeout = t.getMessage();
Log.d("MyResponse", "Post Media failure" + t.getMessage());
}
});
}
现在在您的 MainActivity 中您可以调用。
File myfile = new File(filePath);
RequestBody surveyBody = RequestBody.create(MediaType.parse("image/*"), file);
surveyImagesParts[index] = MultipartBody.Part.createFormData("file", file.getName(), surveyBody);
RequestBody key= RequestBody.create(MediaType.parse("multipart/form-data"), key);
RequestBody AwsAccesskeyID= RequestBody.create(MediaType.parse("multipart/form-data"), AwsAccesskeyID);
RequestBody x-amz-security-token = RequestBody.create(MediaType.parse("multipart/form-data"), x-amz-security-token);
RequestBody policy= RequestBody.create(MediaType.parse("multipart/form-data"), policy);
RequestBody signature= RequestBody.create(MediaType.parse("multipart/form-data"), signature);
现在你可以调用上面的 PostMedia(...) 函数了。
推荐阅读
- redhat - Java多个进程写入同一文件夹性能问题
- python - 如何暂停读取串行数据以便调用函数?
- bazel - 如何查询 bazel 以获取扩展名为 .srcjar.zip 的生成文件的完整列表?
- flutter - 设置 Flutter RaisedButton 样式的正确方法是什么?
- typescript - 根据对象中已设置的属性缩小联合类型
- javascript - JSDoc Type 属性作为函数参数无效
- python - 模拟 datetime.datetime.now() 时 Pandas 日期时间失败
- android - Google 登录无法在 android 中运行,但在 ios 中运行
- c# - Linq 用于将数据过滤到具有多个字段的对象中,其中之一是 List
- excel - Excel VBA Rename Filename