2012-09-14 48 views
6

您好,我正在发送图像和文本到php webservice使用以下代码。如何发送多个图像到服务器使用MultipartEntity从android

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个图像和文字。

例子: - 图像1 - 文本1
镜像2 - 文本2等。

所以我混淆如何逐一在最终提交点击发送与之相关的服务器的图像和文字来存储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; 
} 

所以最后我坚持这个请大家帮忙。

+0

[上传多个文件到服务器](http://www.coderzheaven.com/2011/08/16/how-to-upload-multiple-files-in-one-request-along-with-other-string -parameters-in-android /)[该jar文件需要添加为此](http://stackoverflow.com/questions/2017414/post-multipart-request-with-android-sdk)这有助于你在解决你的问题。 – Harish

回答

0

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

0

尝试增加YOUT php.ini文件的post_max_size设置WAMP服务器

-1

请找到下面的方法...这里I M使用AQUERY发送​​多发的图像文件。最好的lib执行所有后台网络相关的任务(如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(); 
      } 

    } 
+0

感谢分享兄弟:) –

0

对于全部细节,请对我的文章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"); 

    } 
} 

//);

  • 压缩的图像和获取位图我提出以下funtion *

    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); 
        } 
    
+0

你的链接显示'账户被暂停' – MilapTank

+0

为什么你不能只是创建你的图像的json对象数组到base64和张贴到服务器和在你的服务器API读取这些图像转换为字节和使用作为图像。 –

0

为什么你可以' t只需创建图像的json对象数组到base64并发布到服务器并在您的服务器上api读取这些图像转换为字节并用作图像。 检查我的回答并尝试实施。 In Android how to post data to webservice which is created in WCF?

而你从相机获得的图像存储在uri中的SD卡和信件读取它们。您可以分配图像名称。并从uri读取它们。

+0

,因为对于较大的图像,基数64的字符串可能非常大,有时它们不会完全发送。所以这就是为什么将它们上传为文件是更好的选择。 –

相关问题