天天看點

簡單使用Okgo上傳下載下傳檔案

okgo概念性的東西我就不贅述了,百度一大堆,直接上具體的使用過程。

首先引入依賴:

implementation 'com.lzy.net:okgo:+'
           

我不知道這個版本号,是以直接用+來擷取最新版本了。

引入依賴後需要在Application中初始化:

OkGo.getInstance().init(this);
           

摒棄所有花裡胡哨的操作,要在application的oncreate()方法中初始化okgo就可以了。

因為上一篇已經開啟了本地伺服器了,是以這裡就直接使用本地伺服器的位址了。使用NanoHttpd在Android項目中搭建伺服器,需要在項目中搭建伺服器的可以去了解一下哈,雖然寫得有點水。

上傳功能:

String serverIP = getIpAddress();//擷取本機ip位址
String strDBPath = MyApplication.GetApp().getExternalFilesDir(null) + "/TIS-Smarthome/" + choose + "/" + (choose + ".db3");//資料庫位址
            final String strDBPath2 = MyApplication.GetApp().getExternalFilesDir(null) + "/TIS-Smarthome/" + "upload/";//檔案上傳的路徑
            String urlNano = "http://" + serverIP + ":8080";    //8080nanohttpd的端口号
            File file = new File(strDBPath);//執行個體化資料庫檔案
            List<File> fileList = new ArrayList<File>();//添加到arraylist裡面
            fileList.add(file);//把檔案添加到Filelist中

//        }
//            File fileTest = new File("/sdcard/xda.txt");



            //post上傳檔案
            OkGo.<File>post(/*url*/urlNano)
//                    .tag(DatabaseSelectUpload.class)
//                    .headers("header1", "headerValue1")
//                    .params("db3",file)
//                    .isMultipart(true)
//                    .params("securityCode",pblvariables.security_code)/*驗證碼*/
//                    .params("Remark",choose)/*資料庫名稱*/
//                    .upFile(file/*fileTest*/)       /*使用up開頭的方法 所有的params設定的參數将丢失 是以兩種方法不能混用 */
                    .addFileParams("fileOfdatabase",fileList)
                    .execute(new FileCallback(strDBPath2,choose+".db3") {//指定上傳的路徑 上傳的檔案名
                         @Override
                        public void onSuccess(Response<File> response) {
                             //UI線程 ,請求成功後回調
                             handleResponse(response);// 該方法能夠顯示成功時的請求狀态,請求頭,響應資料以及響應頭資訊
                             File result = response.body(); // 擷取資料
                             Log.i("randomcode","上傳成功1 " + result);
                             Toast.makeText(DatabaseSelectUpload.this,"Success!",Toast.LENGTH_SHORT).show();

                         }

                        @Override
                        public void onError(Response<File> response) {
                            super.onError(response);
                            //UI線程 ,請求失敗後回調
                            Log.i("randomcode","上傳失敗1 " + response.body());
                            Toast.makeText(DatabaseSelectUpload.this,"Fail!",Toast.LENGTH_SHORT).show();
                        }


                        @Override
                        public void onFinish() {
                            super.onFinish();
                            //UI線程 ,請求結束後回調,無論網絡請求還是失敗都會調用
                            finish();//結束目前頁面
                        }
                    });
           

我上面傳入的serverip位址是裝置的ip,也就是說通路的是區域網路内的伺服器。擷取方法百度一堆,懶的找的直接複制下面這個方法:

/**
     * @Title: getIpAddress
     *
     * @Description: 擷取裝置ip位址
     *
     * @return String
     */
    public static String getIpAddress() {
        try {
            for (Enumeration<NetworkInterface> enNetI = NetworkInterface.getNetworkInterfaces(); enNetI
                    .hasMoreElements();) {
                NetworkInterface netI = enNetI.nextElement();
                for (Enumeration<InetAddress> enumIpAddr = netI.getInetAddresses(); enumIpAddr.hasMoreElements();) {
                    InetAddress inetAddress = enumIpAddr.nextElement();
                    if (inetAddress instanceof Inet4Address &&!inetAddress.isLoopbackAddress()) {
                        return inetAddress.getHostAddress();
                    }
                }
            }
        } catch (SocketException e) {
            e.printStackTrace();
        }
        return "";
    }
           

下載下傳功能:

private void downLoadDatabase() {
 final String choose = DatabaseSelectUpload.name_.get(0);//這裡給個寫死的名稱 真實的自己擷取或者設定
        String serverIP = getIpAddress();
        String url = "http://" + serverIP + ":8080";
         String strDBPath3 = MyApplication.GetApp().getExternalFilesDir(null) + "/TIS- Smarthome/"+"download";//下載下傳路徑
  OkGo.<File>get(url)
                /*.tag(this)
                .headers("header1", "headerValue1")
                .params("db3", String.valueOf(new File(strDBPath)))
                    .params("securityCode",pblvariables.security_code)*//*驗證碼*//*
                    .params("Remark",choose)*//*資料庫名稱*/
                .execute(new FileCallback(strDBPath3,choose/*+"_1"*/+".db3") {   //指定下載下傳的路徑  下載下傳檔案名
                    @Override
                    public void onSuccess(Response<File> response) {
                        Toast.makeText(TransferActivity.this,"dowmload database success",Toast.LENGTH_SHORT).show();
                        Log.i("randomcode","下載下傳成功1 " + response.body());
  }

                    @Override
                    public void onError(Response<File> response) {
                        super.onError(response);
                        Toast.makeText(TransferActivity.this,"dowmload database fail",Toast.LENGTH_SHORT).show();
                        Log.i("randomcode","下載下傳失敗1 " + response.body());
                    }
                });
}
           

 這樣就完事了,url就是你的伺服器位址。可指定上傳下載下傳的路徑和檔案名稱。運作程式,成功的話會在對應目錄下找到上傳下載下傳的檔案。