2

私は、ServiceStack、Mono For Android、MonoTouchを使用するAndroidおよびiPhone用のモバイルアプリに取り組んでいます。アプリの一部を使用すると、ユーザーはサーバーにファイルをアップロードできます。これは、現在「JsonServiceClient.PostFileWithRequest(string RelativeOrAbsoluteUrl、Stream fileToUpload、string fileName、objectrequest)」メソッドを介して実行しています。これは正常に機能していますが、送信されたデータを示すプログレスバーを表示したいと思います。

これを初めて試みたときは、Streamをラップし、データがストリームから読み取られるときにProgressChangedイベントを定期的に発生させるクラスを作成しました。残念ながら、これはうまく機能しません。すべてのデータが送信者の前にストリームから読み取られるようです(少なくとも、私がテストした90Mbまでのファイルの場合)。その結果、プログレスバーは100%まですばやく実行され、データが実際にサーバーに送信されている間は100%のままになります。最終的に、PostFileWithRequest()呼び出しが完了し、ファイルは正常に転送されますが、プログレスバーの動作は理想的とは言えません。

ファイルのアップロードの進行状況をより正確に表す進行状況の更新を取得する方法について誰かが提案を持っていますか?

4

1 に答える 1

0

この問題を解決するために私が思いついた解決策は、ソースストリームをチャンクに分割し、「PostFileWithRequest」を複数回呼び出すことです。ポストコールの合間にプログレスバーを更新します。アップロードのキャンセルと再開はこのアプローチを使用して簡単に実装できるという追加のボーナスがありますが、これは特に効率的ではないと確信しています。

とにかく、擬似コードでは、私のソリューションは次のようになります。

using (var client = new JsonServiceClient(WebServiceAddress))
{
    var src = GetStreamForFileToSend();
    long totalBytes = src.CanSeek ? src.Length : 0;
    long byteOffset = 0;

    byte[] Chunk = new byte[Constants.UploadChunkSize];
    for (int read; (read = src.Read(Chunk, 0, Chunk.Length)) != 0;)
    {
        // Progress update
        UploadProgress(byteOffset, totalBytes);

        using (var mem = new MemoryStream(Chunk, 0, read))
        {
            // The request contains a guid so the web service can concatenate chunks
            // from the same client
            var request = new UploadFileData(MyUniqueClientGuid, byteOffset, totalBytes);

            // Send the chunk
            UploadFileDataResponse response = client.PostFileWithRequest<UploadFileData>(
                UploadFileData.Route, mem, filename, request);

            // Cancelling supported easily...
            if (response.Cancelled)
                break;

            byteOffset += read;

            // Can also use 'src.Seek()' and send only the remainder of the file if the
            // response contains info about how much of the file is already uploaded. 
        }
    }
}
于 2012-12-11T02:51:41.127 に答える