【发布时间】:2011-03-13 22:28:13
【问题描述】:
我正在开发一个 Android 应用程序,它使用户能够将文件上传到 Twitpic 等服务。 POST 上传是在没有任何外部库的情况下完成的,并且工作正常。我唯一的问题是,我无法取得任何进展,因为所有上传都是在我 receive 响应时完成的,而不是在 将字节写入输出流时完成。 这是我的工作:
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”时不会发生uplaod? 2) 我如何获取进度以便在上传过程中同时显示进度对话框?
/编辑: 1)我在标题中设置了 Content-Length ,这稍微改变了问题,但没有任何 解决方法: 现在整个内容在最后一个字节写入流后上传。所以,这并没有改变你无法抓取进度的情况,因为数据是一次写入的。 2)我在 Apache HttpClient v4 中尝试了 MultipartEntity。那里根本没有 OutputStream,因为所有数据都是在执行请求时写入的。再说一遍,没有办法抢到进度。
有没有人知道如何在多部分/表单上传中获取进程?
【问题讨论】:
-
也许这个答案会给你一些指点:stackoverflow.com/questions/254719/…
-
@pableu:我已经调查过了。问题是:Android SDK 中没有 RequestEntity。它是 Apache HttpClient 3.1 的一部分,Android 不再使用它。现在,我什至尝试加载新的 4.0.1 库,但我认为这里不可能取得进展。还有什么想法吗?
标签: android http post upload progress