2012-05-11 15 views
6

私はこれをすべて探していますが、何も私のために働いていません。アンドロイドからjavaサーブレットに画像をアップロードして保存します。

私はアンドロイドアプリからJavaサーブレットに画像をアップロードし、サーバーに保存しようとしています。 私が見つけたすべての解決策は私には役に立たなかった。

私のコードは、現在何!私は、ファイルが作成され、それを保存しようとしているときのAndroidアプリは、サーブレット、 に画像を送信しているが、それは空:(あなたの助けのための

おかげだ

アンドロイドクライアント(i_fileデバイス上のファイルの場所である)でマイコード:サーバ側の

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

} 

マイコード:

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

} 

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

これはクライアントに関連するだけでなく、サーバー(サーブレット)にも実装する必要があります。 Btw: 'processRequest'は何をするのですか? – home

+0

ありがとうございます。私はリンクの情報を読んだが、私の問題の解決方法を理解できないようだ。 – Ohadza

+0

サーブレットのコードはどのように見えますか? 'processRequest'ではどうなりますか? – home

答えて

8

あなたが問題を誤解。イメージファイルは空ではありませんが、が壊れているイメージファイルはです。これは、HTTPマルチパートリクエスト本体からイメージを含む部分を抽出するのではなく、HTTPマルチパートリクエスト本体全体をイメージファイルとして保存するためです。

マルチパートリクエストボディの一部を取得するには、HttpServletRequest#getPart()が必要です。あなたはサーブレット3.0(Tomcatの7、Glassfishの3、など)を開いている場合は、まず@MultipartConfig

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

でサーブレットに注釈を付ける入力として、その名前と、その体で一部をつかむために、次のようにあなたのdoPost()を修正ストリーム:その後、

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

あなたはまだサーブレット3.0に残っていない場合は、Apache Commons FileUploadをつかみます。詳細な例については、この回答も参照してください。How to upload files to server using JSP/Servlet?

ああ、Netbeansで生成されたprocessRequest()メソッドを削除してください。 doGet()doPost()の両方を単一のprocessRequest()メソッドに委譲することは絶対に正しい方法ではなく、Netbeansを使用しない他の開発者やメンテナーだけを混乱させます。

+0

ありがとう!それは最終的に働いている...今私は私の顔に笑顔でジムに行くことができます! P.S私はprocessRequest()を取り除きました。 – Ohadza

+0

あなたは大歓迎です:) – BalusC

関連する問題