2012-07-25 70 views
0

我試圖發送一個圖像使用多部分,就像我在這裏讀到的https://stackoverflow.com/a/2937140/1552648,但是當它到達servlet時它並不需要任何東西。Android發送帶有httpPost的圖像到一個Servlet多部分

下面是Android的Java代碼,在那裏我發送一些文字和圖像,我有從德SD卡

private void enviarAlServidorConFoto(Incidencia incide, String IMG_URL){ 

    HttpClient httpClient = new DefaultHttpClient(); 

    HttpPost httpPost = new HttpPost(urlservidor + "AnyadirIncidenciaAndroid"); 

    try { 
     //MultipartEntity multiPart = new MultipartEntity(); 
     MultipartEntity multiPart = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); 

     multiPart.addPart("usuario", new StringBody(incide.getUsuario())); 
     multiPart.addPart("latitud", new StringBody(incide.getLatitud()+"")); 
     multiPart.addPart("longitud", new StringBody(incide.getLongitud()+"")); 
     multiPart.addPart("descripcion", new StringBody(incide.getDescripcion())); 
     multiPart.addPart("tipo", new StringBody(incide.getTipo())); 
     // YA la pongo desde la web a normal postParametros.add(new BasicNameValuePair("prioridad", value)); 
     multiPart.addPart("foto", new StringBody(incide.getFoto())); 
     //no se pasa el nombre de la foto, puesto que ya lo extraera cuando se mande la foto sola 
     multiPart.addPart("FotoIncidenciaAndroid", new FileBody(new File(IMG_URL))); 

     httpPost.setEntity(multiPart); 
    } catch (UnsupportedEncodingException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 

    try{  
     HttpResponse res = httpClient.execute(httpPost); 
     res.getEntity().getContent().close(); 
    } catch (ClientProtocolException e) { 
     e.printStackTrace(); 
    }catch (IOException e){ 
     e.printStackTrace(); 
     Log.d("EnviadoAweb", e.toString()); 
    } 
} 

的IMG_URL然後,這裏是多也該servlet。

@WebServlet(name="AnyadirIncidenciaAndroid", urlPatterns={"/android/AnyadirIncidenciaAndroid"}, loadOnStartup=1) 

@MultipartConfig(位置= 「C:\ TEMP」,fileSizeThreshold = 1024 * 1024,maxFileSize爲= 1024 * 1024 * 5,maxRequestSize = 1024 * 1024 * 5 * 5) 公共類AnyadirIncidenciaAndroid延伸的HttpServlet {

private static final long serialVersionUID = -6704540377265399620L; 

/** 
* @see HttpServlet#HttpServlet() 
*/ 
public AnyadirIncidenciaAndroid() { 
    super(); 
    // TODO Auto-generated constructor stub 
} 

/** 
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 
*/ 
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    doPost(request, response); 
} 

/** 
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
*/ 
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

    final String usuario = request.getParameter("usuario"); 

    System.out.println("Usuario recuperado al dar la incidencia desde movil: " + usuario); 

    IncidenciaDAO idao = new IncidenciaDAO(); 
    Timestamp fechaalta = new Timestamp(System.currentTimeMillis()); 
    Timestamp fechafin = null; 
    double latitud = Double.parseDouble(request.getParameter("latitud")); 
    double longitud = Double.parseDouble(request.getParameter("longitud")); 
    String descripcion = request.getParameter("descripcion"); 
    String tipo = request.getParameter("tipo"); 
    String estado = "Nueva"; 
    String prioridad = "Normal"; 
    String empleado = null; //al tratarse de una incidencias nueva, aun no tenemos ningun empleado que la halla resuelto 
    String foto = request.getParameter("foto"); 
    String nombrefoto = null; 

    /* 
    * Si tenemos foto creada en la aplicacion movil, entonces tendremos que guardar el nuevo 
    * nombre de la incidencia, en caso, de no tener foto, pondremos una string vacio, 
    * y pondremos la imagen por defecto de sin imagen. 
    */ 
    Part p1 = request.getPart("FotoIncidenciaAndroid"); 

    if(foto.equalsIgnoreCase("Si")){ 
     try { 
      nombrefoto = idao.RenombrarFoto(); 
      // guardamos la foto con su nombre 
      p1.write(nombrefoto); 
     } catch (SQLException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 
    } 

    try { 
     idao.anyadirIncidenciaMapaWeb(fechaalta, fechafin, latitud, longitud, descripcion, tipo, estado, prioridad, usuario, empleado, foto, nombrefoto); 
    } catch (SQLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

}

如何我必須做的,從我從德的請求發送給取? 因爲這告訴我,變量usuario爲空

final String usuario = request.getParameter(「usuario」); System.out.println(「Usuario recuperado al dar la incidencia desde movil:」+ usuario);

而且日誌FOMR服務器說,它可以使請求,因爲它送它不是一個多

在此先感謝。

回答

0

我使用這些組件在將圖像發送到我的服務器:

public static void uploadPhoto(Uri imageUri, Activity activity, String restaurantId, String itemId) throws Exception{ 
    File imageToUpload = convertImageUriToFile (imageUri, activity); 
    executeMultipartPost(imageToUpload.getAbsolutePath(),restaurantId, itemId); 
} 

其中imageUri是完整路徑到圖像上:

圖片轉換器:

public static File convertImageUriToFile(Uri imageUri, Activity activity) { 
    Cursor cursor = null; 
    try { 
     String[] proj = { MediaStore.Images.Media.DATA, 
       MediaStore.Images.Media._ID, 
       MediaStore.Images.ImageColumns.ORIENTATION }; 
     cursor = activity.managedQuery(imageUri, proj, // Which columns to 
                 // return 
       null, // WHERE clause; which rows to return (all rows) 
       null, // WHERE clause selection arguments (none) 
       null); // Order-by clause (ascending by name) 
     int file_ColumnIndex = cursor 
       .getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
     Log.v("App engine Manager", "File colum index:"+file_ColumnIndex); 
     // int orientation_ColumnIndex = cursor 
     // .getColumnIndexOrThrow(MediaStore.Images.ImageColumns.ORIENTATION); 
     if (cursor.moveToFirst()) { 
      //String orientation = cursor.getString(orientation_ColumnIndex); 
      return new File(cursor.getString(file_ColumnIndex)); 
     } 
     return null; 
    } finally { 
     if (cursor != null) { 
      cursor.close(); 
     } 
    } 
} 

服務器的COM :

public static void executeMultipartPost(String path, String restaurantId, String itemId) throws Exception { 
    try { 

     Bitmap bm = BitmapFactory.decodeFile(path); 
     String URL = "", imageId = ""; 

     URL = "your server's URL to handle multipart data "; 
     ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
     bm.compress(CompressFormat.JPEG, 75, bos); 
     byte[] data = bos.toByteArray(); 
     HttpClient httpClient = new DefaultHttpClient(); 
     HttpPost postRequest = new HttpPost(URL); 
     ByteArrayBody bab = new ByteArrayBody(data, imageId+".jpg"); 
     MultipartEntity reqEntity = new MultipartEntity(
       HttpMultipartMode.BROWSER_COMPATIBLE); 
     reqEntity.addPart("uploaded", bab); 
     reqEntity.addPart("photoCaption", new StringBody("sfsdfsdf")); 
     postRequest.setEntity(reqEntity); 
     HttpResponse response = httpClient.execute(postRequest); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(
       response.getEntity().getContent(), "UTF-8")); 
     String sResponse; 
     StringBuilder s = new StringBuilder(); 

     while ((sResponse = reader.readLine()) != null) { 
      s = s.append(sResponse); 
     } 
     System.out.println("Response: " + s); 
    } catch (Exception e) { 
     // handle exception here 
     Log.e(e.getClass().getName(), e.getMessage()); 
    } 
} 
+0

你hav e發佈了與我發佈的代碼相同的代碼,麻煩的是沒有發出請求的servlet。謝謝。 – user1552648 2012-07-25 21:32:06

相關問題