利用OKHttp实现 图片上传 ---b509小贴士

最近项目需要图片上传,向大家推荐个框架okHttp,挺好用的,至于下载方法,小盆友们自己百度吧,我这里简单介绍一下怎么在手机客户端,访问手机相册图片,以及向服务端上传图片的功能,废话不多说,,,

第一步、github下载okhttp的jar包(这里就不多说,百度)

第二部、新建工程。。。。(省略一万字)
简单布局如下

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:fitsSystemWindows="true"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.lockscreen.activity.UploadActivity">


    <Button
        android:text="从相册选择照片"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:id="@+id/button_get_photo"
        android:layout_margin="10dp"/>

    <Button
        android:text="上传"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:id="@+id/btn_upload_img"
        android:layout_margin="10dp"/>


    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:minHeight="200dp"
        android:minWidth="200dp"
        android:layout_gravity="center"
        android:id="@+id/imageView_camera"/>
</LinearLayout>

第三步、相应的java代码的实现(我这里用的主要是Okhttp3):

package com.lockscreen.activity;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

import com.lockscreen.R;

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

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

public class UploadActivity extends Activity implements View.OnClickListener {

    private Button btn_upload_img, mButtonGetPhoto;
    private ImageView mImageViewPhoto;
    //处理手机图片
    public static final int PHOTO_RESOUL = 3;
    public static final String IMAGE_UNSPECIFIED = "image/*";
    private Uri uri;
    //okhttp 上传图片
    private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");
    private final OkHttpClient client = new OkHttpClient();


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_upload);
        initUI();
    }

    //初始化UI
    private void initUI() {
        mButtonGetPhoto = (Button) findViewById(R.id.button_get_photo);
        btn_upload_img = (Button) findViewById(R.id.btn_upload_img);
        mImageViewPhoto = (ImageView) findViewById(R.id.imageView_camera);
        mButtonGetPhoto.setOnClickListener(this);
        btn_upload_img.setOnClickListener(this);
    }

    /**
     * 点击事件
     *
     * @param view
     */
    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.btn_upload_img:
                uploadImg();
                break;
            case R.id.button_get_photo:
                //获取本地相册
                Intent intent = new Intent(Intent.ACTION_PICK, null);
                intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, IMAGE_UNSPECIFIED);
                startActivityForResult(intent, PHOTO_RESOUL);
                Log.e("gaoyu", "调用相册成功");
                break;

        }

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        //处理结果
        if (requestCode == PHOTO_RESOUL) {
            uri = data.getData();
            if (uri != null) {
                mImageViewPhoto.setImageURI(uri);
                Log.e("gaoyu", "照片显示成功");
            }
        }
    }


    /**
     * 上传方法
     */
    private void uploadImg() {
        MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);
        File f = new File(String.valueOf(uri));
        if (f != null) {
            builder.addFormDataPart("img", f.getName(), RequestBody.create(MEDIA_TYPE_PNG, f));
        }

        MultipartBody requestBody = builder.build();
        //构建请求
        Request request = new Request.Builder()
                .url("这里放服务器地址")//地址
                .post(requestBody)//添加请求体
                .build();

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Toast.makeText(UploadActivity.this, "上传失败:e.getLocalizedMessage() = ", Toast.LENGTH_SHORT).show();
                Log.e("gaoyu", "上传失败:e.getLocalizedMessage() = "+e.getLocalizedMessage());
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                Toast.makeText(UploadActivity.this, "上传成功", Toast.LENGTH_SHORT).show();
                Log.e("gaoyu", "上传照片成功:response = "+ response.body().string());
            }
        });
    }
}

基本客户端需要的东西都在这了,如果需要服务端的实现可依据需关注
解释在代码里的注释已经很清楚了。。。thankyou! ———b509小贴士

猜你喜欢

转载自blog.csdn.net/gywuhengy/article/details/72781257