2012-09-14 14 views
6

Hola estoy enviando imágenes y texto al servicio web php utilizando el siguiente código.Cómo enviar varias imágenes al servidor usando MultipartEntity desde 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; 
     } 

    } 

Funciona perfectamente. Pero esto es solo para enviar una imagen. Ahora envío 5 imágenes y texto con él.

Ejemplo: - Image1 - Texto1
Image2 - Texto 2 etc ..

Así que estoy confundir sobre cómo almacenar 5 imágenes una por una y, al final de presentar haga clic en enviar imágenes y texto asociados al servidor.

Me sale obtener solo la imagen de la cámara.

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; 
} 

Así que finalmente estoy atascado sobre esto, por favor ayuda.

+0

[Subir archivos múltiples al servidor] (http://www.coderzheaven.com/2011/08/16/how-to-upload-multiple-files-in-one-request-along-with-other-string -parameters-in-android /) [Los archivos jar deben agregarse para esto] (http://stackoverflow.com/questions/2017414/post-multipart-request-with-android-sdk) esto le ayudará a resolver su problema problema. – Harish

Respuesta

0

Y asegúrese de que su directorio o carpeta en el servidor sea Ejecutable, Escritable y Legible. Tuve esto como el principal problema. Esto se llama permiso 777. Créanme, esto es tan importante como otras cosas a considerar.

0

intente aumentar el post_max_size del archivo php.ini en yout servidor WAMP

-1

Por favor, encontrar el método más adelante aquí ... I m envío de archivo de imagen utilizando mutiple AQUERY. La mejor lib para realizar todas las tareas relacionadas con la red de fondo. (Como 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

Gracias por compartir el hermano :) –

0

Por todo detalle por favor, eche un vistazo a mi postClick here

es bastante difícil enviar varias imágenes al servidor usando MultipartEntity. Yo busco para esto, pero no encontré ninguna solución correcta entonces hice mi propia manera de enviar varias imágenes al servidor , aquí que envío serie de rutas seleccionadas a AsyncTask y en AsyncTask i enviado imágenes al servidor

Calling Asysnctask Función- nuevo 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"); 

    } 
} 

//);

  • Para comprimir las imágenes de mapa de bits y conseguir que hice para a continuación 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; 
    

    } **

  • servidor de código de fin *

    $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

su enlace es muestra 'Cuenta suspendida' – MilapTank

+0

¿Por qué no puede simplemente crear una matriz de json objeto de sus imágenes a base64 y publicar en el servidor y en su servidor api leer esas imágenes convertir en byte y utilizar como imagen. –

0

Por qué puedes ' Solo crea una matriz de objetos JSON de tus imágenes en base64 y publícalas en el servidor y en tu api del servidor, lee esas imágenes convertidas en byte y utilízalas como imagen. Verifique mi respuesta e intente implementarlo. In Android how to post data to webservice which is created in WCF?

Y las imágenes que obtiene de la cámara las guardan en uri en sdcard y las leen. Puede asignar el nombre de la imagen secuencialmente. Y léelos de uri.

+0

porque para las imágenes más grandes, la cadena de base 64 puede ser muy grande y, a veces, no se envían por completo. Entonces, es por eso que subirlos como un archivo es una mejor opción. –

Cuestiones relacionadas