无法在 Silverlight 中下载.pdf文件

本文关键字:下载 pdf 文件 Silverlight | 更新日期: 2023-09-27 18:35:06

我对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));

文件保存正常,但它大约是原始文件的两倍,并且不可读。 e3.结果看起来大小合适(5Mb),但我怀疑它包含很多无关的字符。 FileBytes 似乎太大了两倍(11Mb)。 我想尝试DownloadDataAsync而不是DownloadStringAsync(希望它能解决任何编码问题),但是Silverlight有一个非常精简的System.Net.WebClient版本,并且不支持DownloadDataAsync(它不会编译)。

我相当确定这是一个编码问题,但我看不到如何解决它。

无法在 Silverlight 中下载.pdf文件

PDF文件是二进制的,不使用UTF8进行编码。要使用 Silverlight 下载 PDF 文件,您需要使用 WebClient 类的 OpenReadAsync 方法来开始下载文件的二进制数据,而不是像您似乎正在做的那样使用 DownloadStringAsync 方法。

您应该处理 OpenReadCompleted 事件并将接收到的字节写入本地 PDF 文件的流中,而不是处理 DownloadStringCompleted 事件。如果将 AllowReadStreamBuffering 设置为true则仅当下载了整个文件时,才会触发 OpenReadCompleted 事件,从而提供与DownloadStringCompleted相同的行为。但是,整个PDF文件将缓冲在内存中,如果文件非常大,这可能是一个坏主意。