标签:android file-upload networking http
我有一个异步任务,应该在文件上传过程中显示进度.一切正常,只是看起来它确实非常快地完成了文件上传,然后等待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应用程序中执行此操作.
标签:android,file-upload,networking,http 来源: https://codeday.me/bug/20191011/1891054.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。