之前遇到需要上傳圖片到服務器的需要,特此記錄~
首先是調用相機拍照,首先創建一個 imageUri,並作爲參數傳入intent,這個 imageUri就是拍照時候照片的存儲路徑,拍攝完後就可以從這個 imageUri 獲得照片的路徑等信息了。
private void takePhoto() {
File outpuImage = FileUtil.createLookFile();
if(Build.VERSION.SDK_INT >= 24){
imageUri = FileProvider.getUriForFile(this,"com.example.hp.challengecup.fileprovider",outpuImage);
}else{
imageUri = Uri.fromFile(outpuImage);
}
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri);
startActivityForResult(intent,TAKE_PHOTO);
}
拍完後,我們可以在 onActivityResult 做處理,這裏省略。。
接下來就看看如何通過 imageUri 上傳照片吧~
private void uploadImg() {
String url = "http://192.168.1.104:8000/uphomeimg";
String path = imageUri.getPath();
FileUploadUtil.imageUpload(url,path,this);
}
首先 url 是服務器接收請求的路徑,path是剛拍攝的本地照片的路徑,第三個參數是context。接下來看 imageUpload方法:
public static void imageUpload(String url, String path, final Context context){
OkHttpClient mClient = new OkHttpClient();
File file = new File(path);
// 構建 MultipartBody
MultipartBody.Builder builder = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart(
"img",
file.getName(),
RequestBody.create(MediaType.parse("image/jpg"),file)
);
//使用 MultipartBody 構建 RequestBody
RequestBody requestBody = builder.build();
// 傳入 RequestBody
Request request = new Request.Builder()
.url(url)
.post(requestBody)
.build();
Call call = mClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
// Toast.makeText(context, "上傳失敗", Toast.LENGTH_SHORT).show();
Log.e("upload image", "上傳失敗:"+e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
// Toast.makeText(context, "上傳成功", Toast.LENGTH_SHORT).show();
Log.e("upload image", "上傳成功:"+response.body().string());
}
});
}
主要通過 MultipartBody.Builder 的 addFormDataPart 方法添加內容。