微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

android-在文件上传过程中显示进度条

我有一个异步任务,应该在文件上传过程中显示进度.一切正常,只是看起来它确实非常快地完成了文件上传,然后等待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 举报,一经查实,本站将立刻删除。

相关推荐