使用者頭像上傳到伺服器
阿新 • • 發佈:2019-02-10
每個應用都有這樣的功能,在我的介面,需要修改使用者頭像(拍照,選擇本地),將圖片上傳到伺服器.
- 這就涉及到了好幾個問題:
- 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;
}