天天看點

Retorfit+RxJava--單檔案上傳、多檔案+文字一起傳、form-data表單送出

一、引入依賴

compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
compile 'com.squareup.okhttp3:logging-interceptor:3.8.0'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
           

二、單檔案上傳

網上有好多例子,不多說了,主要是兩個part參數,直接上代碼:

1、接口的聲明:

/**
     * 單個檔案上傳
     * @param url
     * @param description
     * @param file
     * @return
     */
    @Multipart
    @POST()
    Call<HttpResult> uploadFile(@Url String url,
                                @Part("description") RequestBody description,
                                @Part MultipartBody.Part file);
           

接口的調用:

/**
     * 檔案上傳
     *
     * @param filePath 上傳檔案的路徑
     */
    public void fileUpload(String filePath) {
        if (!NetworkState.isNetworkAvailable(MyApplication.getMyApplication())) {
            return;
        }
        //建構要上傳的檔案
        File file = new File(filePath);
        RequestBody requestFile = RequestBody.create(MediaType.parse("application/otcet-stream"), file);
        MultipartBody.Part body = MultipartBody.Part.createFormData("aFile", file.getName(), requestFile);
        String descriptionString = "This is a file description";
        RequestBody description = RequestBody.create(MediaType.parse("multipart/form-data"), descriptionString);
        SettingsInfo info = DataManager.getInstance().getSettingsInfo();
        String url = "http://" + Const.SERVER_ADDR + "/n/as/grapher_upload_file";
        Call<HttpResult> call = ServiceGenerator.createService(FileUploadClient.class).uploadFile(url, description, body);
        call.enqueue(new Callback<HttpResult>() {
            @Override
            public void onResponse(Call<HttpResult> call, Response<HttpResult> response) {
                Log.d("lixm", "fileUpload() , httpResult = " + httpResult);
            }

            @Override
            public void onFailure(Call<HttpResult> call, Throwable t) {
                Log.d("lixm", "fileUpload(), onFailure, error = " + t.getMessage());
            }
        });
    }
           

三、多檔案+文字一起上傳

1、接口的聲明

/**
     * 使用@Multipart注解方法,并用@Part注解方法參數,類型是List<okhttp3.MultipartBody.Part>
     * @param url
     * @return
     */
    @Multipart
    @POST()
    Observable<HttpResult> uploadFiles4MultiBodyPars(@Url String url,@Part() List<MultipartBody.Part> parts);
           

2、調用方法

/**
     * 多檔案上傳
     *
     * @param files      上傳檔案的集合
     * @param fileUploadParam 上傳的資訊
     */
    public void multiFileUpload(List<File> files, FileUploadParam fileUploadParam, Observer<HttpResult> fileUploadbserver) {
        if (!NetworkState.isNetworkAvailable(MyApplication.getMyApplication())) {
            return;
        }
        SettingsInfo info = DataManager.getInstance().getSettingsInfo();
        String url = "http://" + info.libServerAddr + "/n/as/grapher_upload_file";
        List<MultipartBody.Part> parts = FileUploadUtils.filesToMultipartBodyParts(files,fileUploadParam);

        FileUploadClient client = ServiceGenerator.createService(FileUploadClient.class);
        Observable<HttpResult> observable = client.uploadFiles4MultiBodyPars(url, parts);
        observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(fileUploadbserver);
    }

   public static List<MultipartBody.Part> filesToMultipartBodyParts(List<File> files,FileUploadParam fileUploadParam) {
        // 上傳圖檔資訊
        List<MultipartBody.Part> parts = new ArrayList<>(files.size());
        for (int i = ; i < files.size() ; i ++) {
            RequestBody requestBody = RequestBody.create(MediaType.parse("image/png"), files.get(i));
            MultipartBody.Part part = MultipartBody.Part.createFormData("file"+ i, files.get(i).getName(), requestBody);
            parts.add(part);
        }

        // 上傳文字資訊
        if(fileUploadParam != null){
            MultipartBody.Part equipmentId = MultipartBody.Part.createFormData("equipmentId", fileUploadParam.equipmentId);
            parts.add(equipmentId);

            MultipartBody.Part acceptanceId = MultipartBody.Part.createFormData("acceptanceId", fileUploadParam.acceptanceId);
            parts.add(acceptanceId);

            MultipartBody.Part fileName = MultipartBody.Part.createFormData("fileName", fileUploadParam.fileName);
            parts.add(fileName);

            MultipartBody.Part uploadPerson = MultipartBody.Part.createFormData("uploadPerson", fileUploadParam.uploadPerson);
            parts.add(uploadPerson);

            MultipartBody.Part timestamp = MultipartBody.Part.createFormData("timestamp", fileUploadParam.timestamp);
            parts.add(timestamp);

            String strMd5 = MD5Util.getMD5(fileUploadParam.equipmentId + fileUploadParam.timestamp + Const.KEY_MD5);
            MultipartBody.Part secStr = MultipartBody.Part.createFormData("secStr", strMd5);
            parts.add(secStr);
        }
        return parts;
    }
           
public class ServiceGenerator {
    private static final String BASE_URL = "https://api.github.com/";
    private static Retrofit retrofit;

    // 1 建立Retrofit.Builder
    private static Retrofit.Builder builder
            = new Retrofit.Builder().baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                //.addConverterFactory(new FileRequestBodyConverterFactory())  // 支援檔案上傳時内容的轉換
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create());  // 支援RxJava;

    // 2 建立OkHttpClient
    private static OkHttpClient.Builder httpClient = new OkHttpClient.Builder();

    // 日志攔截器
    private static HttpLoggingInterceptor logging = new HttpLoggingInterceptor()
                    .setLevel(HttpLoggingInterceptor.Level.BODY);
    // test
    private static LogInterceptor logInterceptor = new LogInterceptor();

    // 3 建立service_client

    public static <S> S createService(Class<S> serviceClass) {
        if (!httpClient.interceptors().contains(logInterceptor)) {
            httpClient.addInterceptor(logInterceptor);
            builder.client(httpClient.build());
            retrofit = builder.build();
        }

        return retrofit.create(serviceClass);
    }
}
           

四、form-data表單送出

@FormUrlEncoded()
@POST()
Call<String> uploadVideoInfoByAddBatch(@Url String url,
                                           @FieldMap Map<String, String> requestMap);
           

注意:@FormUrlEncoded()要和@FieldMap配合使用,否則的話會報錯。

繼續閱讀