2012-09-14 78 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的字符串可能非常大,有時它們不會完全發送。所以這就是爲什麼將它們上傳爲文件是更好的選擇。 –

相關問題