1. 程式人生 > >OKhttp post上傳檔案

OKhttp post上傳檔案

 /**
     * java.io.FileNotFoundException: /storage/emulated/0/note01.md: open failed: EACCES (Permission denied)
     * 檔案未找到的異常....開啟失敗了....許可權拒絕
     *
     * 6.0以後許可權是執行時許可權...
     * ------------1.把targetSdk版本改到23以下
     * ------------2.http://www.jianshu.com/p/a51593817825 使用執行時許可權
     *
     * 圖片:改變檔案的型別,,,,在換掉一個支援圖片上傳的地址
     *
     * 多張圖片.....迴圈上傳
     *
     * @param view

     */

//點選按鈕

  public void postShangChuan(View view) {


        //A.檢查使用者是否已經允許了許可權....PackageManager.PERMISSION_GRANTED代表的是使用者已經允許


        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            //B.不允許...的時候,,,請求使用者允許這個許可權
            // Activity arg0代表當前的activity, @NonNull String[] arg1請求的許可權的陣列,也就是需要請求允許哪些許可權, int arg2請求碼
            ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1001);


        }else {
            //允許...上傳檔案
            postFile();
        }

   //允許...上傳檔案

 private void postFile() {
        //1.
        OkHttpClient okHttpClient = new OkHttpClient();


        //2.指定檔案的型別 image/jpg image/png video/mp4 ...mimeType
        MediaType mediaType = MediaType.parse("text/x-markdown;charset=utf-8");
        //3.指定要上傳的檔案物件
        File file = new File(Environment.getExternalStorageDirectory(),"note01.md");


        Request request = new Request.Builder()
                //上傳檔案的時候請求體使用RequestBody.create()獲取okhttp3.MediaType contentType 檔案的型別,@NotNull java.io.File file上傳的檔案物件
                .post(RequestBody.create(mediaType, file))
                .url("https://api.github.com/markdown/raw")
                .build();


        //4.
        Call call = okHttpClient.newCall(request);


        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                e.printStackTrace();
            }


            @Override
            public void onResponse(Call call, final Response response) throws IOException {
                if (response.isSuccessful()){


                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            try {
                                Toast.makeText(MainActivity.this,response.body().string(),Toast.LENGTH_SHORT).show();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                    });
                }
            }

  /**
     * C.請求許可權的結果....可以獲取到使用者是否允許了許可權
     */
    @TargetApi(23)
    @Override
    public void onRequestPermissionsResult(int requestCode,String[] permissions, int[] grantResults) {


        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 1001) {
            //grantResults使用者允許許可權的返回值....數組裡面放的是使用者是否允許許可權
            //PackageManager.PERMISSION_GRANTED允許許可權
            if (grantResults.length>0 && grantResults[0]==PackageManager.PERMISSION_GRANTED) {


                //上傳
                postFile();


            }else {
                Toast.makeText(MainActivity.this, "拒絕", Toast.LENGTH_SHORT).show();
            }
        }


    }