我有一个异步任务,应该在文件上传过程中显示进度.一切正常,只是看起来它确实非常快地完成了文件上传,然后等待100%等待.
我追溯到
URL url = new URL(urlServer);
connection = (HttpURLConnection) url.openConnection();
// Allow Inputs & Outputs
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setUseCaches(false);
// Enable POST method
connection.setRequestMethod("POST");
connection.setRequestProperty("Connection", "Keep-Alive");
connection.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
outputStream = new DataOutputStream(connection.getoutputStream());
outputStream.writeBytes(twoHyphens + boundary + lineEnd);
outputStream.writeBytes("Content-disposition: form-data; name=\"Filedata\";filename=\"" + pathToOurFile + "\"" + lineEnd);
outputStream.writeBytes(lineEnd);
long totalBytesWritten = 0;
while (bytesRead > 0) {
outputStream.write(buffer, 0, bufferSize);
outputStream.flush();
if (mCancel) { throw new CancelException(); }
totalBytesWritten += bufferSize;
if (mProgressDialog != null) {
mProgressDialog.setProgress(Integer.valueOf((int) (totalBytesWritten / 1024L)));
}
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
}
outputStream.writeBytes(lineEnd);
outputStream.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
// Responses from the server (code and message)
int serverResponseCode = connection.getResponseCode();
我注意到的是,直到最后一行获取响应代码为止,并没有真正的延迟.我认为正在发生的事情是数据正在被缓冲,因此看起来它已经上传了数据,但实际上并没有-它只是缓冲了它.然后,当我进入getResponseCode()调用时,别无选择,只能完成上传以获取上传状态.有没有什么办法可以使其实际沿途上传,这样我就可以获得合理的进步?
解决方法:
这就是HTTP Post设计的工作方式,因此不要指望它为您提供进度详细信息.
您可以使用市场上几种文件上传器组件之一.他们内部使用Flash或Silverlight或iframe来显示进度.
http://dhtmlx.com/docs/products/dhtmlxVault/index.shtml
http://www.element-it.com/multiple-file-upload/flash-uploader.aspx
如果您稍微搜索一下,就会发现很多这样的其他人.
他们在内部使用原始IO而不是http发布来处理多个文件和进度通知.雅虎和谷歌也使用这种技术来制作邮件附件.
如果您真的很喜欢冒险,可以重新制作轮子-即编写自己的组件.
编辑:
请指定您是否要在Windows桌面应用程序或Web应用程序中执行此操作.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。