1. 程式人生 > >okhttp上傳下載圖片

okhttp上傳下載圖片

public class MainActivity extends AppCompatActivity {

private String Path = "https://10.url.cn/eth/ajNVdqHZLLAxibwnrOxXSzIxA76ichutwMCcOpA45xjiapneMZsib7eY4wUxF6XDmL2FmZEVYsf86iaw/";
private static final int SUCCESS = 993;
private static final int FALL = 814;
Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        switch (msg.what) {
            //載入網路成功,進行UI的更新,處理得到的圖片資源
            case SUCCESS:
                //通過message,拿到位元組陣列
                byte[] Picture = (byte[]) msg.obj;
                //使用BitmapFactory工廠,把位元組陣列轉換為bitmap
                Bitmap bitmap = BitmapFactory.decodeByteArray(Picture, 0, Picture.length);
                //通過ImageView,設定圖片
                mImageView_okhttp.setImageBitmap(bitmap);
                break;
            //當載入網路失敗,執行的邏輯程式碼
            case FALL:
                Toast.makeText(MainActivity.this, "不好意思,李紅展太帥了,造成網路異常", Toast.LENGTH_SHORT).show();
                break;

            default:
                break;
        }
    }
};
private ImageView mImageView_okhttp;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //初始化控制元件
    initView();
}

private void initView() {
    mImageView_okhttp = (ImageView) findViewById(R.id.imageView_okhttp);
}

/**
 * 根據點選事件獲取絡上的圖片資源,使用的是OKhttp框架
 *
 * @param view
 */
public void Picture_okhttp_bt(View view) {
    //1. 建立OKhttpClient物件
    OkHttpClient okHttpClient = new OkHttpClient();
    //2.建立Request物件,設定引數,請求方式如果是get,就不用設定,預設使用的就是get
    Request request = new Request.Builder()
            .url(Path)//設定請求網址
            .build();//建立request物件
    //3.建立一個Call物件,引數是request物件,傳送請求
    Call call = okHttpClient.newCall(request);
    //4.非同步請求,請求加入排程
    call.enqueue(new Callback() {
        @Override//請求失敗回撥
        public void onFailure(Call call, IOException e) {
            handler.sendEmptyMessage(FALL);
        }

        @Override//請求成功回撥
        public void onResponse(Call call, Response response) throws IOException {
            //得到從網上獲取資源,轉換成我們想要的型別
            byte[] Picture_bt = response.body().bytes();
            //通過handler更新UI
            Message message = handler.obtainMessage();
            message.obj = Picture_bt;
            message.what = SUCCESS;
            handler.sendMessage(message);

        }
    });
}

//當按鈕點選時,執行使用OKhttp上傳圖片到伺服器(http://blog.csdn.net/tangxl2008008/article/details/51777355)
//注意:有時候上傳圖片失敗,是伺服器規定還要上傳一個Key,如果開發中關於網路這一塊出現問題,就多和麵試官溝通溝通
public void uploading(View view) {
    //圖片上傳介面地址
    String url = "https://www.718shop.com/sell/sell.m.picture.upload.do";
    //建立上傳檔案物件
    File file = new File(Environment.getExternalStorageDirectory(), "big.jpg");

    //建立RequestBody封裝引數
    RequestBody fileBody = RequestBody.create(MediaType.parse("application/octet-stream"), file);
    //建立MultipartBody,給RequestBody進行設定
    MultipartBody multipartBody = new MultipartBody.Builder()
            .setType(MultipartBody.FORM)
            .addFormDataPart("image", "big.jpg", fileBody)
            .build();
    //建立Request
    Request request = new Request.Builder()
            .url(url)
            .post(multipartBody)
            .build();

    //建立okhttp物件
    OkHttpClient okHttpClient = new OkHttpClient.Builder()
            .connectTimeout(10, TimeUnit.SECONDS)
            .readTimeout(10, TimeUnit.SECONDS)
            .writeTimeout(10, TimeUnit.SECONDS)
            .build();

    //上傳完圖片,得到伺服器反饋資料
    okHttpClient.newCall(request).enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            Log.e("hao", "uploadMultiFile() e=" + e);
        }

        @Override
        public void onResponse(Call call, Response response) throws IOException {
            Log.i("hao", "成功了=" + response.body().string());
        }
    });


}

}