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);
}

問題は、約 100KB のデータが送信されるまで requestStream.Write() が瞬時に実行され、その後、より論理的になり、上記の 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 に答える