我正在开发一款Android应用,它可以让用户将文件上传到像Twitpic等服务中。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,这在当前情况下并不重要。之后我会将文件数据本身写入(从“in”中读取,它是我想发送的数据的InputStream):
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();
一切都运行得非常完美,到目前为止没有任何问题。然而,我的问题是,无论文件大小如何,整个过程到这一点为止需要大约一到两秒钟时间。
似乎只有当我读取响应时上传才会发生:
DataInputStream inStream = new DataInputStream(conn.getInputStream());
上传的时间取决于文件的大小和网络连接速度,可能需要几秒钟或几分钟。 我的问题是: 1)为什么我把字节写入“dos”时上传没有发生? 2)如何获取进度以便在上传过程中显示进度对话框?
/编辑: 1)我在头部设置了Content-Length,这使问题略有改变,但并没有解决它: 现在整个内容在最后一个字节写入流之后上传。因此,这并没有改变无法抓取进度的情况,因为数据再次一次性写入。 2)我尝试了Apache HttpClient v4中的MultipartEntity。在那里,您根本没有OutputStream,因为在执行请求时会写入所有数据。因此,还没有抓取进度的方法。
是否有其他人有任何其他想法,如何在multipart / form上传中抓取进度?