2012-05-11 14 views
6

Ho cercato tutto questo e niente ha funzionato per me.Carica immagine da Android a servlet java e salvalo

Sto provando a caricare un'immagine dall'app per android al servlet Java e salvarla nel server. Ogni soluzione che ho trovato non ha funzionato per me.

Ciò che il mio codice attualmente fa: l'applicazione Android sta inviando l'immagine al servlet, quando sto cercando di salvarla viene creato il file, ma è vuota :(

Grazie per il vostro aiuto

il mio codice nel client Android (i_file è la posizione del file sul 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(); 

} 

mio codice lato server:

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(); 

} 

codice 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

Questo non riguarda solo il client, è necessario implementarlo anche sul server (servlet). Btw: cosa fa 'processRequest'? – home

+0

Grazie per la risposta. Ho letto le informazioni nel link, ma non riesco a capire la soluzione per il mio problema. – Ohadza

+0

Come appare il codice del tuo servlet? Cosa succede in 'processRequest'? – home

risposta

8

È male interpretato il problema. Il file immagine non è vuoto, ma il file immagine è danneggiato perché si sta memorizzando l'intero corpo della richiesta multipart HTTP come un file immagine invece di estrarre la parte che contiene l'immagine dal corpo della richiesta multipart HTTP.

È necessario HttpServletRequest#getPart() per ottenere le parti di un corpo di richiesta multipart. Se sei già su Servlet 3.0 (Tomcat 7, Glassfish 3, ecc), prima annotare il servlet con @MultipartConfig

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

quindi risolvere il tuo doPost() come segue per afferrare la parte con il suo nome e poi il suo corpo come input stream:

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

Se non sei ancora su Servlet 3.0 ancora, allora prendete Apache Commons FileUpload. Vedere anche questa risposta per un esempio dettagliato: How to upload files to server using JSP/Servlet?

Oh, si prega di sbarazzarsi del metodo processRequest() generato da Netbeans. Non è assolutamente il modo giusto per delegare sia doGet() e doPost() a un singolo metodo processRequest() e confonderà solo altri sviluppatori e manutentori che non usano Netbeans.

+0

Grazie mille! finalmente sta funzionando ... ora posso andare in palestra con un sorriso sulla mia faccia! P.S Mi sono liberato di processRequest(). – Ohadza

+0

Prego :) – BalusC