Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17

Discussione: Creare archivio zip

  1. #1

    Creare archivio zip

    Salve a tutti.
    Dopo tanto penare nel forum asp mi è stato consigliato di chiedere agli esperti di asp.net

    Il mio problema è semplice: come faccio a creare un archivio zip di un certo numero n di files presenti sul mio server, con asp.net?

    Ulteriori informazioni:
    i files in questione sono immagini;
    questa funzionalità mi serve per poi integrarla in una fotogallery;
    non posso usare componenti aggiuntivi dll e simili da installare sul server;
    i files sono divisi in directories, quindi va bene che comprima direttamente tutta la directory

    In pratica mi servirebbe uno script asp.net che una volta lanciato va a leggere i files (o la directory) e comprima.

    Probabilmente la soluzione non è così semplice come la formulazione del problema

    Bene accetti link e suggerimenti!!

    Spero di essere stato il più chiaro possibile.
    Grazie in anticipo a tutti.


  2. #2
    Credo che tu ce la possa fare anche in classic ASP.

    Questo codice lo usavo per lanciare un'eseguibile sul server:
    codice:
    ' Lancio ptftk.exe per unire tutti i files pdf in un unico pdf
    set objWSH = server.createObject("wscript.shell")
    strPdftk = "c:\inetpub\wwwroot\test\pdftk "&strPdftkFiles&" cat output c:\inetpub\wwwroot\test\pdf\fileUnito.pdf"
    objWSH.Run (strPdftk)
    if err.Number<>0 then
    	Response.write "
    
    Errore nella gestione dei dati binari: " & Err.Description
    End if
    set objWSH = Nothing
    Se ti trovi i parametri a riga di comando di winZip o di un'altro programma simile puoi usare la stessa tecnica e il gioco è fatto.


  3. #3
    azz, pardon ...non avevo letto che non puoi installare niente sul server

    Però, probabilmente, winzip c'è installato ...se riesci a trovare dove (sempre che ce l'abbiano sul server) puoi invocarlo con una sintassi tipo:
    c:\programmi\winzip\winzip.exe [parametri che cercano i files nella cartella del tuo sito]

  4. #4
    Credo che non riuscirei a trovare il percorso fisico sul server e anche se lo trovassi probabilemente non potrei eseguire niente... comunque non me ne intendo molto ...

    Io uso asp.net per creare le thumbnail di immagini (quelle della fotogallery) e lo script è davvero semplice da usare: thumb.aspx?src=PercorsoImmagine&UlterioriParametri
    Una stupidaggine per chi come me mastica pochissimo asp.net.

    Il mio sogno sarebbe quello di trovare qualcosa di simile (richiamabile per esempio da un ciclo): richiamo una funzione del tipo comprimi(nomeArchivio, nomeFileDaComprimere, eventualiParametriAggiuntivi) e sono a posto...

    Esiste qualcosa di simile?

    Mi piacerebbe una risposta definitiva, qualunque essa sia!

    Grazie mille!!


  5. #5
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Non è una cosa semplice. Comunque, vedi se possa andare.

    Prima di tutto ti descrivo l'esempio che ho fatto nel mio computer.

    Ho una directory virtuale chiamata prova, in pratica il progetto di asp.

    Lì creo una directory chiamata Bin.

    Dentro Bin scarico la dll (che non deve essere registrata) da questo indirizzo:

    http://web.tiscali.it/archivio_esemp...harpZipLib.zip

    Naturalmente l'ho messa là per comodità mia, ma il sito originale è alla prima voce di google.

    Adesso, dentro prova, metto una pagina di prova asp, GetZip.asp
    codice:
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head>
        <title>Pagina senza titolo</title>
    <script language="javascript" type="text/javascript">
    // <!CDATA[
    
    function Button1_onclick()
    {
        document.getElementById("p_percorso").value = document.getElementById("Text1").value;
        document.getElementById("form1").submit();
    }
    
    // ]]>
    </script>
    </head>
    <body>
        <form id="form1" method="get" action="getzip.aspx">
            <span>Cartella da comprimere
    
            </span>
            <input id="Text1" type="text" style="width: 581px" />
            <input id="Button1" type="button" value="Comprimi" onclick="return Button1_onclick()" />
            <input id="p_percorso" name="p_percorso" type="hidden" />
        </form>
    </body>
    </html>
    sempre nella directory prova metto la pagina aspx che fa il lavoro, getzip.aspx
    codice:
    <%@ Page Language="C#" %>
    <%@ Import Namespace="System" %>
    <%@ Import Namespace="System.IO" %>
    <%@ Import Namespace="System.Data" %>
    <%@ Import Namespace="System.Configuration" %>
    <%@ Import Namespace="System.Collections" %>
    <%@ Import Namespace="System.Web" %>
    <%@ Import Namespace="System.Web.Security" %>
    <%@ Import Namespace="System.Web.UI" %>
    <%@ Import Namespace="System.Web.UI.WebControls" %>
    <%@ Import Namespace="System.Web.UI.HtmlControls" %>
    
    <%@ Import Namespace="ICSharpCode.SharpZipLib.Zip" %>
    <%@ Import Namespace="ICSharpCode.SharpZipLib.Checksums" %>
    
    <script runat="server">
    
        const string ZipFilePath = @"c:\tmp\foto.zip";
        string OriginalFolderPath = "";
        
        protected void Page_Load(object sender, EventArgs e)
        {
            string p_percorso = this.Request.QueryString["p_percorso"];
            //if (string.IsNullOrEmpty(p_percorso)) return;
            if (p_percorso == null || p_percorso == string.Empty) return;
    
            OriginalFolderPath = p_percorso;
    
            try
            {
                CreaFileZip();
                SpedisciFile(ZipFilePath);
    
            }
            catch (Exception ex)
            {
                this.Response.Write(ex.Message);        
            }    
        }
        
        
    
        private void CreaFileZip()
        {
            Zip.ZipFolder(ZipFilePath, OriginalFolderPath);
        }
    
    
    
        private void SpedisciFile(string filePath)
        {
            Response.Expires = -1;
    
            //' verifica esistenza 
            FileInfo fi  = new FileInfo(filePath);
            if (fi.Exists)
            {
                //' imposta le headers 
                Response.Clear();
                Response.AddHeader(@"Content-Disposition", @"attachment; filename=""" + fi.Name + @"""");
                Response.AddHeader("Content-Length", fi.Length.ToString());
                Response.ContentType = "application/octet-stream";
    
                //' leggo dal file e scrivo nello stream di risposta 
                Response.WriteFile(filePath);
    
                Response.End();
            }
            else
                Response.Write("Impossibile scaricare il file.");
    
        }
        
        
        
        
        
        
        
    //---------------------------------
    //http://www.guru4.net/articoli/zip/
    //---------------------------------
        /// <summary>
        /// Zip
        /// </summary>
        public class Zip
        {
            #region public methods
    
            /// <summary>
            /// Comprime il contenuto di un file in formato ZIP
            /// </summary>
            /// <param name="ZipFilePath">Path del file compresso da creare</param>
            /// <param name="OriginalFilePath">Path del file da comprimere</param>
            public static void ZipFile(string ZipFilePath, string OriginalFilePath)
            {
                ZipOutputStream zip = null;
                try
                {
                    FileInfo fi = new FileInfo(OriginalFilePath);
                    zip = new ZipOutputStream(File.Create(ZipFilePath));
                    zip.SetLevel(6);    // 0 - store only to 9 - means best compression
                    AddFile2Zip(zip, fi, "");
                    zip.Finish();
                    
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                { if (zip != null) zip.Close(); }
            }
    
            /// <summary>
            /// Comprime il contenuto di una cartella in formato ZIP, ricorsivamente e preservandone la struttura
            /// </summary>
            /// <param name="ZipFilePath">Path del file compresso da creare</param>
            /// <param name="OriginalFolderPath">Path della cartella da comprimere</param>
            public static void ZipFolder(string ZipFilePath, string OriginalFolderPath)
            {
                ZipOutputStream zip = null;
                try
                {
                    DirectoryInfo di = new DirectoryInfo(OriginalFolderPath);
                    zip = new ZipOutputStream(File.Create(ZipFilePath));
                    zip.SetLevel(6);    // 0 - store only to 9 - means best compression
                    AddFolder2Zip(zip, di, "");
                    zip.Finish();
                    
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                { if (zip != null) zip.Close(); }
    
            }
    
            /// <summary>
            /// Decomprime un file compresso ZIP nella cartella di destinazione specificata
            /// </summary>
            /// <param name="ZipFilePath">Path del file ZIP da decomprimere</param>
            /// <param name="DestinationPath">Cartella di destinazione dell'archivio decompresso</param>
            public static void UnZip(string ZipFilePath, string DestinationPath)
            {
                string dp = "";
                ZipInputStream zip = null;
                ZipEntry entry = null;
                FileStream streamWriter = null;
    
                try
                {
                    if( !Directory.Exists(DestinationPath) ) Directory.CreateDirectory(DestinationPath);
                    dp = (DestinationPath.EndsWith("\\")) ? DestinationPath : DestinationPath + @"\";
                    zip = new ZipInputStream(File.OpenRead(ZipFilePath));
    
                    while ((entry = zip.GetNextEntry()) != null)
                    {
                        if (entry.IsDirectory)
                            Directory.CreateDirectory(dp + entry.Name);
                        else
                        {
                            streamWriter = File.Create(dp + entry.Name);
                            int size = 2048;
                            byte[] data = new byte[2048];
                            while (true)
                            {
                                size = zip.Read(data, 0, data.Length);
                                if (size > 0)
                                    streamWriter.Write(data, 0, size);
                                else
                                    break;
                            }
                            streamWriter.Close();
                        }
                    }
                    //zip.Close();
    
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    if (streamWriter != null) streamWriter.Close();
                    if (zip != null) zip.Close();
                }
    
    
    
            }
    
            
    
    
            #endregion
    
            #region private methods
    
            private static void AddFolder2Zip(ZipOutputStream zip, DirectoryInfo di, string internalzippath)
            {
                string izp = internalzippath + di.Name + "/";    // A directory is determined by an entry name with a trailing slash "/"
                Crc32 crc = new Crc32();
                ZipEntry entry = new ZipEntry(izp);
                entry.Crc = crc.Value;
                zip.PutNextEntry(entry);
                foreach (FileInfo fi in di.GetFiles())
                    AddFile2Zip(zip, fi, izp);
                foreach (DirectoryInfo sdi in di.GetDirectories())
                    AddFolder2Zip(zip, sdi, izp);
            }
            private static void AddFile2Zip(ZipOutputStream zip, FileInfo fi, string internalzippath)
            {
                Crc32 crc = new Crc32();
                FileStream fs = File.OpenRead(fi.FullName);
                byte[] buffer = new byte[fs.Length];
                fs.Read(buffer, 0, buffer.Length);
                ZipEntry entry = new ZipEntry(internalzippath + fi.Name);
                entry.DateTime = DateTime.Now;
                entry.Size = fs.Length;
                fs.Close();
                crc.Reset();
                crc.Update(buffer);
                entry.Crc = crc.Value;
                zip.PutNextEntry(entry);
                zip.Write(buffer, 0, buffer.Length);
            }
    
            #endregion
        }
    
    </script>
    a te interessa la prima parte. Il file zippato viene archiviato in
    c:\tmp\foto.zip

    c:\tmp o la directory che vuoi tu, deve avere i permessi di scrittura per l'utente asp.net.

    La pagina viene richiamata inviando il parametro get, p_percorso, che contiene il percorso da zippare.

    Adesso si tratta solo di provare e riprovare: buona fortuna!
    Pietro

  6. #6
    Grazie mille!!! Ora sono un passo più vicino alla soluzione!! (che fatica però )
    Come mi hai detto proverò e riproverò.

    Ho solo qualche chiarimento/consiglio da chiederti:
    1. le prove che faccio in locale valgono ovviamente anche per il remoto?

    2. Sul server io ho una directory bin. Se non sbaglio ha i permessi di esecuzione. Mi è sufficiente quindi scaricare (sul mio pc) dall'indirizzo che mi hai dato quel file zip e poi dentro bin (sul server) copiare la dll?

    3. Non capisco nel codice aspx dove la pagina "va a cercare" la dll. (Questa è sicuramente una mia ignoranza in asp.net).

    4. (Probabilmente un'ovvietà) Il nome della cartella da comprimere lo posso prendere direttamente dal mio database e poi passarlo in qualche modo (a quello ci penso io durante l'upload della gallery) via querystring?

    5. Il file zip creato lo posso salvare in una qualsiasi cartella (che abbia i permessi di scrittura) del sito sul server, vero?

    6.Sono queste le righe di codice che mi interessano:
    codice:
        const string ZipFilePath = @"c:\tmp\foto.zip";
        string OriginalFolderPath = "";
    Se magari nel codice che hai postato (quello aspx) mi potessi evidenziare le parti da personalizzare... forse chiedo troppo eh?

    Grazie ancora e scusami se sono pedante.
    Come dico sempre: sono un gran rompiscatole!!



  7. #7
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    http://www.icsharpcode.net/OpenSource/SharpZipLib/

    1) sinceramente non capisco locale-remoto. Io lavoro su IIS e richiamo con http://nomeserver/prova/pagina.asp, perciò presumo che sia remoto

    2) la directory Bin io l'ho messa dentro la root del progetto, nel mio caso C:\Inetpub\wwwroot\prova\Bin. Lì ci metto quella dll opensource. Trovi in rete anche gli esempi di utilizzo.

    3)è la infrastruttura che va a cercare la dll in quella particolare directory

    4)questo è chiaro: la pagina asp che ho messo serve per fare esperimenti. Posso scrivere
    xxxxxxxxxxxxx

    5) sì, cambia il codice: const string ZipFilePath = @"c:\tmp\foto.zip";

    6) è solo la prima, const string ZipFilePath = @"c:\tmp\foto.zip";

    la seconda variabile viene valorizzata dal parametro get ricevuto:
    OriginalFolderPath = p_percorso;

    7) io direi solo questa istruzione
    const string ZipFilePath = @"c:\tmp\foto.zip"; con il percorso - file che vuoi te

    Insomma, fai sapere
    Pietro

  8. #8
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    a proposito, la classe zip, scaricabile a questo indirizzo:
    http://www.guru4.net/articoli/zip/

    me la sono un po' modificata. Lo dico per non esserci malintesi. Se non va prova a scaricare l'originale.
    Pietro

  9. #9
    Denghiu so magg!!!
    Tra qualche giorno faccio sapere!! Se funge ti faccio un monumento!!

    In pratica il mio problema era trovare questa famosa pagina aspx che mi potesse fare la compressione senza installare niente sul server...


  10. #10
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Originariamente inviato da sonik_the_sonik
    Denghiu so magg!!!
    Tra qualche giorno faccio sapere!! Se funge ti faccio un monumento!!



    Fammi toccare le palle non voglio monumenti, ancora
    Pietro

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 © 2026 vBulletin Solutions, Inc. All rights reserved.