0

ミッドレットからHTTPサーバーに画像を送信しようとしています。画像はバイトに変換され、http multipart/form-dataリクエスト形式を使用してサーバーに送信されます。

ByteArrayOutputStream bos = new ByteArrayOutputStream();
bos.write(boundaryMessage.getBytes());
bos.write(fileBytes);
bos.write(endBoundary.getBytes());

画像サイズが約500Kb未満の場合、コードは正常に機能しますが、サイズが表示よりも大きい場合:キャッチされない例外java.lang.OutOfMemoryError。Java MESDK3.0とNokiaS405thエディションFP1を使ってみました。どんな助けでも大歓迎です。見てくれてありがとう

次のクラスファイルを使用しました:ここをクリック

4

2 に答える 2

4

1つのピースで送信するために、最初の `getFileBytes()を使用してファイル全体をメモリに強制的に読み込むことは、システムのメモリ不足を引き起こしている可能性があります。

ファイル全体が完了するまで、約100Kを読み取り、送信してから、さらに100を読み取る方法を見つけます。

記述されたHttpMultipartRequestクラスのコンストラクターは、単一のオブジェクトとしてのファイルの送信のみを許可します。これはMIMEマルチパートコンテンツプロトコルの実装ですが、1つのパートのみを送信する場合に限定されています。

クラスを変更して、複数のパーツを送信できるようにすることができます。プロトコル仕様RFC1341、特に途中の例を見てください。

これらの3行がコンストラクターにあるように一緒になっていると、ファイル全体が1つの部分で送信されます。

bos.write(boundaryMessage.getBytes());
bos.write(fileBytes);
bos.write(endBoundary.getBytes());

ただし、マルチパートの場合、endBoundary:の前に複数の境界が必要です。

 for(bytes=getMoreFileBytes(); ! bytes.empty; bytes=getMoreFileBytes()){
        bos.write(boundaryMessage.getBytes());
        bos.write(bytes);
    }
    bos.write(endBoundary.getBytes());

簡単な修正として、コンストラクターにファイルを開いて、一度に100kずつ読み取らせます。すでにパラメータを受け取っていfileNameます。

もう一方の端のPHPスクリプトは、断片から元のファイルを再構築する必要があります。

于 2010-10-15T03:49:03.013 に答える
0

私はフォーラムのルールにあまり詳しくありません。あなたの答えにコメントしようとしましたが、否定的です。

OK .. java.io.IOExceptionが発生しました:最初のチャンクが送信された後に持続的接続が切断され、再試行できません

以前、私はここでkidcandyのコードを使用してBase64エンコーディングでapplication / x-www-form-urlencodedリクエストタイプを使用しようとしました:http://forums.sun.com/thread.jspa?threadID = 538500

このコードは、「持続的接続の切断」の問題を回避するためにimagedataをチャンクに分割し、「for」ループを使用してサーバーとの接続を作成します。問題は、最大チャンクサイズがおそらく500〜700バイトしかないことです。したがって、コードが作成して接続を200回閉じるために必要な100kbの画像を送信するには、これをnokia 5310電話で実行しようとしましたが、休止状態のように動作します...したがって、役に立ちません。

  1. 'multipart / form-data'リクエストのforループを使用する必要がありますか?
  2. このタイプのリクエストの最大チャンクサイズはいくつですか?
  3. または他のアイデア?よろしく
于 2010-10-15T23:18:28.160 に答える