1. 程式人生 > >使用者頭像上傳到伺服器

使用者頭像上傳到伺服器

每個應用都有這樣的功能,在我的介面,需要修改使用者頭像(拍照,選擇本地),將圖片上傳到伺服器.

  • 這就涉及到了好幾個問題:
  • 1.現在市面上好多手機已經是7.0系統,這裡我們就要注意一些相容處理,6.0動態許可權,7.0檔案安全
  • 2.圖片的上傳,這裡我使用okhttp

1.最好用的拍照Utils

  • 這裡我只貼上操作的程式碼,具體的utils類大家可以去copy,後面我會說到
  • 這裡我還用到了ios風格的底部選擇框
  • 這裡寫圖片描述
 CropImageUtils.getInstance().openAlbum(this); //開啟相簿
 CropImageUtils.getInstance().takePhoto(this
); //拍照
 @RequiresApi(api = Build.VERSION_CODES.KITKAT)
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        CropImageUtils.getInstance().onActivityResult(mContext, requestCode, resultCode, data, new
CropImageUtils.OnResultListener() { @Override public void takePhotoFinish(String path) { //拍照回撥,去裁剪 CropImageUtils.getInstance().cropPicture(mContext, path); } @Override public void selectPictureFinish(String path) { //相簿回撥,去裁剪
CropImageUtils.getInstance().cropPicture(mContext, path); } @Override public void cropPictureFinish(String path) { LogUtils.d("path", path + " ....."); //TODO 上傳圖片 SpUtil.putString(mContext, GlobalVariables.USER_ICON_FILE_PATH, path); // upload(path); } }); }
/**
     * 上傳圖片到伺服器
     *
     * @param path
     */
    private void upload(String path) {
        HashMap<String, Object> paramsMap = getMapParams(path);
        //TODO 1. 請求路徑url
        String request_url = "";
        MultipartBody.Builder builder = new MultipartBody.Builder();
        //設定型別(表單上傳)
        builder.setType(MultipartBody.FORM);
        //追加引數
        for (String key : paramsMap.keySet()) {
            Object object = paramsMap.get(key);
            if (!(object instanceof File)) {
                builder.addFormDataPart(key, object.toString());
            } else {
                File file = (File) object;
                builder.addFormDataPart(key, file.getName(), RequestBody.create(null, file));
            }
        }
        //建立RequestBody
        RequestBody body = builder.build();
        //建立Request
        final Request request = new Request.Builder().url(request_url).post(body).build();
        //單獨設定引數 比如讀取超時時間
        Call call = new OkHttpClient().newBuilder().writeTimeout(50, TimeUnit.SECONDS).build().newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                LogUtils.d("json", "上傳失敗");
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if (response.isSuccessful()) {
                    String string = response.body().string();
                    LogUtils.d("json", "上傳圖片成功: " + string);
                } else {
                    LogUtils.d("json", "上傳失敗");
                }
            }
        });
    }
    //TODO 2. 新增引數
    private HashMap<String, Object> getMapParams(String path) {
        HashMap<String, Object> params = new HashMap<>();
        //todo 這裡根據介面自己改變引數
        //        params.put("uid", uid);
        //        params.put("pwd", Encrypt.getMD5Str(pwd));
        //        params.put("bid", Constant.PRODUCT);
        //        params.put("cp", Constant.OS);
        //        params.put("cv", AndroidUtil.getVersionName(this));
        //        params.put("pkgname", this.getPackageName());
        //        params.put("imei", SystemUtil.getImei(this));
        //        params.put("imsi", SystemUtil.getImsi(this));
        //        params.put("netmode", SystemUtil.getNetworkName(this));
        //        params.put("ts", String.valueOf(System.currentTimeMillis() / 1000));
        File file = new File(path);
        if (file != null) {
            params.put("pic", file);
        }
        return params;
    }

2.結束