0

我正在尝试在 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

4

1 回答 1

0

只要您在调用 GetRequestStream 之前设置 HttpWebRequest.ContentLength 或 HttpWebRequest.SendChunked,您发送的数据将在每次调用 Stream.[Begin]Write 时发送到服务器。如果您建议将文件分成小块编写,您可以了解您的进度。

于 2014-03-26T15:19:48.993 回答