1

Androidフォンをサーブレットに接続して、特定の画像を送信しようとしています。私がこれを行うと考えた方法は、copyPixelsToBuffer()関数を使用してから、出力ストリームを介してこれをサーブレットに送信しようとすることです (通常のスタンドアロン Java アプリケーションで行う方法と同様です)。この方法は機能しますか?もしそうなら、どのようなストリームを正確に使用しますか? DataOutputStream を使用するだけで、次のようなことを行う必要があります。

ByteBuffer imgbuff;
Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
bm.copyPixelsToBuffer(bm);

...code...
URLConnection sc = server.openConnection();
sc.setDoOutput(true);

DataOutputStream out = new DataOutputStream( sc.getOutputStream() );
out.write(imgbuff.array());
out.flush();
out.close();

注: これは、Android OS を使用してサーバーに接続する適切な方法ではない可能性があることを理解していますが、現時点では、接続ではなく画像を送信する方法に取り組んでいます (これが画像の状態に関連している場合を除きます)。送信済)。

これが画像をサーブレットに送信する方法としてお勧めできない場合 (バイト バッファーが最適だと思いましたが、間違っている可能性があります)、どのように行うことをお勧めしますか?

4

1 に答える 1

2

は通常 HTTP リクエストをリッスンするため、そのような生の (フォーマットされていない) 代わりに、エンコーディングをHttpServlet使用して HTTP 経由でバイナリ データを送信したいと考えています。multipart/form-data

クライアント側からはURLConnection、このミニ チュートリアルで概説されているようにこれを使用できますが、かなり冗長になります。これには、 Apache HttpComponents クライアントを使用することもできます。ただし、これにより追加の依存関係が追加されます。Android でそれを使用するかどうかはわかりません。

次に、サーバー側で、Apache Commons FileUploadmultipart/form-dataを使用して、エンコードされた要求本文から項目を解析できます。この回答doPost()では、サーブレットがどのように見えるべきかのコード例を見つけることができます。

あなたのコード例に関して: でラップするDataOutputStream必要はありません。DataOutputStreamの施設を利用していません。によって返されるようにwrite(byte[])、基本によって既に提供されているメソッドを使用しているだけです。さらに、 には、より標準的でわかりやすい形式 (PNG、JPG など) を使用して任意の に圧縮するために使用できる方法があります。例えばOutputStreamURLConnection#getOutputStream()Bitmapcompress()OutputStream

output = connection.getOutputStream();
// ...
bitmap.compress(CompressFormat.JPEG, 100, output);  

コードの代わりにこれoutput.write(bytes)を行います。

于 2010-09-20T20:35:47.977 に答える