#701 - Upload e scompattamento di un allegato ZIP

Spesso si sente la necessità di effettuare un upload multiplo e l'operazione, com'è noto, non è possibile se non creando tanti campi di upload quanti sono i files che si vogliono spedire.
L'operazione diventa complessa se si devono spedire ad esempio 50 files o se non si conosce a priori il numero di files da inviare.
Per ovviare a questi problemi si può usare un piccolo stratagemma: inviare cioè al server un file ZIP che viene scompattato a destinazione raggiunta!
La logica sotto descritta è in grado di compattare solo file ZIP al cui interno siano presenti solo files e non cartelle.
Grazie ad una potente libreria open source, SharpZipLib, questa operazione è possibile con poche righe di codice.

Prima di tutto, seguiamo le istruzioni contenute nello script #282 per creare una maschera di upload.
Al pulsante associamo l'evento BtnUp_Click ed aggiungiamo una label denominata lblZIP che visualizzerà l'esito dell'operazione.

A questo punto, si inserisce il codice: è ovviamente necessario inserire  riferimenti alla libreria e al Namespace System.IO che gestisce i files e le cartelle.

<%@ Register TagPrefix="ic" Namespace="ICSharpCode.SharpZipLib" Assembly="ICSharpCode.SharpZipLib, Version=0.5.0.0, Culture=neutral, PublicKeyToken=1b03e6acf1164f73" %>
<%@ import Namespace="ICSharpCode.SharpZipLib.Zip" %>
<%@ import Namespace="ICSharpCode.SharpZipLib.Checksums" %>
<%@ import Namespace="System.IO" %>

Si crea quindi l'evento associato al pulsante:

Sub BtnUp_Click(sender As Object, e As EventArgs)
  dim strFile as string
  strFile = inputFile.PostedFile.FileName
  'Ricavo il nome del file SENZA percorso.
  Dim strNomeFile as string
  strNomeFile = System.IO.Path.GetFileName(strFile)
  dim strPercorsoFileUpload as string
  strPercorsoFileUpload =server.mappath("/tempzip")
  'Effettuo UPLOAD
  inputFile.PostedFile.SaveAs( strPercorsoFileUpload & "\" & strNomeFile)
  'scompatta lo zip
  scompatta(strPercorsoFileUpload,strPercorsoFileUpload & "\" & strNomeFile,true,false)
End Sub

Il codice provvede a fare l'upload del file zip sul server, nella cartella indicata dalla variabile strPercorsoFileUpload (che è impostata su di una cartella denominata tempzip). Questa riga deve essere ovviamente personalizzata secondo le proprie esigenze.
L'ultima riga chiama la subroutine Scompatta che provvede a realizzare il lavoro più grosso.
La routine richiede due parametri obbligatori e due opzionali: i primi sono l'indirizzo della cartella di upload che deve essere assoluto (del tipo c:\inetpub\wwwroot\tuosito\cartellaxy) ed il secondo il nome, completo di path del file zippato, anche questo assoluto.
I due parametri opzionali, impostati di default su false, permettono, rispettivamente, di eliminare il file zip una volta terminata la scompattazione o di rinominare come .bak il file zippato e compresso sul server.
Nell'esempio, la chiamata alla funzione è tale da determinare la cancellazione del file.
È ovvio che non è possibile attribuire alla variabile rinomina il valore true se si è impostato elimina.
All'interno della routine, la variabile di testo denominata elencofile viene usata per creare una stringa, i cui elementi sono separati dal tag <br>, contenente i nomi dei files compattati; tale stringa viene quindi visualizzata nella label lblZIP prima descritta ad operazione ultimata.
Nel caso di errore, il codice provvede a segnalarlo nella stessa label il cui colore in primo piano viene impostato su rosso.

Public sub scompatta(ByVal cartella As String, _
            ByVal zipFic As String, _
            Optional ByVal elimina As Boolean = False, _
              Optional ByVal rinomina As Boolean = False)

  Dim flag as boolean 'gestisce il corretto scompattamento
  dim fileName as string
  dim elencofile as string 'stringa di testo con all'interno i files scompattati

  If Not zipFic.ToLower.EndsWith(".zip") Then
    zipFic = Directory.GetFiles(zipFic, "*.zip")(0)
  End If

  Dim z As New ZipInputStream(File.OpenRead(zipFic))
  Dim theEntry As ZipEntry

  Do
    theEntry = z.GetNextEntry()
    If Not theEntry Is Nothing Then

      fileName  = cartella & "\" & Path.GetFileName(theEntry.Name)
      elencofile +=fileName +"<br>"
      Dim streamWriter As FileStream

      Try
        streamWriter = File.Create(fileName)
      Catch ex As DirectoryNotFoundException
        lblZIP.forecolor=drawing.color.fromname("Red")
        lblZIP.text="Errore!"
        flag=true
      End Try

      Dim size As Integer
      Dim data(2048) As Byte
      Do
        size = z.Read(data, 0, data.Length)
        If (size > 0) Then
          streamWriter.Write(data, 0, size)
        Else
          Exit Do
        End If
      Loop
      streamWriter.Close()
    Else
      Exit Do
    End If
  Loop
  z.Close()

  if not flag then
    lblZIP.forecolor=drawing.color.fromname("Green")
    lblZIP.text= "Scompattati:<BR>"+elencofile
  end if
  ' elimina se richiesto il file zip: default --> non elimina

  If elimina Then
    File.Delete(zipFic)
  End If
  ' rinomina se richiesto: default --> non rinomina
  If rinomina Then
    try
      File.delete (zipFic & ".bak")
    finally
      File.Copy(zipFic, zipFic & ".bak")
    end try
  End If

End Sub

Ovviamente il codice può essere variato, in particolare creando una function di cui gestire il risultato; potrebbe inoltre essere utile - o necessario a seconda dei casi - assicurarsi che venga effettivamente inviato un file compresso e non di altro tipo, come si può fare basandosi sullo script #446.

Per approfondimenti si veda:

#282 - Upload con ASP.NET
http://www.aspitalia.com/liste/usag/script.aspx?ID=282

#446 - Upload con ASP.NET di immagini con controllo su content type, dimensione e larghezza/altezza
http://www.aspitalia.com/liste/usag/script.aspx?ID=446

Nota: Questo script contiene un allegato.


Approfondimenti

Commenti

Esprimi il tuo giudizio su questo script:

Per procedere devi essere autenticato.

Wasabi_TV scrive:
#701 - Upload e scompattamento di un allegato ZIP

A ME VIENE FUORI QUESTO ERRORE CHE SIGNIFICA ? HELP PLEASE Runtime ErrorDescription: An application error occurred on the server. The current custom ...
martedì 21 marzo 2006 | 3 risposte
letizia.morichetti scrive:
#701 - Upload e scompattamento di un allegato ZIP

I] ho provato a scaricare l'esempio e a visualizzare la pagina nel browser ma genera un errore (ovviamente ho già copiato la dll, è forse un problema ...
giovedì 22 settembre 2005 | 3 risposte
valer80 scrive:
martedì 19 luglio 2005 | 3 risposte

Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.




IN EVIDENZA
MISC