Android开发Android开发经验谈Android技术知识

rxjava上传图片

2019-08-09  本文已影响2人  Ad大成

关于上传图片我们需要搞清楚上传的服务器需要的请求体的参数,再一个就是我们图片的路径 一下是利用MVP模式上传图片的小demo

Model层 管理数据 存储数据 下载数据

package com.example.lenovo.upload;

import java.io.File;

import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;

/**
 *利用retrofit上传
 */

public class MainModel {

    public Observable<ResponseBody> uploadImage(File file){

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://yun918.cn/")
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();
        MyService myService = retrofit.create(MyService.class);

        MediaType mediaType = MediaType.parse("application/octet-stream");
        RequestBody myFileBody=RequestBody.create(mediaType,file);
        MultipartBody.Part fileBody= MultipartBody.Part.createFormData("file",file.getName(),myFileBody);
        MultipartBody.Part key=MultipartBody.Part.createFormData("key","caca");
        Observable<ResponseBody> responseBodyObservable = myService.uploadImage(key, fileBody);
        return responseBodyObservable.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread());

    }

}

Presenter 负责桥接M和V层 并对数据进行逻辑处理

package com.example.lenovo.upload;

import java.io.File;

import io.reactivex.Observable;
import okhttp3.ResponseBody;

/**
 * Created by lenovo on 2019/8/9.
 */

public class MainPresenter {

    public Observable<ResponseBody> uploadImage(File file){
        MainModel mainModel = new MainModel();
        Observable<ResponseBody> observable = mainModel.uploadImage(file);
        return observable;
    }


}

View 层 负责获取数据 展示数据 绘制view

package com.example.lenovo.upload;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.Button;
import android.widget.ImageView;

import com.bumptech.glide.Glide;
import com.google.gson.Gson;

import java.io.File;
import java.io.IOException;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;
import okhttp3.ResponseBody;

public class MainActivity extends AppCompatActivity {

    @BindView(R.id.iv_upload)
    ImageView ivUpload;
    @BindView(R.id.btn_ok)
    Button btnOk;
    private MainPresenter mainPresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        mainPresenter = new MainPresenter();

    }

    @OnClick(R.id.btn_ok)
    public void onViewClicked() {
        File file = new File("/storage/emulated/0/luobin.jpg");

        Observable<ResponseBody> responseBodyObservable = mainPresenter.uploadImage(file);
        responseBodyObservable.subscribe(new Observer<ResponseBody>() {
            @Override
            public void onSubscribe(Disposable d) {
                Log.i("tag", "onSubscribe: ");
            }

            @Override
            public void onNext(ResponseBody responseBody) {
                try {
                    String string = responseBody.string();
                    Gson gson = new Gson();
                    HttpBean httpBean = gson.fromJson(string, HttpBean.class);
                    String url = httpBean.getData().getUrl();
                    Glide.with(MainActivity.this).load(url).into(ivUpload);

                    Log.i("tag", "onNext: "+ string);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onError(Throwable e) {
                Log.i("tag", "onError: "+e.getMessage());
            }

            @Override
            public void onComplete() {

            }
        });


    }
}

retrofit服务设置

package com.example.lenovo.upload;

import io.reactivex.Observable;
import okhttp3.MultipartBody;
import okhttp3.ResponseBody;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.Part;

/**
 * Created by lenovo on 2019/8/9.
 */

public interface MyService {

    @Multipart
    @POST("study/public/file_upload.php")
    Observable<ResponseBody> uploadImage(@Part MultipartBody.Part key,@Part MultipartBody.Part file);

}

这里需要注意的是mimeType有一个application/octet-stream可以适配各种类型 有些服务器要必须配置这个type才能请求

上一篇下一篇

猜你喜欢

热点阅读