none
Download di file multipli RRS feed

  • Domanda

  • Salve, nella mia app c'è una sezione per il download di 6 documenti (in formato pdf)

    Attualmente uso una pagina(visibile/non visibile in un frame) per il download di un singolo documento.

    In questo modo però ho sei pagine uguali, con lo stesso codice; cambia solo la stringa del nome del file e del sito da dove scaricarlo.

    Secondo voi è possibile semplificare il tutto e tramite una checkbox o una combobox selezionare i file da scaricare?

    In modo da avere solo 1 pagina di codice e modificare solo string fileName e string urlName

    Il codice che uso al momento è il seguente:

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Runtime.InteropServices.WindowsRuntime;
    using Windows.Foundation;
    using Windows.Foundation.Collections;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    using Windows.UI.Xaml.Controls.Primitives;
    using Windows.UI.Xaml.Data;
    using Windows.UI.Xaml.Input;
    using Windows.UI.Xaml.Media;
    using Windows.UI.Xaml.Navigation;
    using System.Threading;
    using Windows.Networking.BackgroundTransfer;
    using System.Threading.Tasks;
    using Windows.Storage.Pickers;
    using Windows.Storage;
    
    using CVB.Views.Sottopagine;
    
    // Il modello di elemento Pagina vuota è documentato all'indirizzo http://go.microsoft.com/fwlink/?LinkId=234238
    
    namespace CVB.Views.Sottopagine
    {
        /// <summary>
        /// Pagina vuota che può essere usata autonomamente oppure per l'esplorazione all'interno di un frame.
        /// </summary>
        public sealed partial class Download : Page
        {
           //Stringhe preliminari
    
            DownloadOperation downloadOperation;
            CancellationTokenSource cancellationToken;
            BackgroundDownloader backgroundDownloader = new BackgroundDownloader();
    
            //Determinazione link download e nome file
    
                
            string fileName = "Documento1.pdf";
            string urlName = "http://www.sitodiprova.it/images/stories/articoli/2016/Documento_1.pdf";
    
            
    
    
            public Download()
            {
                this.InitializeComponent();
            }
    
            
            //Inizio Codice per il download//
    
    
            private async void btnDownload_Click(object sender, RoutedEventArgs e)
            {
                FolderPicker folderPicker = new FolderPicker();
                folderPicker.SuggestedStartLocation = PickerLocationId.Downloads;
                folderPicker.ViewMode = PickerViewMode.Thumbnail;
                folderPicker.FileTypeFilter.Add("*");
                StorageFolder folder = await folderPicker.PickSingleFolderAsync();
                if (folder != null)
                {
                    StorageFile file = await folder.CreateFileAsync(fileName, CreationCollisionOption.GenerateUniqueName);
                    downloadOperation = backgroundDownloader.CreateDownload(new Uri(urlName), file);
                    Progress<DownloadOperation> progress = new Progress<DownloadOperation>(progressChanged);
                    cancellationToken = new CancellationTokenSource();
                    btnDownload.IsEnabled = false;
                    btnCancel.IsEnabled = true;
                    btnPauseResume.IsEnabled = true;
    
                    try
                    {
                        txtStatus.Text = "Inizializzazione...";
                        await downloadOperation.StartAsync().AsTask(cancellationToken.Token, progress);
                    }
                    catch (TaskCanceledException)
                    {
                        txtStatus.Text = "Download annullato";
                        //downloadOperation.ResultFile.DeleteAsync();//
                        btnPauseResume.Content = "Riprendi";
                        btnCancel.IsEnabled = false;
                        btnPauseResume.IsEnabled = false;
                        btnDownload.IsEnabled = true;
                        downloadOperation = null;
    
                    }
                }
            }
    
            private void btnPauseResume_Click(object sender, RoutedEventArgs e)
            {
                if (btnPauseResume.Content.ToString().ToLower().Equals("pausa"))
                {
                    try
                    {
                        downloadOperation.Pause();
                    }
                    catch (InvalidOperationException)
                    {
    
                    }
                }
                else
                {
                    try
                    {
                        downloadOperation.Resume();
                    }
                    catch (InvalidOperationException)
                    { }
                }
            }
    
            private void btnCancel_Click(object sender, RoutedEventArgs e)
            {
                cancellationToken.Cancel();
                cancellationToken.Dispose();
            }
    
            private async void Page_Loaded(object sender, RoutedEventArgs e)
            {
                IReadOnlyList<DownloadOperation> downloads = await BackgroundDownloader.GetCurrentDownloadsAsync();
                if (downloads.Count > 0)
                {
                    downloadOperation = downloads.First();
                    cancellationToken = new CancellationTokenSource();
                    Progress<DownloadOperation> progress = new Progress<DownloadOperation>(progressChanged);
                    btnDownload.IsEnabled = false;
                    btnCancel.IsEnabled = true;
                    btnPauseResume.IsEnabled = true;
                    try
                    {
                        txtStatus.Text = "Inizializzazione...";
                        await downloadOperation.AttachAsync().AsTask(cancellationToken.Token, progress);
                    }
                    catch (TaskCanceledException)
                    {
                        txtStatus.Text = "Download annulato";
    
                        btnPauseResume.Content = "Riprendi";
                        btnCancel.IsEnabled = false;
                        btnPauseResume.IsEnabled = false;
                        btnDownload.IsEnabled = true;
                        downloadOperation = null;
    
                    }
                }
            }
    
            private void progressChanged(DownloadOperation downloadOperation)
            {
                int progress = (int)(100 * ((double)downloadOperation.Progress.BytesReceived / (double)downloadOperation.Progress.TotalBytesToReceive));
                txtProgress.Text = String.Format("{0} di {1}kb. scaricato - %{2} completato.",
                    downloadOperation.Progress.BytesReceived / 1024,
                    downloadOperation.Progress.TotalBytesToReceive / 1024, progress);
    
                ProgressBarDownload.Value = progress;
                switch (downloadOperation.Progress.Status)
                {
                    case BackgroundTransferStatus.Running:
                        {
                            txtStatus.Text = "Download in corso...";
                            btnPauseResume.Content = "Pausa";
                            break;
                        }
                    case BackgroundTransferStatus.PausedByApplication:
                        {
                            txtStatus.Text = "Download in pausa";
                            btnPauseResume.Content = "Riprendi";
                            break;
                        }
                    case BackgroundTransferStatus.PausedCostedNetwork:
                        {
                            txtStatus.Text = "Downloading paused because of metered connection";
                            btnPauseResume.Content = "Resume";
                            break;
                        }
                    case BackgroundTransferStatus.PausedNoNetwork:
                        {
                            txtStatus.Text = "Nessuna connessione internet attiva rilevata. Connettiti ad una rete";
    
                            break;
                        }
                    case BackgroundTransferStatus.Error:
                        {
                            txtStatus.Text = "Impossibile effettuare il dowload a causa di un errore.";
    
                            break;
                        }
                }
                if (progress >= 100)
                {
                    txtStatus.Text = "Download Completato";
                    btnCancel.IsEnabled = false;
                    btnPauseResume.IsEnabled = false;
                    btnDownload.IsEnabled = true;
                    downloadOperation = null;
                }
    
            }
    
            private void closeButton_Click(object sender, RoutedEventArgs e)
            {
                this.Frame.Visibility = Visibility.Collapsed;
            }
    
            
        }
    }

    Grazie

    Simone

    giovedì 1 settembre 2016 10:13

Risposte

  • Ciao

    occhio che stai facendo un errore di fondo, il primo url è url assoluto che fa riferimento direttamente al file, il secondo invece non è un url assoluto, ma se lo apri in un browser vedrai che ti apre una pagina con all'interno il file, quindi quello che stai scaricando tu è la pagina html principale, immagino che se apri il file di testo con un editor vedrai la pagina html in questione. Non fa distinzione se è un file zippato o un singolo pdf, è sempre un unico file

    Se vuoi scaricare file da OneDrive ti conviene passare per le api ufficiali, la stessa cosa vale per altri servizi tipo dropbox ecc.

    Ciao

    Alessio

    • Contrassegnato come risposta Simone Raspagni venerdì 23 settembre 2016 21:02
    mercoledì 21 settembre 2016 12:17

Tutte le risposte

  • Ciao Simone, 

    Una possibilita - usare Zip library per scaricare tutti quanti in un file singolo. Dovresti indicare i riferimenti con CheckBox che puntano verso questi file poiche creare il zip tramite la library e server. 

    http://stackoverflow.com/questions/3984590/download-multiple-files-as-zip-in-net

    Vedi anche qui per altre diverse approach su un problema simile

    http://stackoverflow.com/questions/22747645/download-multiple-files-in-parallel-using-c-sharp


    • Microsoft offre questo servizio gratuitamente, per aiutare gli utenti e aumentare il database dei prodotti e delle tecnologie. Il contenuto fornito “as is“ non comporta alcuna responsabilità da parte dell’azienda.

    venerdì 2 settembre 2016 07:53
    Moderatore
  • grazie
    domenica 4 settembre 2016 14:48
  • Ciao,

    ho provato a creare una cartella zippata, caricarla e condividerla tramite link da OneDrive.

    Scaricandola dall'app, con questo codice, però Windows mi dice che la cartella zippata è corrotta/vuota.

    Scaricandola invece da edge me la apre normalmente.

    Possibile che il download corrompa i file?

    Qualche consiglio?

    grazie

    sabato 10 settembre 2016 17:33
  • ciao. Seguo anch'io!

    perché ho lo stesso problema !!

    isabella

    martedì 20 settembre 2016 19:47
  • Ciao,

    Alla fine hai risolto? Altrimenti puoi condividere il codice che utilizzi per scaricare il file da OneDrive per capire in modo da cercare di capire dove potrebbe essere il problema?

    Ciao

    Alessio

    martedì 20 settembre 2016 21:02
  • Ciao Alessio,

    il codice che uso è il seguente:

    CODICE:

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Runtime.InteropServices.WindowsRuntime;
    using Windows.Foundation;
    using Windows.Foundation.Collections;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    using Windows.UI.Xaml.Controls.Primitives;
    using Windows.UI.Xaml.Data;
    using Windows.UI.Xaml.Input;
    using Windows.UI.Xaml.Media;
    using Windows.UI.Xaml.Navigation;
    using System.Threading;
    using Windows.Networking.BackgroundTransfer;
    using System.Threading.Tasks;
    using Windows.Storage.Pickers;
    using Windows.Storage;
    
    using CVB.Views.Sottopagine;
    
    // Il modello di elemento Pagina vuota è documentato all'indirizzo http://go.microsoft.com/fwlink/?LinkId=234238
    
    namespace CVB.Views.Sottopagine
    {
        /// <summary>
        /// Pagina vuota che può essere usata autonomamente oppure per l'esplorazione all'interno di un frame.
        /// </summary>
        public sealed partial class Download : Page
        {
            public AppSettings AppSettings { get; set; } //PER OTTENERE IL TEMA CHIARO/SCURO SUBITO SENZA RIAVVIO APP
    
            //Stringhe preliminari
    
            DownloadOperation downloadOperation;
            CancellationTokenSource cancellationToken;
            BackgroundDownloader backgroundDownloader = new BackgroundDownloader();
    
            //Determinazione link download e nome file
    
                    // prova. al momento non funziona  
            string fileName = "Documenti_prova.zip";
            string urlName = "https://1drv.ms/u/s!Av7hifpxgWmDhdBNBFZvt_9RFlAPGg";
    
    
            public Download()
            {
                this.InitializeComponent();
                //PER OTTENERE IL TEMA CHIARO/SCURO SUBITO SENZA RIAVVIO APP
                AppSettings = new AppSettings();
                LoadTheme();
            }
    
            private void LoadTheme()
            {
                this.RequestedTheme = AppSettings.UseDarkThemeSetting ? ElementTheme.Dark : ElementTheme.Light;
            }
    
    
            //Inizio Codice per il download//
    
    
            private async void btnDownload_Click(object sender, RoutedEventArgs e)
            {
                FolderPicker folderPicker = new FolderPicker();
                folderPicker.SuggestedStartLocation = PickerLocationId.Downloads;
                folderPicker.ViewMode = PickerViewMode.Thumbnail;
                folderPicker.FileTypeFilter.Add("*");
                StorageFolder folder = await folderPicker.PickSingleFolderAsync();
                if (folder != null)
                {
                    StorageFile file = await folder.CreateFileAsync(fileName, CreationCollisionOption.GenerateUniqueName);
                    downloadOperation = backgroundDownloader.CreateDownload(new Uri(urlName), file);
                    Progress<DownloadOperation> progress = new Progress<DownloadOperation>(progressChanged);
                    cancellationToken = new CancellationTokenSource();
                    btnDownload.IsEnabled = false;
                    btnCancel.IsEnabled = true;
                    btnPauseResume.IsEnabled = true;
    
                    try
                    {
                        txtStatus.Text = "Inizializzazione...";
                        await downloadOperation.StartAsync().AsTask(cancellationToken.Token, progress);
                    }
                    catch (TaskCanceledException)
                    {
                        txtStatus.Text = "Download annullato";
                        //downloadOperation.ResultFile.DeleteAsync();//
                        btnPauseResume.Content = "Riprendi";
                        btnCancel.IsEnabled = false;
                        btnPauseResume.IsEnabled = false;
                        btnDownload.IsEnabled = true;
                        downloadOperation = null;
    
                    }
                }
            }
    
            private void btnPauseResume_Click(object sender, RoutedEventArgs e)
            {
                if (btnPauseResume.Content.ToString().ToLower().Equals("pausa"))
                {
                    try
                    {
                        downloadOperation.Pause();
                    }
                    catch (InvalidOperationException)
                    {
    
                    }
                }
                else
                {
                    try
                    {
                        downloadOperation.Resume();
                    }
                    catch (InvalidOperationException)
                    { }
                }
            }
    
            private void btnCancel_Click(object sender, RoutedEventArgs e)
            {
                cancellationToken.Cancel();
                cancellationToken.Dispose();
            }
    
            private async void Page_Loaded(object sender, RoutedEventArgs e)
            {
                IReadOnlyList<DownloadOperation> downloads = await BackgroundDownloader.GetCurrentDownloadsAsync();
                if (downloads.Count > 0)
                {
                    downloadOperation = downloads.First();
                    cancellationToken = new CancellationTokenSource();
                    Progress<DownloadOperation> progress = new Progress<DownloadOperation>(progressChanged);
                    btnDownload.IsEnabled = false;
                    btnCancel.IsEnabled = true;
                    btnPauseResume.IsEnabled = true;
                    try
                    {
                        txtStatus.Text = "Inizializzazione...";
                        await downloadOperation.AttachAsync().AsTask(cancellationToken.Token, progress);
                    }
                    catch (TaskCanceledException)
                    {
                        txtStatus.Text = "Download annulato";
    
                        btnPauseResume.Content = "Riprendi";
                        btnCancel.IsEnabled = false;
                        btnPauseResume.IsEnabled = false;
                        btnDownload.IsEnabled = true;
                        downloadOperation = null;
    
                    }
                }
            }
    
            private void progressChanged(DownloadOperation downloadOperation)
            {
                int progress = (int)(100 * ((double)downloadOperation.Progress.BytesReceived / (double)downloadOperation.Progress.TotalBytesToReceive));
                txtProgress.Text = String.Format("{0} di {1}kb. scaricato - %{2} completato.",
                    downloadOperation.Progress.BytesReceived / 1024,
                    downloadOperation.Progress.TotalBytesToReceive / 1024, progress);
    
                ProgressBarDownload.Value = progress;
                switch (downloadOperation.Progress.Status)
                {
                    case BackgroundTransferStatus.Running:
                        {
                            txtStatus.Text = "Download in corso...";
                            btnPauseResume.Content = "Pausa";
                            break;
                        }
                    case BackgroundTransferStatus.PausedByApplication:
                        {
                            txtStatus.Text = "Download in pausa";
                            btnPauseResume.Content = "Riprendi";
                            break;
                        }
                    case BackgroundTransferStatus.PausedCostedNetwork:
                        {
                            txtStatus.Text = "Downloading paused because of metered connection";
                            btnPauseResume.Content = "Resume";
                            break;
                        }
                    case BackgroundTransferStatus.PausedNoNetwork:
                        {
                            txtStatus.Text = "Nessuna connessione internet attiva rilevata. Connettiti ad una rete";
    
                            break;
                        }
                    case BackgroundTransferStatus.Error:
                        {
                            txtStatus.Text = "Impossibile effettuare il dowload a causa di un errore.";
    
                            break;
                        }
                }
                if (progress >= 100)
                {
                    txtStatus.Text = "Download Completato";
                    btnCancel.IsEnabled = false;
                    btnPauseResume.IsEnabled = false;
                    btnDownload.IsEnabled = true;
                    downloadOperation = null;
    
    
                }
    
            }
    
            private void closeButton_Click(object sender, RoutedEventArgs e)
            {
                this.Frame.Visibility = Visibility.Collapsed;
            }
    
            
        }
    }

    Il download di per se funziona.

    Con i seguenti parametri (quindi un singolo file)

     string fileName = "Documento.pdf";
    string urlName = "https://sitowebdiprova.it";

    il download viene correttamente eseguito e il file pdf si apre.

    Invece con  questi parametri

    string fileName = "Documenti_prova.zip";
    string urlName = "https://1drv.ms/u/s!Av7hifpxgWmDhdBNBFZvt_9RFlAPGg";

    la cartella zippata viene scaricata. Ma poi tentando di aprire la cartella per estrarne il contenuto Windows mi segnala che il file è corrotto (zip non valido/cartella vuota)

    Secondo te Alessio?

    Grazie

    ciao

    simone

    mercoledì 21 settembre 2016 11:07
  • Ciao

    occhio che stai facendo un errore di fondo, il primo url è url assoluto che fa riferimento direttamente al file, il secondo invece non è un url assoluto, ma se lo apri in un browser vedrai che ti apre una pagina con all'interno il file, quindi quello che stai scaricando tu è la pagina html principale, immagino che se apri il file di testo con un editor vedrai la pagina html in questione. Non fa distinzione se è un file zippato o un singolo pdf, è sempre un unico file

    Se vuoi scaricare file da OneDrive ti conviene passare per le api ufficiali, la stessa cosa vale per altri servizi tipo dropbox ecc.

    Ciao

    Alessio

    • Contrassegnato come risposta Simone Raspagni venerdì 23 settembre 2016 21:02
    mercoledì 21 settembre 2016 12:17
  • Ciao,

    Grazie!

    Simone

    venerdì 23 settembre 2016 10:30
  • Ciao,

    se quindi il tuo problema è risolto puoi chiudere il thread segnando un post come risposta del thread

    Ciao

    Alessio

    venerdì 23 settembre 2016 15:44