首页 > 解决方案 > 根据下图使用 Retrofit 上传图片

问题描述

我正在尝试在改造时执行此发布请求

标签: javaandroidkotlinretrofit

解决方案


首先为您的 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(...) 函数了。


推荐阅读