2012-05-11 12 views
6

He estado buscando todo esto y nada funcionó para mí.Subir imagen de android a servlet java y guardarlo

Estoy tratando de cargar una imagen de la aplicación de Android a servlet java y guardarlo en el servidor. Cada solución que encontré no funcionó para mí.

Lo que hace mi código actualmente: la aplicación para Android es el envío de la imagen para el servlet, cuando estoy tratando de salvarlo se crea el archivo, pero es vacía :(

Gracias por su ayuda

Mi código en el cliente de Android (i_file es la ubicación del archivo en el dispositivo):

public static void uploadPictureToServer(String i_file) throws ClientProtocolException, IOException { 
    // TODO Auto-generated method stub 
    HttpClient httpclient = new DefaultHttpClient(); 
    httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1); 

    HttpPost httppost = new HttpPost("http://192.168.1.106:8084/Android_Server/GetPictureFromClient"); 
    File file = new File(i_file); 

    MultipartEntity mpEntity = new MultipartEntity(); 
    ContentBody cbFile = new FileBody(file, "image/jpeg"); 
    mpEntity.addPart("userfile", cbFile); 

    httppost.setEntity(mpEntity); 
    System.out.println("executing request " + httppost.getRequestLine()); 
    HttpResponse response = httpclient.execute(httppost); 
    HttpEntity resEntity = response.getEntity(); 

    System.out.println(response.getStatusLine()); 
    if (resEntity != null) { 
     System.out.println(EntityUtils.toString(resEntity)); 
    } 
    if (resEntity != null) { 
     resEntity.consumeContent(); 
    } 

    httpclient.getConnectionManager().shutdown(); 

} 

Mi código en el lado del servidor:

protected void doPost(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
    processRequest(request, response); 

     InputStream in = request.getInputStream(); 
     OutputStream out = new FileOutputStream("C:\\myfile.jpg"); 
     IOUtils.copy(in, out); //The function is below 
     out.flush(); 
     out.close(); 

} 

código IOUtils.copy:

public static long copy(InputStream input, OutputStream output) throws IOException { 
    byte[] buffer = new byte[4096]; 

    long count = 0L; 
    int n = 0; 

    while (-1 != (n = input.read(buffer))) { 
     output.write(buffer, 0, n); 
     count += n; 
    } 
    return count; 
} 
+0

Esto no solo se relaciona con el cliente, sino que también debe implementarlo en el servidor (servlet). Por cierto: ¿Qué hace 'processRequest'? – home

+0

Gracias por la respuesta. Leí la información en el enlace, pero parece que no puedo encontrar la solución para mi problema. – Ohadza

+0

¿Cómo se ve el código de tu servlet? ¿Qué sucede en 'processRequest'? – home

Respuesta

8

Se desnaturalizó el problema. El archivo de imagen no está vacío, pero el archivo de imagen está dañado porque está almacenando todo el cuerpo de solicitud de varias partes HTTP como un archivo de imagen en lugar de extraer la parte que contiene la imagen del cuerpo de solicitud de varias partes HTTP.

Necesita HttpServletRequest#getPart() para obtener las partes de un cuerpo de solicitud de varias partes. Si ya estás en Servlet 3.0 (Tomcat 7, Glassfish 3, etc), anotar primero el servlet con @MultipartConfig

@WebServlet("/GetPictureFromClient") 
@MultipartConfig 
public class GetPictureFromClient extends HttpServlet { 
    // ... 
} 

luego fijar su doPost() de la siguiente manera para agarrar la parte por su nombre y luego su cuerpo como entrada corriente:

InputStream in = request.getPart("userfile").getInputStream(); 
// ... 

Si todavía no estás en Servlet 3.0, sin embargo, a continuación, coger Apache Commons FileUpload. Consulte también esta respuesta para obtener un ejemplo detallado: How to upload files to server using JSP/Servlet?

Ah, elimine el método processRequest() generado por Netbeans. Definitivamente no es la forma correcta de delegar doGet() y doPost() en un solo método processRequest() y solo confundirá a otros desarrolladores y mantenedores que no usen Netbeans.

+0

¡Muchas gracias! finalmente está funcionando ... ¡ahora puedo ir al gimnasio con una sonrisa en la cara! P.S Me deshice de processRequest(). – Ohadza

+0

De nada :) – BalusC

Cuestiones relacionadas