Не удается загрузить файл .pdf в Silverlight

Я довольно новичок в Silverlight. Я пытаюсь загрузить файл .pdf (и несколько других форматов) в Silverlight. Пользователь нажимает кнопку, система переходит и получает 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.Result выглядит нормального размера (5Mb), но я подозреваю, что он содержит много посторонних символов. FileBytes кажется примерно в два раза больше (11 МБ). Я хотел попробовать DownloadDataAsync вместо DownloadStringAsync (надеясь, что это решит любые проблемы с кодировкой), но Silverlight имеет очень урезанную версию System.Net.WebClient и не поддерживает DownloadDataAsync (он не будет компилироваться).

Я вполне уверен, что это проблема с кодировкой, но я не вижу, как ее обойти.


person Peter Smartt    schedule 11.10.2013    source источник
comment
почему вы используете кодировку? Я думаю, что файлы PDF являются двоичными и не должны быть закодированы, вы пытались использовать DownloadDataCompleted (или написать строку без использования кодирования?)   -  person wiero    schedule 11.10.2013
comment
DownloadDataCompleted недоступен в версии System.Net.WebClient для Silverlight. Я попытался просто написать строку, но получил почти такой же результат.   -  person Peter Smartt    schedule 11.10.2013


Ответы (1)


Файлы PDF являются двоичными и не кодируются с использованием UTF8. Чтобы загрузить файл PDF с помощью Silverlight, вам необходимо использовать OpenReadAsync метода класса WebClient для начала загрузки бинарных данных файла, а не DownloadStringAsync, как вы, кажется, делаете.

Вместо обработки DownloadStringCompleted вы должны обработать OpenReadCompleted и записать полученные байты в поток локального файла PDF. Если вы установите параметр AllowReadStreamBuffering to true событие OpenReadCompleted запускается только тогда, когда весь файл был загружен, обеспечивая то же поведение, что и событие DownloadStringCompleted. Однако весь файл PDF будет буферизован в памяти, что может быть плохой идеей, если файл очень большой.

person Martin Liversage    schedule 11.10.2013
comment
Это исправило это @Martin. Это возвращает мне поток, поэтому мне просто нужно было использовать (Stream fs = (Stream)dialog.OpenFile()) { e3.Result.CopyTo(fs); fs.Flush(); фс.Закрыть(); MessageBox.Show(Файл успешно сохранен!); } - person Peter Smartt; 11.10.2013