скачать файл из абсолютного URI для потоковой передачи в SaveFileDialog - PullRequest
5 голосов
/ 22 ноября 2011

Я дошел до того, что поместил файл в поток из URL. Однако вставка savefiledialog внутри события OpenReadCompleted дает исключение, потому что savefiledialog должен запускаться из события, связанного с пользователем. Помещение savefiledialog NOT в OpenReadCompleted дает ошибку, поскольку массив байтов пуст, еще не обработан. Есть ли другой способ сохранить файл в поток из URI без использования события?

public void SaveAs()
{
WebClient webClient = new WebClient(); //Provides common methods for sending data to and receiving data from a resource identified by a URI.
        webClient.OpenReadCompleted += (s, e) =>
                                           {
                                               Stream stream = e.Result; //put the data in a stream
                                               MemoryStream ms = new MemoryStream();
                                               stream.CopyTo(ms);
                                               bytes = ms.ToArray();
                                           };  //Occurs when an asynchronous resource-read operation is completed.
        webClient.OpenReadAsync(new Uri("http://testurl/test.docx"), UriKind.Absolute);  //Returns the data from a resource asynchronously, without blocking the calling thread.

        try
        {
        SaveFileDialog dialog = new SaveFileDialog();
        dialog.Filter = "All Files|*.*";

        //Show the dialog
        bool? dialogResult = dialog.ShowDialog();

        if (dialogResult != true) return;

        //Get the file stream
        using (Stream fs = (Stream)dialog.OpenFile())
        {
            fs.Write(bytes, 0, bytes.Length);
            fs.Close();

            //File successfully saved
        }
        }
        catch (Exception ex)
        {
            //inspect ex.Message
            MessageBox.Show(ex.ToString());
        }

}

Ответы [ 2 ]

7 голосов
/ 22 ноября 2011

Подход состоит в том, чтобы сначала открыть SaveFileDialog в результате некоторого взаимодействия с пользователем, такого как нажатие кнопки.После того, как пользователь определил, куда сохранить загрузку, и метод SaveDialog возвратил, вы сохраняете этот экземпляр SaveFileDialog под рукой.

Затем вы вызываете загрузку, и в OpenReadCompleted вы можете использоватьSaveFileDialog OpenFile метод для получения потока, в который вы можете накачать результат.

public void SaveAs() 
{
    SaveFileDialog dialog = new SaveFileDialog(); 
    dialog.Filter = "All Files|*.*"; 

    bool? dialogResult = dialog.ShowDialog(); 

    if (dialogResult != true) return;

    WebClient webClient = new WebClient();
    webClient.OpenReadCompleted += (s, e) => 
    { 
        try 
        {      
            using (Stream fs = (Stream)dialog.OpenFile()) 
            {
                e.Result.CopyTo(fs); 
                fs.Flush(); 
                fs.Close(); 
            }

         } 
         catch (Exception ex) 
         { 
             MessageBox.Show(ex.ToString()); 
         } 
    }; 
    webClient.OpenReadAsync(new Uri("http://testurl/test.docx"), UriKind.Absolute); 
} 

Вы заметите, что код не только чище и проще, но если пользователь в конечном итоге отменитSaveFileDialog Вы не потратили впустую свое время или пропускную способность, загружая файл.

0 голосов
/ 20 мая 2016

Я нашел простой способ загрузить файл из приложения silverlight.используйте элемент управления HyperLinkButton.

Вы можете указать цель также с помощью свойства "TargetName".

...