[解決済み] HttpURLConnectionを使ったPOSTによるファイル送信
質問
Androidの開発者は
をお勧めします。
を使用することを推奨しています。
HttpURLConnection
クラスで、ビットマップの "file" (実際にはメモリ内のストリーム) を Apache HTTP サーバに POST で送信する方法について、誰かが良い例を提供できるかどうか疑問に思っています。クッキーや認証など複雑なものには興味がないのですが、ただ信頼できるロジック実装が欲しいのです。私がこのあたりで見たすべての例は、「これを試してみて、たぶんうまくいくだろう」というように見えます。
今、私はこのコードを持っています。
URL url;
HttpURLConnection urlConnection = null;
try {
url = new URL("http://example.com/server.cgi");
urlConnection = (HttpURLConnection) url.openConnection();
} catch (Exception e) {
this.showDialog(getApplicationContext(), e.getMessage());
}
finally {
if (urlConnection != null)
{
urlConnection.disconnect();
}
}
showDialog が単に
AlertDialog
(を表示します(無効なURLの場合?)
さて、このようにビットマップを生成するとします。
Bitmap image = this.getBitmap()
から派生したコントロールの内部で
View
から派生したコントロールの中にあり、それをPOSTで送信したいのです。このようなことを実現するには、どのような手順が適切でしょうか?どのようなクラスを使用する必要がありますか?私は
HttpPost
のように
この例では
? もしそうなら、どのように
InputStreamEntity
をどのように構築すればよいのでしょうか? 最初にビットマップをデバイス上のファイルに保存することを要求されるのは、不愉快だと思います。
私は本当にオリジナルのビットマップのすべての変更されていないピクセルをサーバーに送信する必要があるので、JPEG に変換することができないことも述べておかなければなりません。
どのように解決するのですか?
私はなぜ
HttpURLConnection
クラスが、手動でファイルラッパーを構成することなくファイルを送信する手段を提供しないのか、全く理解できません。以下は私が最終的に行ったことですが、もし誰かがより良い解決策を知っているならば、教えてください。
入力データです。
Bitmap bitmap = myView.getBitmap();
静的なもの
String attachmentName = "bitmap";
String attachmentFileName = "bitmap.bmp";
String crlf = "\r\n";
String twoHyphens = "--";
String boundary = "*****";
リクエストを設定します。
HttpURLConnection httpUrlConnection = null;
URL url = new URL("http://example.com/server.cgi");
httpUrlConnection = (HttpURLConnection) url.openConnection();
httpUrlConnection.setUseCaches(false);
httpUrlConnection.setDoOutput(true);
httpUrlConnection.setRequestMethod("POST");
httpUrlConnection.setRequestProperty("Connection", "Keep-Alive");
httpUrlConnection.setRequestProperty("Cache-Control", "no-cache");
httpUrlConnection.setRequestProperty(
"Content-Type", "multipart/form-data;boundary=" + this.boundary);
コンテンツラッパーを起動します。
DataOutputStream request = new DataOutputStream(
httpUrlConnection.getOutputStream());
request.writeBytes(this.twoHyphens + this.boundary + this.crlf);
request.writeBytes("Content-Disposition: form-data; name=\"" +
this.attachmentName + "\";filename=\"" +
this.attachmentFileName + "\"" + this.crlf);
request.writeBytes(this.crlf);
変換する
Bitmap
を
ByteBuffer
:
//I want to send only 8 bit black & white bitmaps
byte[] pixels = new byte[bitmap.getWidth() * bitmap.getHeight()];
for (int i = 0; i < bitmap.getWidth(); ++i) {
for (int j = 0; j < bitmap.getHeight(); ++j) {
//we're interested only in the MSB of the first byte,
//since the other 3 bytes are identical for B&W images
pixels[i + j] = (byte) ((bitmap.getPixel(i, j) & 0x80) >> 7);
}
}
request.write(pixels);
コンテンツラッパーを終了します。
request.writeBytes(this.crlf);
request.writeBytes(this.twoHyphens + this.boundary +
this.twoHyphens + this.crlf);
出力バッファをフラッシュします。
request.flush();
request.close();
レスポンスを取得します。
InputStream responseStream = new
BufferedInputStream(httpUrlConnection.getInputStream());
BufferedReader responseStreamReader =
new BufferedReader(new InputStreamReader(responseStream));
String line = "";
StringBuilder stringBuilder = new StringBuilder();
while ((line = responseStreamReader.readLine()) != null) {
stringBuilder.append(line).append("\n");
}
responseStreamReader.close();
String response = stringBuilder.toString();
レスポンスストリームを閉じる。
responseStream.close();
接続を閉じます。
httpUrlConnection.disconnect();
PS: もちろん、リクエストを
private class AsyncUploadBitmaps extends AsyncTask<Bitmap, Void, String>
これは Android プラットフォームがメインスレッドでネットワークリクエストを持つことを好まないからです。
関連
-
[解決済み] インスタンス状態の保存を使用してアクティビティ状態を保存するにはどうすればよいですか?
-
[解決済み] HTTP GET(リクエストボディ付き
-
[解決済み] フォーム送信のようなJavaScriptのポストリクエスト
-
[解決済み] HTTP POSTリクエストでは、どのようにパラメータが送信されるのですか?
-
[解決済み] HTTP POST Web リクエストの作成方法
-
[解決済み] node.jsでHTTP POSTリクエストはどのように行われるのですか?
-
[解決済み] POSTとPUT HTTP REQUESTの違いは何ですか?
-
[解決済み】HTTPのPOSTとPUTの違いは何ですか?
-
[解決済み] Nexus 4でUSBデバッグモードを見つける方法とオンにする方法
-
[解決済み] 深くネストされたスタックから離れるとき、Fragmentのバックスタックをクリーンアップする方法はこれで良いのでしょうか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] java.net.URLConnectionを使用してHTTPリクエストを発生させ処理する方法
-
[解決済み] Javaでファイルをbyte[]に変換する
-
[解決済み] Nexus 4でUSBデバッグモードを見つける方法とオンにする方法
-
[解決済み] wrap_contentでRelativeLayoutがフルスクリーンになってしまう
-
[解決済み] EclipseのAndroidプロジェクトにライブラリ/JARを追加する
-
[解決済み] PendingIntentの "requestCode "は何に使うのですか?
-
[解決済み] アンドロイドでビットマップのサイズを変更する最もメモリ効率の良い方法とは?
-
[解決済み] カスタムレイアウトとEditTextを持つAlertDialog.Builderは、ビューにアクセスすることができません。
-
[解決済み] Android 6.0でBluetooth Low Energyスキャンを使用するには位置情報を有効にする必要があります。
-
[解決済み] 確認(yes/no)用のDialogPreferenceを実装するには?