ユーザーが Twitpic などのサービスにファイルをアップロードできるようにする Android アプリを開発しています。POST アップロードは外部ライブラリなしで行われ、問題なく動作します。私の唯一の問題は、バイトを出力ストリームに書き込んでいる間ではなく、応答を受信したときにすべてのアップロードが行われるため、進行状況を把握できないことです。これが私がすることです:
URL url = new URL(urlString);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setRequestMethod("POST");
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
次にフォームデータを dos に書き込みますが、ここではあまり重要ではありません。その後、ファイル データ自体を書き込みます (送信するデータの InputStream である "in" から読み取ります)。
while ((bytesAvailable = in.available()) > 0)
{
bufferSize = Math.min(bytesAvailable, maxBufferSize);
byte[] buffer = new byte[bufferSize];
bytesRead = in.read(buffer, 0, bufferSize);
dos.write(buffer, 0, bytesRead);
}
その後、ファイルの終わりを示すマルチパート フォーム データを送信します。次に、ストリームを閉じます。
in.close();
dos.flush();
dos.close();
これはすべて完全に正常に機能し、これまでのところ問題はありません。ただし、私の問題は、ファイルがどれほど大きくても、ここまでのプロセス全体に約 1 ~ 2 秒かかることです。応答を読むと、アップロード自体が行われているようです。
DataInputStream inStream = new DataInputStream(conn.getInputStream());
ファイルの大きさやインターネット接続の速さによって、数秒から数分かかります。私の質問は次のとおりです。1)バイトを「dos」に書き込んだときにアップロードが発生しないのはなぜですか?2) アップロード中に進行状況ダイアログを表示するには、進行状況を取得するにはどうすればよいですか?
/編集: 1) 問題を少し変更するヘッダーに Content-Length を設定しましたが、決して解決しません: 最後のバイトがストリームに書き込まれた後、コンテンツ全体がアップロードされます。というわけで、データが一気に書き込まれるので、進行状況を把握できないという状況は変わりません。2) Apache HttpClient v4 で MultipartEntity を試しました。リクエストを実行するとすべてのデータが書き込まれるため、OutputStream はまったくありません。繰り返しますが、進歩をつかむ方法はありません。
マルチパート/フォームアップロードでプロセスを取得する方法を他に考えている人はいますか?