0

私はSilverlightにかなり慣れていません。Silverlight で .pdf ファイル (および他のいくつかの形式) をダウンロードしようとしています。ユーザーがボタンをクリックすると、システムが URI を取得し、SaveFileDialog を表示してファイルを保存する場所を取得します。コード スニペットを次に示します。

WebClient wc = new WebClient();
wc.DownloadStringCompleted += (s, e3) =>
{
    if (e3.Error == null)
    {
        try
        {
            byte[] fileBytes = Encoding.UTF8.GetBytes(e3.Result);
            using (Stream fs = (Stream)mySaveFileDialog.OpenFile())
            {
                fs.Write(fileBytes, 0, fileBytes.Length);
                fs.Close();

                MessageBox.Show("File successfully saved!");
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error getting result: " + ex.Message);
        }
    }
    else
    {
        MessageBox.Show(e3.Error.Message);
};

wc.DownloadStringAsync("myURI", UriKind.RelativeOrAbsolute));

ファイルは正常に保存されますが、元のサイズの約 2 倍になり、読み取ることができません。e3.Result は適切なサイズ (5Mb) に見えますが、余分な文字が多く含まれていると思われます。FileBytes は約 2 倍 (11Mb) 大きすぎるようです。DownloadStringAsync の代わりに DownloadDataAsync を試したかったのですが (エンコーディングの問題が解決されることを期待しています)、Silverlight には System.Net.WebClient の非常に縮小されたバージョンがあり、DownloadDataAsync をサポートしていません (コンパイルされません)。

エンコーディングの問題だと確信していますが、それを回避する方法がわかりません。

4

1 に答える 1

1

PDF ファイルはバイナリであり、UTF8 を使用してエンコードされていません。Silverlight を使用して PDF ファイルをダウンロードするOpenReadAsyncには、クラスのメソッドを使用しWebClientてファイルのバイナリ データのダウンロードを開始する必要がありますDownloadStringAsync。実行しているように見えるメソッドではありません。

DownloadStringCompletedイベントを処理する代わりに、イベントを処理しOpenReadCompleted、受信したバイトをローカル PDF ファイルのストリームに書き込む必要があります。AllowReadStreamBufferingを にtrue設定するOpenReadCompletedと、ファイル全体がダウンロードされたときにのみイベントが発生し、DownloadStringCompleted. ただし、PDF ファイル全体がメモリにバッファリングされるため、ファイルが非常に大きい場合は不適切な場合があります。

于 2013-10-11T07:27:43.223 に答える