我对Java 非常陌生,并且大部分时间都在教我自己,所以我开始构建一个applet.我想创建一个可以从本地磁盘中选择文件并将其作为multipart/form-data POST请求上传但有进度条的文件.显然,用户必须授予Java applet访问硬盘驱动器的权限.现在我已经完成了第一部分工作:用户可以使用JFileChooser对象选择一个文件,方便地返回一个File对象.但我想知道接下来会发生什么.我知道这File.length()将给我文件的总大小(以字节为单位),但是如何将所选内容发送File到网络,以及如何监控已发送的字节数?提前致谢.
Android开发者博客建议使用HttpURLConnection除apache之外的其他内容HttpClient
(http://android-developers.blogspot.com/2011/09/androids-http-clients.html).我接受了建议,并在报告文件上传进度时遇到问题.
我抓住进度的代码是这样的:
try {
out = conncetion.getOutputStream();
in = new BufferedInputStream(fin);
byte[] buffer = new byte[MAX_BUFFER_SIZE];
int r;
while ((r = in.read(buffer)) != -1) {
out.write(buffer, 0, r);
bytes += r;
if (null != mListener) {
long now = System.currentTimeMillis();
if (now - lastTime >= mListener.getProgressInterval()) {
lastTime = now;
if (!mListener.onProgress(bytes, mSize)) {
break;
}
}
}
}
out.flush();
} finally {
closeSilently(in);
closeSilently(out);
}
Run Code Online (Sandbox Code Playgroud)
对于任何文件大小,此代码都可以快速执行,但该文件实际上仍在上传到服务器,我从服务器获得响应.HttpURLConnection当我调用时,它似乎在内部缓冲区中缓存所有数据out.write().
那么,我怎样才能获得实际的文件上传进度?似乎httpclient可以做到这一点,但 …
有几个问题讨论了如何使用multipart/form-data数据格式将进度指示添加到Android中的HTTP文件上传中.建议的典型方法是顶级答案的缩影,无法在http POST文件上传(Android)中获取进度 - 包括完整Apache HTTPClient库中的MultipartEntity类,然后将其用于获取数据的输入流包装在一个在读取字节时计算字节数.
这种方法适用于这种情况,但不幸的是,对于通过UrlEncodedFormEntity发送数据的请求不起作用,UrlEncodedFormEntity期望其数据在Strings而不是InputStreams中传递给它.
所以我的问题是,有哪些方法可以通过这种机制确定上传的进度?