使用Retrofit上传文件

Retrofit和RxJava系列博客:
使用Retrofit上传文件
使用Gson解析Retrofit返回结果
Retrofit和RxJava结合使用
使用Retrofit和RxJava进行轮询操作


Retrofit是Square公司开发的网络请求框架,其底层封装了okhttp进行实际的网络请求操作。关于其基础用法,强烈推荐腾讯bugly社区的博文《深入浅出 Retrofit》:

http://bugly.qq.com/bbs/forum.php?mod=viewthread&tid=1117

本文将以使用Multipart方式上传图片为例,总结一下Retrofit的使用方法。

添加依赖

在build.gradle中加入依赖

compile 'com.squareup.retrofit2:retrofit:2.1.0'

定义Multipart请求接口

Multipart在http中常常用于上传文件。首先需要使用注解@Multipart,表明该接口使用Multipart方式进行请求。在接口的upload方法中,使用@Part注解定义上传的内容,这里的第一个@Part表示一个键为UserId、值为description的参数;第二个@Part表示该参数为一个MultipartBody.Part类型的文件file

public interface FileUploadService {
        @Multipart
        @POST("EntranceGuardes/app/appOpen_pushdDataToApp.action")
        Call<ResponseBody> upload(@Part("userId") RequestBody description,
                                  @Part MultipartBody.Part file);
    }

传入文件

首先,需要构造一个FileUploadService对象service

Retrofit retrofit = new Retrofit.Builder().baseUrl("http://172.18.81.155:8080/").build();

FileUploadService service = retrofit.create(FileUploadService.class);

接下来需要调用serviceupload方法。upload方法的第一个参数是@Part("userId") RequestBody description,使用RequestBody.create方法就可以将字符串s变为RequestBody类型。值得注意的是MediaType.parse("text/plain")中使用MIME来说明上传数据的类型。

String s = "1006";

RequestBody description = RequestBody.create(MediaType.parse("text/plain"), s);

如果加入要上传的图片呢?首先需要打开图片文件,随后使用RequestBody.create创建一个RequestBody对象,然后调用MultipartBody.Part.createFormDataRequestBody对象转变为MultipartBody.Part对象。注意到这里的MIME指定为image/*,表明这部分数据是图片类型的文件。

File file = new File("/storage/sdcard/Desert.jpg");
RequestBody requestFile = RequestBody.create(MediaType.parse("image/*"), file);
MultipartBody.Part body = MultipartBody.Part.createFormData("image", file.getName(), requestFile);

异步调用

定义完成请求以后就需要调用了,retrofit和okhttp一样提供了同步调用和异步调用两种方式,常用的就是异步调用方式。异步调用只需要在enqueue方法中传入回调对象就可以了。在回调的接口中,需要实现两个方法onResponseonFailure,分别对应中请求成功响应和请求失败两种情况。

    Call<ResponseBody> call = service.upload(description, body);

    call.enqueue(new Callback<ResponseBody>() {
        @Override
        public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
            try {
                Log.d("main", response.body().string());
                Log.d("main",Thread.currentThread().getName());                         
                } catch (IOException e) {
                    e.printStackTrace();
                    }
                }
        @Override
        public void onFailure(Call<ResponseBody> call, Throwable t) {
                    }
                });

完整代码

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

                File file = new File("/storage/sdcard/Desert.jpg");

                Retrofit retrofit = new Retrofit.Builder().baseUrl("http://172.18.81.155:8080/").build();

                FileUploadService service = retrofit.create(FileUploadService.class);

                RequestBody requestFile = RequestBody.create(MediaType.parse("image/*"), file);
                MultipartBody.Part body = MultipartBody.Part.createFormData("image", file.getName(), requestFile);

                String s = "1006";
                RequestBody description = RequestBody.create(MediaType.parse("text/plain"), s);

                Call<ResponseBody> call = service.upload(description, body);

                call.enqueue(new Callback<ResponseBody>() {
                    @Override
                    public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                        try {
                            Log.d("main", response.body().string());
                            Log.d("main",Thread.currentThread().getName());
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }

                    @Override
                    public void onFailure(Call<ResponseBody> call, Throwable t) {

                    }
                });
    }

    public interface FileUploadService {
        @Multipart
        @POST("EntranceGuardes/app/appOpen_pushdDataToApp.action")
        Call<ResponseBody> upload(@Part("userId") RequestBody description,
                                  @Part MultipartBody.Part file);

    }

}

代码地址

https://github.com/flyingzhao/JavaExperiment/tree/master/androidapp/RetrofitTest

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Kotlin 中使用 Retrofit 进行文件上传,你可以按照以下步骤进行操作: 1. 首先,确保你已经在项目中添加了 Retrofit 和相应的依赖库。可以在 `build.gradle` 文件中添加以下依赖: ```kotlin implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' implementation 'com.squareup.okhttp3:logging-interceptor:4.9.0' ``` 2. 创建一个接口,定义文件上传的 API。例如,假设你要上传文件到 `/upload` 路径,可以创建一个名为 `FileUploadService` 的接口: ```kotlin import okhttp3.MultipartBody import okhttp3.RequestBody import retrofit2.Call import retrofit2.http.Multipart import retrofit2.http.POST import retrofit2.http.Part interface FileUploadService { @Multipart @POST("/upload") fun uploadFile(@Part file: MultipartBody.Part): Call<ResponseBody> } ``` 3. 创建 Retrofit 实例,并且使用该实例创建 `FileUploadService` 的实例: ```kotlin import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory val retrofit = Retrofit.Builder() .baseUrl("http://your-base-url.com") .client(createOkHttpClient()) .addConverterFactory(GsonConverterFactory.create()) .build() fun createOkHttpClient(): OkHttpClient { val logger = HttpLoggingInterceptor().apply { level = HttpLoggingInterceptor.Level.BODY } return OkHttpClient.Builder() .addInterceptor(logger) .build() } val fileUploadService = retrofit.create(FileUploadService::class.java) ``` 4. 现在,你可以使用 `fileUploadService` 实例来上传文件。首先,创建一个 `File` 对象,表示要上传的文件。然后,将文件转换为 `RequestBody` 对象,并使用 `MultipartBody.Part` 将其添加到请求中: ```kotlin import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.RequestBody.Companion.asRequestBody import okhttp3.MultipartBody import java.io.File val file = File("path/to/your/file") val requestFile = file.asRequestBody("image/*".toMediaTypeOrNull()) val body = MultipartBody.Part.createFormData("file", file.name, requestFile) val call = fileUploadService.uploadFile(body) call.enqueue(object : Callback<ResponseBody> { override fun onResponse(call: Call<ResponseBody>, response: Response<ResponseBody>) { // 文件上传成功处理 } override fun onFailure(call: Call<ResponseBody>, t: Throwable) { // 文件上传失败处理 } }) ``` 这样就完成了 Kotlin 中使用 Retrofit 进行文件上传的过程。记得替换实际的 base URL 和文件路径。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值