拍照並使用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 方法添加內容。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章