我正在尝试在iOS应用程序上实现上传进度条。我目前的实现做了这个简单的技巧:
using (Stream requestStream = request.GetRequestStream ()) {
byte[] dataToUpload = this.DataToUpload;
int dataToUploadLength = dataToUpload.Length;
int uploadedSoFar = 0;
while (uploadedSoFar < dataToUploadLength) {
int toUpload = 8192;
if (uploadedSoFar + toUpload > dataToUploadLength) {
toUpload = dataToUploadLength - uploadedSoFar;
}
requestStream.Write (dataToUpload, uploadedSoFar, toUpload);
uploadedSoFar += toUpload;
this.SetUploadedRatio ((float)uploadedSoFar / (float)dataToUploadLength);
}
问题是requestStream.Write()是即时的,直到发送大约100KB的数据,然后它变得更合乎逻辑,并且上面显示的SetUploadedRatio()方法被调用。当文件很大时,这并不是什么大不了的事,虽然我们仍然可以看到它立刻需要一些百分比然后开始慢一点。在慢速连接上,发送一个60KB的文件会导致显示进度条立即达到100%,但实际上传根本没有完成,所以我们无法真正显示正在发生的事情。
我做了一个暴露问题的完整展示(在Monotouch iOS上),链接如下: https://github.com/rFlex/Monotouch-Upload-Showcase
这是有趣的东西: https://github.com/rFlex/Monotouch-Upload-Showcase/blob/master/TestUpload/Uploader.cs
答案 0 :(得分:0)
只要在调用GetRequestStream之前设置HttpWebRequest.ContentLength或HttpWebRequest.SendChunked,您发送的数据将在每次调用Stream时发送到服务器。[Begin] Write。如果您以小块的形式编写文件建议,您可以了解您的距离。