1. 程式人生 > >okhttp2.6使用get和post 上傳和下載檔案 普通的下載

okhttp2.6使用get和post 上傳和下載檔案 普通的下載

為了寫部落格所以沒有封裝  使用的時候OkHttpClien() new 一次就可以了 不用new很多次
    implementation 'com.squareup.okhttp:okhttp:2.6.0'
public void downPhotos(String url, String path, String photosName) throws IOException {
        long fileSize;
        File out = new File(path, photosName + ".mp4");
        Log.e(TAG, "downPhotos: " + out.getPath());
        URL myURL = new URL(url);
        URLConnection conn = myURL.openConnection();
        conn.connect();
        InputStream is = conn.getInputStream();
        fileSize = conn.getContentLength();
        if (fileSize <= 0)
            throw new RuntimeException("can not know the file`s size");
        if (is == null)
            throw new RuntimeException("stream is null");
        FileOutputStream fos = new FileOutputStream(out);
        byte buf[] = new byte[1024];
        do {
            // 迴圈讀取
            int numread = is.read(buf);
            if (numread == -1) {
                break;
            }
            fos.write(buf, 0, numread);
        } while (true);
        try {
            is.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    private void initView() {
        mBtDown = (Button) findViewById(R.id.bt_down);
        mBtDown.setOnClickListener(this);
    }

    private void downOneVideo(final String url) {

        new Thread() {
            @Override
            public void run() {
                super.run();
                try {
                    downPhotos(url, Environment.getExternalStorageDirectory().getAbsolutePath(), "vodeo");
                } catch (IOException e) {
                    e.printStackTrace();
                    Log.e(TAG, "run: " + e);
                }
            }
        }.start();
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            default:
                break;
            case R.id.bt_down:
                initData();
                break;
        }
    }


    public void doGet(String url) {
        //1 拿到okhttpCLien物件
//        實際上建立一個成員變數即可 為了寫部落格 所以我寫了很多個
        OkHttpClient okHttpClient = new OkHttpClient();
        //2 構建Request
        Request.Builder builder = new Request.Builder();
        final Request request = builder.get().url(url).build();
        //3 講request 物件分裝成call
        Call call = okHttpClient.newCall(request);
//        直接執行
//        call.execute();
//        非同步操作
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Request request, IOException e) {
                L.e("onFailure" + e.getMessage());
            }

            @Override
            public void onResponse(Response response) throws IOException {
                L.e("onResponse");
                String res = null;
                try {
                    res = response.body().string();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                L.e("onResponse" + res);
            }
        });

    }

    public void doPost(String url) {
        //1 拿到okhttpCLien物件
        OkHttpClient okHttpClient = new OkHttpClient();
        //2 構建Request
        //2.1 構建RequestBody
//        持久化session

        okHttpClient.setCookieHandler(new CookieManager(null, CookiePolicy.ACCEPT_ALL));

        FormEncodingBuilder formEncodingBuilder = new FormEncodingBuilder();

        RequestBody requestBody = formEncodingBuilder.add("userName", "123").add("password", "123").build();
        Request.Builder builder = new Request.Builder();
        Request request = builder.url(url).post(requestBody).build();
        Call call = okHttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Request request, IOException e) {

            }

            @Override
            public void onResponse(Response response) throws IOException {

            }
        });

    }


    public void doPostString(String url) {

        RequestBody requestBody = RequestBody.create(MediaType.parse("text/plan;chaset=utf-8"), "{username:aaa,password:123}");
        Request.Builder builder = new Request.Builder();
        Request request = builder.url(url).post(requestBody).build();
        Call call = new OkHttpClient().newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Request request, IOException e) {

            }

            @Override
            public void onResponse(Response response) throws IOException {

            }
        });
    }


    public void doPostFile(String url, File file) {
        if (!file.exists()) {
            L.e(file.getName() + "not exitst!");
            return;
        }
//        mime type
        RequestBody requestBody = RequestBody.create(MediaType.parse("application/octet-stream"), file);
        Request.Builder builder = new Request.Builder();
        Request request = builder.url(url).post(requestBody).build();
        Call call = new OkHttpClient().newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Request request, IOException e) {

            }

            @Override
            public void onResponse(Response response) throws IOException {

            }
        });
    }

    public void doUpload(String url, File file) {
        if (!file.exists()) {
            L.e(file.getName() + "not exitst!");
            return;
        }

        MultipartBuilder multipartBuilder = new MultipartBuilder();
        RequestBody requestBody = multipartBuilder
                .type(MultipartBuilder.FORM)
                .addFormDataPart("username", "aaa")
                .addFormDataPart("password", "123")
                .addFormDataPart("mPhoto", "test.jpg", RequestBody.create(MediaType.parse("application/octet-stream"), file)).build();
//        mime type

        CountingRequestBody countingRequestBody = new CountingRequestBody(requestBody, new CountingRequestBody.Listener() {
            @Override
            public void onRequestProgress(long byteWrited, long contentLength) {
                L.e(byteWrited + "/" + contentLength);
            }
        });

        Request.Builder builder = new Request.Builder();
        Request request = builder.url(url).post(countingRequestBody).build();
        Call call = new OkHttpClient().newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Request request, IOException e) {

            }

            @Override
            public void onResponse(Response response) throws IOException {

            }
        });
    }

    public void doDownLoad(String url) {

        Request.Builder builder = new Request.Builder();
        Request request = builder.get().url(url).build();
        Call call = new OkHttpClient().newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Request request, IOException e) {

            }

            @Override
            public void onResponse(Response response) throws IOException {
                long total = response.body().contentLength();
                long sum=0L;
                InputStream is = response.body().byteStream();
                int len = 0;
                File file = new File(Environment.getExternalStorageDirectory(), "down12306.jpg");
                byte[] buf = new byte[128];
                FileOutputStream fos = new FileOutputStream(file);
                while ((len = is.read(buf)) != -1) {
                    fos.write(buf, 0, len);
                    sum+=len;
                    L.e(sum+"/"+total);
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {

                        }
                    });
                }
                fos.flush();
                fos.close();
                is.close();
                L.e("downSucess");
            }
        });

    }


    public void doDownLoadImageView(String url) {

        Request.Builder builder = new Request.Builder();
        Request request = builder.get().url(url).build();
        Call call = new OkHttpClient().newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Request request, IOException e) {

            }

            @Override
            public void onResponse(Response response) throws IOException {
                InputStream is = response.body().byteStream();
//                圖片載入
//                BitmapFactory.Options
                Bitmap bitmap = BitmapFactory.decodeStream(is);
//                is.mark();
//                is.reset();
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {

                    }
                });
            }
        });

    }
package com.example.liuan.downvideo.net;

import android.net.sip.SipSession;

import com.squareup.okhttp.MediaType;
import com.squareup.okhttp.RequestBody;

import java.io.IOException;

import okio.Buffer;
import okio.BufferedSink;
import okio.ForwardingSink;
import okio.Okio;
import okio.Sink;

/**
 * Created by liuan on 2018/4/14.
 */

public class CountingRequestBody extends RequestBody {


    protected RequestBody delegate;
    private Listener listener;
    private ConuntingSink conuntingSink;
    public CountingRequestBody(RequestBody delegate,Listener listener) {
        this.listener = listener;
        this.delegate = delegate;
    }
    public static interface Listener{
        void  onRequestProgress(long byteWrited,long contentLength);

    }
    @Override
    public MediaType contentType() {
        return delegate.contentType();
    }

    @Override
    public long contentLength() {
        try {
            return delegate.contentLength();
        } catch (IOException e) {
            return -1;
        }
    }

    @Override
    public void writeTo(BufferedSink sink) throws IOException {
        conuntingSink=new ConuntingSink(sink);
        BufferedSink bufferedSink= Okio.buffer(conuntingSink);
        delegate.writeTo(bufferedSink);
        bufferedSink.flush();
    }
    protected final class ConuntingSink extends ForwardingSink{
        private long bytesWritten;

        public ConuntingSink(Sink delegate) {
            super(delegate);
        }

        @Override
        public void write(Buffer source, long byteCount) throws IOException {
            super.write(source, byteCount);
            bytesWritten+=byteCount;
            listener.onRequestProgress(bytesWritten,contentLength());
        }
    }
}