1

Base64 文字列としてエンコードされた画像をアップロードするメソッドを使用して、変更できない REST サービスがあります。

問題は、画像のサイズが 5 ~ 10 MB、おそらくそれ以上になる可能性があることです。デバイスでこのサイズのイメージの Base64 表現を構築しようとすると、OutOfMemory 例外が発生します。

ただし、一度にバイトのチャンクをエンコードできます (たとえば 3000 としましょう) が、HttpGet/HttpPost オブジェクトを作成するには文字列全体が必要になるため、これは役に立ちません。

DefaultHttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet("www.server.com/longString");
HttpResponse response = client.execute(httpGet);

これを回避する方法はありますか?

編集: Heiko Rupp の提案と android doc を使用しようとすると、次の行で例外 ("java.io.FileNotFoundException: http://www.google.com ") が発生します: InputStream in = urlConnection.getInputStream();

    try {
        URL url = new URL("http://www.google.com");
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

        urlConnection.setDoOutput(true);
        urlConnection.setChunkedStreamingMode(0);

        OutputStream out = new BufferedOutputStream(urlConnection.getOutputStream());
        out.write("/translate".getBytes());

        InputStream in = urlConnection.getInputStream();
        BufferedReader r = new BufferedReader(new InputStreamReader(in));
        StringBuilder total = new StringBuilder();
        String line;
        while ((line = r.readLine()) != null) {
            total.append(line);
        }           
        System.out.println("response:" + total);

    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

何か不足していますか?実行する必要がある GET リクエストは次のようになります。「http://myRESTService.com/myMethod?params=LOOONG-String 」なので、http: //myRESTService.com/myMethodに接続して、一度に長い文字列の数文字。これは正しいです?

4

2 に答える 2

1

apache httpクライアントの代わりに使用してみてくださいURLConnection。これは、オブジェクトを保持してメモリに送信する必要がないためですが、代わりに次のようなことができます。

擬似コード!

HttpUrlConnection con = restUrl.getConnection();
while (!done) {
  byte[] part = base64encode(partOfImage);
  con.write (part);
  partOfImage = nextPartOfImage();
}
con.flush();
con.close();

また、2.2以降のAndroidでは、GoogleURLConnectionはhttpクライアントよりも推奨しています。DefaultHttpClientの説明を参照してください。

調べたいもう1つのことは、送信するデータの量です。URLConnection10 MB + base64は、モバイルネットワークを介して転送するのにかなりの時間がかかります(サーバー側がそれを受け入れる場合に透過的に有効にするgzip圧縮を使用しても)。

于 2012-10-18T08:58:03.060 に答える
1

このRESTサービスのドキュメントを読む必要があります。このようなサービスでは、GETでこのような長いデータを送信する必要はありません。画像は常にPOSTとして送信されます。POSTデータは常にリクエストの最後にあり、繰り返し追加できます。

于 2012-10-18T08:58:32.720 に答える