我正在开发一个Android应用程序,它使用户能够将文件上传到像Twitpic和其他服务。 POST上传完成时没有任何外部库,工作得很好。我唯一的问题是,我不能抓住任何进展,因为所有的上传完成时,我收到的回应,而不是写入字节到输出流。 这里是我做的:无法抓取HTTP POST文件上传(Android)的进度
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读):
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)I组中改变问题了一下头中的Content-Length,但不以任何 的方式解决这个问题: 现在整个内容的最后一个字节写入后上传流。所以,这不会改变你无法获取进度的情况,因为数据再次被写入。 2)我尝试了Apache HttpClient v4中的MultipartEntity。在那里你根本没有OutputStream,因为当你执行请求时,所有的数据都被写入。再次,无法取得进展。
有没有人有任何其他想法如何抓住多部分/形式上传过程?
也许这个答案会给你一些指点:http://stackoverflow.com/questions/254719/file-upload-with-java-with-progress-bar/470047#470047 – pableu 2010-07-09 15:20:28
@pableu :我研究过这个。问题是:Android SDK中没有RequestEntity。它是Apache HttpClient 3.1的一部分,它不再被Android使用。现在,我甚至试图加载新的4.0.1库,但我看不到在这里获得进展的可能性。 还有什么想法? – Manuel 2010-07-12 15:50:11