Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2011
    Messaggi
    9

    Problemi con download di file

    Buonasera,
    stò realizzando un'applicazione web che permetta di accedere da remoto ad un database tramite una procedura di ricerca, con lo scopo di selezionare e scaricare dei file.
    La maschera di ricerca così come il gridview che utilizzo per visualizzare i dati del database sono realizzati con ajax e updatepanel di aspx in modo da non dover ricaricare la pagina ad ogni ricerca.
    Una volta selezionata un file si può procedere al download.
    La procedura di download usa DotNetZip lib per creare uno zip del file e tramite response lo permette di scaricare. La procedura viene richiamata dal click di un bottone, "btnDownload" il quale legge i path dei file selezionati e li passa alla procedura che zippa ed effettua il download.
    Il tutto apparentemente funziona a meraviglia,apparte il fatto che quando è attivo un download (i file sono di dimensioni notevoli da 50 a 500mb) la maschera di ricerca e tutti i bottoni del sito web sono "ignorati", fino al completamento del download.
    Una ricerca effettuata durante il trasferimento dati, viene messa in una coda e servita appena possibile.
    Come posso risolvere questo inconventiente? Vorrei ovviamente far in modo che questa operazione non sia bloccante, e che se necessario sia possibile per l'utente eseguire un nuovo download.
    Grazie mille per la disponibilità,
    Daniele

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    131
    Prova ad utilizzare ajax anche per il download, al click sul bottone passi i vari valori alla pagina... dico cosi ad impatto non ho mai provato...

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2011
    Messaggi
    9
    Provando a far partire una chiamata asincrona sul bottone che fa partire il download, non funziona il response e quindi non viene fatto partire il trasferimento perchè non ricarica la pagina.
    Penso che quando uno clicca sul bottone download, deve essere creato un nuovo thread (threadworker??) che scarichi il file.
    Il problema è che non so come fare, sempre se è la soluzione giusta.

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    131
    e se provi tramite javascript ad aprirti un pagina like popup e da li fai partire il download, come utilizzano molti siti?

  5. #5
    Utente di HTML.it
    Registrato dal
    Aug 2011
    Messaggi
    9
    Ciao, ho provato ad usare javascript ma non funziona. Ovvero apro una popup, nella quale nell'onload carica un metodo che zippa i file e fa partire il download.
    Il file viene zippato e scaricato, ma durante l'operazione la ricerca di nuovi record da pagina principale è sempre bloccata (l'interfaccia invece rimane attiva).
    Non riesco a capire cosa sbaglio. Ho provato anche a fargli generare dei link html con il response.write ma il link generato non funziona (in pratica al click non avviene niente).

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    131
    posta il codice della gridview se puoi

  7. #7
    Utente di HTML.it
    Registrato dal
    Aug 2011
    Messaggi
    9
    Buongiorno, provo a esporre meglio il problema.
    Ho dei campi da riempire prima di eseguire una ricerca, una volta riempiti clicco sul pulsante "cerca" il quale esegue una query ad un db mysql e riporta i risultati sulla gridview.
    La gridview è inserita in un updatepanel, nel quale vi è il trigger async del bottone "cerca".
    Sulla gridview vi è un campo check dal quale è possibile selezionare un record (quindi nella gridview non vi è nessun download diretto di un file).
    Sotto la gridview ho un bottone "aggiungi a selezione" che mi permette di prelevare i link ai file da db selezionati tramite la check e metterli in un array.
    Una volta aggiunto almeno un link al "carrello" compare il pulsante download, il quale esegue un postback (altrimenti non riuscivo a farlo partire il download tramite response) il quale si occupa di zippare i link del carrello con DotNetZip e invece che salvarlo in memoria sul server inviarli tramite response.outputstream al client.
    Questa procedura funziona anche se (presumo per la tipologia sincrona di chiamata che faccio) impedisce di eseguire altre operazioni con il server. Infatti ogni chiamata eseguita durante il trasferimento viene servita immediatamente dopo il termine del download.

    "Ignorantemente" quando mi hai consigliato di eseguire il download su un popup, il bottone download eseguiva un OnClientClick che apriva una pagina download.aspx la quale con un bottone da cliccare rieseguiva l'operazione sopra descritta.

    Anche in questo caso però le richieste fatte dalla pagina principale rimangono accodate fino al completamento dell'operazione.

    P.S.
    Ti allego il codice associato al bottone download
    Questa comando è aggiunto nel trigger dell'updatepanel:

    <asp:PostBackTrigger ControlID="btnDownload" />


    Mentre questi sono nella pagina.cs
    protected void btnDownload_Click(object sender, EventArgs e)
    {
    if (Session["DownloadLink"] != null)
    {
    List<String> strList = new List<String>();
    strList = Session["DownloadLink"] != null ? (List<String>)Session["DownloadLink"] : null;
    Session["DownloadLink"] = null;
    lblElementiCarrello.Text = "Elementi selezionati: 0";
    if (strList.Count > 0)
    {
    //lblElementiCarrello.Text = "";

    String[] pathFiles = new String[strList.Count];
    for (int k = 0; k < strList.Count; k++)
    {
    pathFiles[k] = strList[k];
    }
    this.downloadZip(pathFiles);
    }
    }
    }

    public void downloadZip(String[] pathFiles)
    {
    Response.Clear();
    Response.BufferOutput = false;

    String ReadmeText = DateTime.Now.ToString("G");
    string archiveName = String.Format("Tesifer-{0}.zip", DateTime.Now.ToString("yyyy-MMM-dd-HHmmss"));
    Response.ContentType = "Archivio/Zip";
    Response.AddHeader("content-disposition", "attachment; filename=" + archiveName);

    using (Ionic.Zip.ZipFile zip = new Ionic.Zip.ZipFile())
    {
    for (int i = 0; i < pathFiles.Length; i++)
    {
    FileInfo f = new FileInfo(pathFiles[i]);
    String s = f.Directory.Name.ToString();
    zip.AddFile(pathFiles[i], s);
    }
    zip.Save(Response.OutputStream);
    Response.Close();
    }
    Session["DownloadLink"] = null;
    lblElementiCarrello.Text = "Elementi selezionati: 0";
    }

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    131
    dovresti provare a lavorare con i thread penso

  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    131
    prova a vedere se questo ti può essere d'auito

    http://www.codeproject.com/Articles/...ing-in-ASP-NET

  10. #10
    Utente di HTML.it
    Registrato dal
    Aug 2011
    Messaggi
    9
    Grazie mille per le risposte.

    Ho stravolto il codice dell'applicazione.

    Adesso ad ogni click server side fa partire un thread che zippa il file e lo salva in una cartella in locale sul server.

    Una volta finita questa procedura spedisce il link del file tramite una mail all'utente che ha richiesto l'operazione.

    Al momento questa soluzione può andare bene, in quanto non mi blocca l'interfaccia e posso ripetere l'operazione per più volte.

    Adesso devo implementare un feedback per l'utente che gli segnali che la procedura è in esecuzione.

    Esiste la possibilità di farmi avvisare dal thread quando ha finito la procedura??, casomai aggiornando la pagina principale "appendendo" il link del file generato in un iframe.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.