如何通過Retrofit提交圖片

這篇帖子主要介紹如何通過Retrofit同時提交圖片和參數,例子中結合了Rxjava。
例子是將一幅圖片和2個參數傳到服務器,服務器返回該圖像處理後的二值化結果並顯示(公司內部服務器的接口)。其接口調用方式:
/**
* http://image.ideayapai.com/upload?defectType=0&perunit=1
* @param defectType
* @param perunit
* @return
*/
返回的結果是json格式:

{
  "ImageCheckUrl": "http://image.ideayapai.com/ImageResult/16-九月-169f3ed42b-e6f9-496b-9725-8720f596d8a633_resultChecked.jpg",
  "ImageGrayUrl": "http://image.ideayapai.com/ImageResult/16-九月-169f3ed42b-e6f9-496b-9725-8720f596d8a633_resultGray.jpg",
  "DefectType": 0,
  "PerUnit": 1,
  "CrackWidth": 17.4312,
  "Length": 278.5,
  "UsedTime": 10,
  "Area": 0,
  "ResultType": 1
}

然後用glide顯示結果圖片。

1、首先是在gradle裏添加依賴

   compile 'com.squareup.retrofit2:retrofit:2.1.0'
   compile 'com.squareup.retrofit2:converter-gson:2.1.0'
   compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
   compile 'io.reactivex:rxjava:1.1.10'
   compile 'io.reactivex:rxandroid:1.2.1'
   compile 'com.squareup.picasso:picasso:2.5.2'
   compile 'com.github.bumptech.glide:glide:3.7.0'

通過gsonformat插件,通過返回數據格式生成一個結果類(PictureModel)

public class PictureModel {

    /**
     * ImageCheckUrl : http://image.ideayapai.com/ImageResult/16-七月-0840ae4e2b-f1e1-431a-af9e-44abd16dca0c6_resultChecked.jpg
     * ImageGrayUrl : http://image.ideayapai.com/ImageResult/16-七月-0840ae4e2b-f1e1-431a-af9e-44abd16dca0c6_resultGray.jpg
     * DefectType : 0
     * PerUnit : 1
     * CrackWidth : 370.463
     * Length : 4778.5
     * UsedTime : 1.682
     * Area : 0
     */

    private String ImageCheckUrl;
    private String ImageGrayUrl;
    private int DefectType;
    private int PerUnit;
    private double CrackWidth;
    private double Length;
    private double UsedTime;
    private int Area;

    public String getImageCheckUrl() {
        return ImageCheckUrl;
    }

    public void setImageCheckUrl(String ImageCheckUrl) {
        this.ImageCheckUrl = ImageCheckUrl;
    }

    public String getImageGrayUrl() {
        return ImageGrayUrl;
    }

    public void setImageGrayUrl(String ImageGrayUrl) {
        this.ImageGrayUrl = ImageGrayUrl;
    }

    public int getDefectType() {
        return DefectType;
    }

    public void setDefectType(int DefectType) {
        this.DefectType = DefectType;
    }

    public int getPerUnit() {
        return PerUnit;
    }

    public void setPerUnit(int PerUnit) {
        this.PerUnit = PerUnit;
    }

    public double getCrackWidth() {
        return CrackWidth;
    }

    public void setCrackWidth(double CrackWidth) {
        this.CrackWidth = CrackWidth;
    }

    public double getLength() {
        return Length;
    }

    public void setLength(double Length) {
        this.Length = Length;
    }

    public double getUsedTime() {
        return UsedTime;
    }

    public void setUsedTime(double UsedTime) {
        this.UsedTime = UsedTime;
    }

    public int getArea() {
        return Area;
    }

    public void setArea(int Area) {
        this.Area = Area;
    }
}

3、新建一個接口文件Api


public interface Api {    
    /**
     * http://image.ideayapai.com/upload?defectType=0&perunit=1
     * @param defectType
     * @param perunit
     * @return
     */
    @Multipart

    @POST("upload")
    Observable<PictureModel> getPictureCheck(@Query("defectType") int defectType, @Query("perunit") double perunit, @Part("file\"; filename=\"image.png\"") RequestBody file);
}

4、書寫提交代碼

Retrofit retrofit=new Retrofit.Builder()
                        .baseUrl("http://image.ideayapai.com/")
                        .addConverterFactory(GsonConverterFactory.create())
                        .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                        .build();
                Api phone=retrofit.create(Api.class);
                File file=new File(Environment.getExternalStorageDirectory()+"/33.png");
                final RequestBody requestFile =
                        RequestBody.create(MediaType.parse("multipart/form-data"), file);
                phone.getPictureCheck(0,1,requestFile)
                        .subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribe(new Subscriber<PictureModel>() {
                            @Override
                            public void onCompleted() {
                            }
                            @Override
                            public void onError(Throwable e) {
                                Log.e("**************", "----------****");
                            }

                            @Override
                            public void onNext(PictureModel pictureModel) {
//                                    String path="http://www.ideayapai.com/Application/Home/View/default/Public/images/dd.jpg";
//                                Picasso.with(MainActivity.this).load(path).into(res);
                                Log.i("result",pictureModel.getImageGrayUrl());
//本來是用Picasso的,但是返回的路徑裏面有中文,顯示不了,改用Glide就可以

Glide.with(MainActivity.this).load(pictureModel.getImageGrayUrl()).into(res);
                            }
                        });

結果
這裏寫圖片描述
注意:本次圖片存放在sd卡根目錄,名稱爲33.png,服務器的功能是識別裂縫
源碼下載:
https://github.com/lovezhupumao/RetrofitPostPicture

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章