【问题标题】:How to send multiple images to server using MultipartEntity from android如何使用来自 android 的 MultipartEntity 将多个图像发送到服务器
【发布时间】:2012-09-07 12:02:47
【问题描述】:

我正在使用以下代码将图像和文本发送到 PHP 网络服务。

try {       
    HttpClient httpClient = new DefaultHttpClient();
    HttpContext localContext = new BasicHttpContext();
    HttpPost httpPost = new HttpPost(URL);

    MultipartEntity entity = new MultipartEntity(
            HttpMultipartMode.BROWSER_COMPATIBLE);

    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    bitmap.compress(CompressFormat.JPEG, 75, bos);
    byte[] data = bos.toByteArray();

    entity.addPart("files[]",
            new ByteArrayBody(data, "myImage.jpg"));

    entity.addPart("message0", new StringBody(caption.getText()
            .toString()));

    httpPost.setEntity(entity);
    HttpResponse response = httpClient.execute(httpPost,
            localContext);
    BufferedReader reader = new BufferedReader(
            new InputStreamReader(
                    response.getEntity().getContent(), "UTF-8"));

    String sResponse = reader.readLine();
    return sResponse;
} catch (Exception e) {
    if (dialog.isShowing())
        dialog.dismiss();
    Toast.makeText(ImageUpload.this, e.getMessage(),
            Toast.LENGTH_LONG).show();
    Log.e(e.getClass().getName(), e.getMessage(), e);
    return null;
}
    }

完美运行。但这仅适用于一张图像。我要发送 5 张图片。

示例:Image1 - Text1 Image2 - Text2等..

所以我很困惑如何一张一张地存储 5 张图像,然后单击按钮,将这些图像和与它们关联的文本发送到服务器。

我正在从手机的相机中获取图像。

Intent intent = new Intent();
            intent.setType("image/*");
            intent.setAction(Intent.ACTION_GET_CONTENT);
            startActivityForResult(
                    Intent.createChooser(intent, "Select Picture"),
                    PICK_IMAGE);


public void onActivityResult_photo(int requestCode, int resultCode,
        Intent data) {
    // TODO Auto-generated method stub
    if (resultCode == RESULT_OK) {

        if (data != null) {
            mImageCaptureUri = data.getData();
            display(mImageCaptureUri);
        } else {
            Toast.makeText(CustomTabActivity.mTabHost.getContext(),
                    "No photo selected..", Toast.LENGTH_SHORT).show();
        }

    }

}


private String display(Uri mImageCaptureUri2) {
    // TODO Auto-generated method stub
    String base64string = null;
    try {

        if (mImageCaptureUri2 != null) {

            System.gc();

            selectedImagePath = getPath(mImageCaptureUri2);

            File filenew = new File(selectedImagePath);
            int file_size = Integer.parseInt(String.valueOf(filenew
                    .length() / 1024));
            if (file_size <= 10000) {
                PD1 = ProgressDialog.show(
                        CustomTabActivity.mTabHost.getContext(), "",
                        "Loading...");
                Handler refresh = new Handler(Looper.getMainLooper());

                refresh.post(new Runnable() {
                    public void run() {

                        PD1.setCancelable(true);
                        Bitmap newbitmap;
                        newbitmap = decodeFile(selectedImagePath);
                        ByteArrayOutputStream bs = new ByteArrayOutputStream();
                        newbitmap.compress(Bitmap.CompressFormat.PNG, 50,
                                bs);
                        img.setVisibility(View.VISIBLE);
                        img.setImageBitmap(newbitmap);
                        byte[] abc = bitmapToByteArray(newbitmap);
                        if (txt_phototext.getText().toString().equals("")) {
                            submit.put(abc, "");
                        } else {
                            submit.put(abc, txt_phototext.getText()
                                    .toString());

                            // executeMultipartPost();
                        }
                        PD1.dismiss();

                    }
                });

            } else {
                AlertDialog.Builder alertbox = new AlertDialog.Builder(
                        CustomTabActivity.mTabHost.getContext());
                alertbox.setMessage("Take Image Size Less than 10 MB");
                alertbox.setNeutralButton("Ok",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface arg0,
                                    int arg1) {
                                finish();
                            }
                        });
                alertbox.show();
            }

        } else {
            System.out.println("===============NULL========");
        }

    } catch (Exception e) {
        // // TODO Auto-generated catch block
        // e.printStackTrace();
    }
    return base64string;
}


    static Bitmap decodeFile(String str) {
    try {
        // decode image size
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;
        BitmapFactory.decodeStream(new FileInputStream(str), null, o);

        // Find the correct scale value. It should be the power of 2.
        final int REQUIRED_SIZE = 70;
        int width_tmp = o.outWidth, height_tmp = o.outHeight;
        int scale = 1;
        while (true) {
            if (width_tmp / 2 < REQUIRED_SIZE
                    || height_tmp / 2 < REQUIRED_SIZE)
                break;
            width_tmp /= 2;
            height_tmp /= 2;
            scale++;
        }

        // decode with inSampleSize
        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize = scale;
        return BitmapFactory.decodeStream(new FileInputStream(str), null,
                o2);
    } catch (FileNotFoundException e) {
    }
    return null;
}

public static byte[] bitmapToByteArray(Bitmap bitmap) {
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    bitmap.compress(CompressFormat.PNG, 0 /* ignored for PNG */, bos);
    byte[] bitmapdata = bos.toByteArray();
    return bitmapdata;
}

【问题讨论】:

标签: android


【解决方案1】:

尝试在 WAMP 服务器中增加 php.ini 文件的 post_max_size

【讨论】:

    【解决方案2】:

    为什么您不能只将图像的 json 对象数组创建到 base64 并发布到服务器,然后在您的服务器 api 读取这些图像转换为字节并用作图像。 检查我的答案并尝试实施。 In Android how to post data to webservice which is created in WCF?

    您从相机获取的图像将它们存储在 uri 中的 sdcard 中,然后用字母读取它们。您可以按顺序分配图像名称。并从 uri 中读取它们。

    【讨论】:

    • 因为对于较大的图像,base 64 字符串可能非常大,有时它们不会完全发送。所以这就是为什么将它们作为文件上传是一个更好的选择。
    【解决方案3】:

    详情请看我的帖子 Click here

    使用 MultipartEntity 将多个图像发送到服务器非常困难。我确实搜索过这个但没有找到任何正确的解决方案然后我用自己的方式将多个图像发送到服务器 ,在这里我将选定路径的数组发送到 asynctask,并在 asynctask 中将图像发送到服务器

    调用Asysnctask函数- 新的 Upload_Multiple.excute(Array_of_Path[]))

        Private class Upload_Multiple_img extends AsyncTask<String, Void, String> {
    
        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub
            super.onPreExecute();
    
        }
    
        protected String doInBackground(String... paths_array) {
    
    
    
            String data = "";
    
            for (int i = 0; i < paths_array.length; i++) {
    
                //  get_Picture_bitmap() returns bitmap by passing path of image 
                 //   get_Picture_bitmap() is mentioned below. 
                Bitmap bitmap = get_Picture_bitmap(paths_array[i]);
    
                ByteArrayOutputStream stream = new ByteArrayOutputStream();
    
                bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
                InputStream in = new ByteArrayInputStream(stream.toByteArray()); // convert
    
                DefaultHttpClient httpclient = new DefaultHttpClient();
    
                String server_funtion_url="...serveraddres"+funtion_at_server"";
                HttpPost httppost = new HttpPost(server_funtion_url); // server
    
                MultipartEntity reqEntity = new MultipartEntity();
    
                obj_SP = ImagePicker.this.getSharedPreferences("Eperty", 0);
    
                String id_prop = obj_SP.getString("new_prop_id", "");
    
                String Image_Name =
                        + String.valueOf(System.currentTimeMillis()) + ".jpg";
    // image is a key which is used at server end to get this 
                reqEntity.addPart("image", Image_Name, in);
    
                httppost.setEntity(reqEntity);
    
                HttpResponse response = null;
                try {
                    response = httpclient.execute(httppost);
                    data = EntityUtils.toString(response.getEntity());
                    System.out.println("FFFF== " + data);
    
                } catch (ClientProtocolException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (ParseException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
    
                }
    
            }
    
            return data;
        }
    
        @Override
        protected void onProgressUpdate(Void... values) {
    
            super.onProgressUpdate(values);
        }
    
        @Override
        protected void onPostExecute(String result) {
    
            ConstantData.ToastAlert(ImagePicker.this,
                    "Images Uploaded successfully");
    
        }
    }
    

    //);

    • 用于压缩图像并为我在下面制作的位图*

      public Bitmap get_Picture_bitmap(String imagePath) {
      
      long size_file = getFileSize(new File(imagePath));
      
      size_file = (size_file) / 1000;// in Kb now
      int ample_size = 1;
      
      if (size_file <= 250) {
      
          System.out.println("SSSSS1111= " + size_file);
          ample_size = 2;
      
      } else if (size_file > 251 && size_file < 1500) {
      
          System.out.println("SSSSS2222= " + size_file);
          ample_size = 4;
      
      } else if (size_file >= 1500 && size_file < 3000) {
      
          System.out.println("SSSSS3333= " + size_file);
          ample_size = 8;
      
      } else if (size_file >= 3000 && size_file <= 4500) {
      
          System.out.println("SSSSS4444= " + size_file);
          ample_size = 12;
      
      } else if (size_file >= 4500) {
      
          System.out.println("SSSSS4444= " + size_file);
          ample_size = 16;
      }
      
      Bitmap bitmap = null;
      
      BitmapFactory.Options bitoption = new BitmapFactory.Options();
      bitoption.inSampleSize = ample_size;
      
      Bitmap bitmapPhoto = BitmapFactory.decodeFile(imagePath, bitoption);
      
      ExifInterface exif = null;
      try {
          exif = new ExifInterface(imagePath);
      } catch (IOException e) {
          // Auto-generated catch block
          e.printStackTrace();
      }
      int orientation = exif
              .getAttributeInt(ExifInterface.TAG_ORIENTATION, 1);
      Matrix matrix = new Matrix();
      
      if ((orientation == 3)) {
          matrix.postRotate(180);
          bitmap = Bitmap.createBitmap(bitmapPhoto, 0, 0,
                  bitmapPhoto.getWidth(), bitmapPhoto.getHeight(), matrix,
                  true);
      
      } else if (orientation == 6) {
          matrix.postRotate(90);
          bitmap = Bitmap.createBitmap(bitmapPhoto, 0, 0,
                  bitmapPhoto.getWidth(), bitmapPhoto.getHeight(), matrix,
                  true);
      
      } else if (orientation == 8) {
          matrix.postRotate(270);
          bitmap = Bitmap.createBitmap(bitmapPhoto, 0, 0,
                  bitmapPhoto.getWidth(), bitmapPhoto.getHeight(), matrix,
                  true);
      
      } else {
          matrix.postRotate(0);
          bitmap = Bitmap.createBitmap(bitmapPhoto, 0, 0,
                  bitmapPhoto.getWidth(), bitmapPhoto.getHeight(), matrix,
                  true);
      
      }
      
      return bitmap;
      

      } **

    • 服务器端代码 *

      $target_dir = "../webadmin/user_image/";
      $target_dir = $target_dir . basename($_FILES["user_img"]["name"]);
      if(move_uploaded_file($_FILES["image"]["tmp_name"], $target_dir))
        {
           $msg = "The file ". basename($result[0]). " has been uploaded.";
           $send_arr['success'] = 1;
           $send_arr['message'] = $msg;
           echo json_encode($send_arr);
        }
      else 
        {
           $msg = "Sorry, there was an error uploading your file.";
           $send_arr['success'] = 0;
           $send_arr['message'] = $msg;
           echo json_encode($send_arr);
        }
      

    【讨论】:

    • 为什么你不能只创建图像的 json 对象数组到 base64 并发布到服务器,然后在你的服务器 api 读取这些图像转换为字节并用作图像。
    【解决方案4】:

    请找到以下方法...这里我使用 AQUERY 发送多个图像文件。执行所有后台网络相关任务的最佳库。(如 AJAX)。

    https://code.google.com/p/android-query/

       public void uploadImageFile( String filePath,
                String message) {
    
            Context context = ApplicationContextProvider.getContext();
            String url = SERVER_URL + "/user/uploadImageFile";
    
    
                try {
                    Toast.makeText(context, "Uploading...", Toast.LENGTH_SHORT)
                            .show();
    
                    String compressedFile = CommonUtilities.compressImage(filePath,
                            context);
    
                    Map<String, Object> params = new HashMap<String, Object>();
    
    
                    File imageFile = new File(compressedFile);
                    byte[] imageBytes1 = FileUtils.readFileToByteArray(imageFile);
                    params.put("imageBytes", imageBytes1);
                    params.put("message",URLEncoder.encode(message, "UTF-8"));
    
    
                    AQuery aq = new AQuery(context);
                    aq.ajax(url, params, JSONObject.class,
                            new AjaxCallback<JSONObject>() {
                                @Override
                                public void callback(String url, JSONObject json,
                                        AjaxStatus status) {
                                    Toast.makeText(
                                            ApplicationContextProvider.getContext(),
                                            "Uploaded successfully",
                                            Toast.LENGTH_SHORT).show();
    
    
    
                                }
                            });
                } catch (Exception e) {
                    e.printStackTrace();
                    Toast.makeText(context, e.getMessage(), Toast.LENGTH_SHORT)
                            .show();
                }
    
        }
    

    【讨论】:

      【解决方案5】:

      并确保您在服务器中的目录或文件夹是可执行、可写和可读的。我认为这是主要问题。这称为 777 许可。相信我,这与其他要考虑的事情一样重要。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-26
        • 1970-01-01
        • 1970-01-01
        • 2018-06-17
        • 1970-01-01
        相关资源
        最近更新 更多