之前遇到需要上传图片到服务器的需要,特此记录~
首先是调用相机拍照,首先创建一个 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 方法添加内容。