2012-05-11 23 views
6

Szukałem od tego wszystkiego i nic nie działało dla mnie.Prześlij obraz z androida do serwletu java i zapisz go

Próbuję przesłać obraz z aplikacji na Androida do serwletu java i zapisać go na serwerze. Każde rozwiązanie, które znalazłem, nie działało dla mnie.

Co obecnie robi mój kod: android aplikacja wysyła obraz do serwletu, gdy próbuję zapisać plik jest tworzony, ale jest pusty :(

Dzięki za pomoc

Mój kod w android klienta (i_file jest lokalizacja pliku na urządzeniu):

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

} 

Mój kod w stronie serwera:

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

} 

kod 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

Dotyczy to nie tylko klienta, należy go również wdrożyć na serwerze (serwletie). Btw: Co robi proces 'processRequest'? – home

+0

Dziękuję za odpowiedź. Czytałem informacje w linku, ale nie mogę znaleźć rozwiązania mojego problemu. – Ohadza

+0

Jak wygląda twój kod serwletu? Co dzieje się w 'processRequest'? – home

Odpowiedz

8

możliwość błędnej interpretacji problemu. Plik obrazu nie jest pusty, ale plik obrazu ma postać uszkodzoną, ponieważ przechowujesz całą treść żądania HTTP wieloczęściowego jako plik obrazu zamiast wyodrębniania części zawierającej obraz z treści żądania HTTP wieloczęściowego.

Potrzebujesz HttpServletRequest#getPart(), aby uzyskać części treści żądania wieloczęściowego. Jeśli jesteś już na Servlet 3.0 (Tomcat 7, GlassFish 3 itp), pierwszy opisywania aplet z @MultipartConfig

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

następnie naprawić doPost() następująco chwycić części przez jego nazwę, a następnie jej ciało jako wejście strumień:

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

Jeśli nadal nie na Servlet 3.0 jeszcze, a potem chwycić Apache Commons FileUpload. Zobacz także tę odpowiedź, aby uzyskać szczegółowy przykład: How to upload files to server using JSP/Servlet?

Och, proszę, pozbądź się generowanej przez Netbeans metody processRequest(). To absolutnie nie jest właściwy sposób delegowania zarówno metody doGet(), jak i doPost() do pojedynczej metody processRequest(), a to tylko wprowadzi w błąd innych programistów i opiekunów, którzy nie używają Netbeans.

+0

Dziękuję bardzo! w końcu działa ... teraz mogę iść na siłownię z uśmiechem na twarzy! P.S Pozbyłem się processRequest(). – Ohadza

+0

Nie ma za co :) – BalusC

Powiązane problemy