拍照并使用OkHttp上传图片到服务器

之前遇到需要上传图片到服务器的需要,特此记录~

首先是调用相机拍照,首先创建一个 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 方法添加内容。

 

你可能感兴趣的:(android)