3

Androidのカメラから画像をキャプチャし、それをGoogleAppEngineに送信します。GoogleAppEngineは画像をblobストアに保存します。簡単そうに聞こえますが、GAEへのマルチパートPOSTを実行できますが、Blobストアに保存するには、サーブレットがHTTPリダイレクト(302)を返す必要があります。したがって、HTTPPOSTを実行した後にリダイレクトを追跡できる接続が必要です。これが私がうまくいくコードです

public static String sendPhoto(String myUrl, byte[] imageData) {
    HttpURLConnection connection = null;
    DataOutputStream outputStream = null;
    String pathToOurFile = "/data/file_to_send.jpg";
    String urlServer = myUrl;
    String lineEnd = "\r\n";
    String twoHyphens = "--";
    String boundary = "*****";
    // Please follow redirects
    HttpURLConnection.setFollowRedirects(true);
    BufferedReader rd = null;
    StringBuilder sb = null;
    String line = null;
    try {
        URL url = new URL(urlServer);
        connection = (HttpURLConnection) url.openConnection();
        // Allow Inputs & Outputs
        connection.setDoInput(true);
        connection.setDoOutput(true);
        connection.setUseCaches(false);
        // I really want you to follow redirects
        connection.setInstanceFollowRedirects(true);
        connection.setConnectTimeout(10000); // 10 sec
        connection.setReadTimeout(10000); // 10 sec
        // Enable POST method
        connection.setRequestMethod("POST");
        connection.setRequestProperty("Connection", "Keep-Alive");
        connection.setRequestProperty("Content-Type",
            "multipart/form-data;boundary=" + boundary);
        connection.connect();
        outputStream = new DataOutputStream(connection.getOutputStream());
        outputStream.writeBytes(twoHyphens + boundary + lineEnd);
        outputStream
                .writeBytes("Content-Disposition: form-data; name="
                    + "\"file1\";filename=\""
                    + pathToOurFile + "\"" + lineEnd);
        outputStream.writeBytes(lineEnd);
        outputStream.write(imageData);
        outputStream.writeBytes(lineEnd);
        outputStream.writeBytes(twoHyphens + boundary + twoHyphens
            + lineEnd);
        outputStream.flush();
        outputStream.close();
        rd = new BufferedReader(new InputStreamReader(
                connection.getInputStream()));
        sb = new StringBuilder();
        while ((line = rd.readLine()) != null) {
            sb.append(line + '\n');
        }
        Log.i("Response: ", sb.toString());
        // Responses from the server (code and message)
        int serverResponseCode = connection.getResponseCode();
        String serverResponseMessage = connection.getResponseMessage();
        Log.i("Response: serverResponseCode:",
            String.valueOf(serverResponseCode));
        Log.i("Response: serverResponseMessage:", serverResponseMessage);
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

私が試している限り、このコードはリダイレクトに従いません。入力スチームは常に空で、応答は常に302です。ただし、画像は適切にアップロードされます。誰かがリダイレクトをたどって応答を読むことができるようにするために私に何ができるか教えてくれたら、本当にありがたいです。

あるいは、もっと良いアプローチがあれば、ぜひ聞いてみたいと思います。Apache HTTPクライアントのようなライブラリが存在することは知っていますが、非常に多くの依存関係が必要であるため、単純なタスクには肥大化するようです。

ありがとう

4

2 に答える 2

4

数ヶ月前、私はまったく同じことをしようとしていました!

基本的には使用しないでくださいHttpURLConnection。代わりに、 AndroidSDKの一部であるパッケージでHttpClientとを使用してください。HttpGetorg.apache.http

残念ながら、例を示すソースコードはありませんが、それで正しい方向に進むことができれば幸いです。

于 2010-07-17T08:14:26.647 に答える
0

何が悪かったのかわかりませんが、自分でリダイレクトすることができます。Locationヘッダーを取り出して、新しい接続を確立します。

于 2010-07-17T06:31:37.640 に答える