Glengamoi (Forum) · AspHeute · .NET Heute (RSS-Suche) · AspxFiles (Wiki) · .NET Blogs

Zippen und entzippen von Dateien

Geschrieben von: Christian Koller
Kategorie: ASP Tricks

This printed page brought to you by AlphaSierraPapa

Das Übertragen von großen Datenmengen im Internet ist oftmals eine Frage der Geduld - oder der Planung. Hat man zum Beispiel jeden Tag eine komplette Website auf den Webserver zu kopieren, so ist dies spätestens bei 1 MB und 100 Dateien ein langwieriges Unterfangen.

Genauso lang dauert es im Allgemeinen, um vom Webserver große Datenmengen, wie zum Beispiel eine Access Datenbank (*.mdb Datei) zur Sicherung vom Webserver zu laden.

Um nun die Datenmenge und die Ladezeit zu minimieren, kann man Tools zum Komprimieren von Dateien, wie Winzip, verwenden.

Winzip ist das wohl verbreitetste Komprimierungsprogramm unter Windows. Die mit Winzip erzeugten Archive haben überlicherweise die Dateiendung ZIP. Solch ein ZIP-Archiv kann eine Datei, mehrere Dateien sowie ganze Verzeichnisse samt Unterverzeichnissen enthalten. Das Archiv selbst ist etwa 10% - 95% kleiner als die ürsprünglichen Dateien.

Arbeitet man mit einem FTP (File Transfer Protocol) Programm um Zugriff auf die Dateien eines Webservers zu erlangen, so ist das Laden oder Senden einer ZIP-Datei schneller als wenn man die unkomprimierten Daten transferiert. Nicht nur, daß eine geringere Datenmenge schneller übertragen wird, auch das Übertragen von einer Datei (dem ZIP-Archiv) anstatt von mehreren Dateien erlaubt eine Steigerung der durchschnittlichen Übertragungsrate.

Das folgende Diagramm (Bild 1) zeigt, wie der Prozess des Übertragens von komprimierten Daten zum Webserver vor sich geht: Beliebig viele Dateien werden in ein ZIP-Archiv (im Diagramm Transfer.zip) gepackt. Dabei vermindert sich die Gesamtgröße der Datenmenge vor allem bei Textdateien (wie .htm, .asp) erheblich. Das Archiv wird dann mittels FTP auf den Webserver transferiert, und die darin enthaltenen Dateien werden dann wieder entpackt und auf den Webserver geschrieben.


Bild 1: Senden von gepackten Dateien an den Webserver

Komprimieren von Dateien und Verzeichnissen

Der erste Teil des Prozesses ist einfach: Sie benutzen WinZip und komprimieren ein Verzeichnis mit allen darin enthaltenen Dateien und Unterverzeichnissen und speichern das Archiv unter Transfer.zip (oder einem anderen Namen) in einem beliebigen Verzeichnis auf Ihrem Computer ab.

Tip: Wenn Winzip auf Ihrem Computer installiert ist, so klicken Sie mit der rechten Maustaste auf das zu komprimierende Verzeichnis oder eine einzelne Datei und wählen "Zu ZIP Archiv hinzufügen" (Siehe Bild 2). Das ZIP-Archive wird im selben Verzeichnis erstellt, das auch das zu komprimierende Verzeichnis enthält.


Bild 2: Komprimieren eines Verzeichnisses

Öffnen Sie das ZIP-Archiv mit einem Doppelklick, so sehen Sie die darin gespeicherten Dateien, deren Komprimierung und den ursprünglichen, relativen Pfad der Datei (Bild 3).


Bild 3: Inhalt des ZIP-Archives

Dieses Archiv können Sie mit jedem beliebigen FTP-Pragramm (z.b. WS_FTP LE) zum Webserver transferieren.

Jetzt kommt die eigentliche Hürde des Prozesses: Wie entpackt man das Archiv wieder am Webserver? Wenn Sie direkten Zugriff auf den Server haben, so können Sie das Archiv wieder mit Winzip entpacken. Wenn Sie allerdings nur über FTP und ASP auf Ihren Server zugreifen können, wie dies oft bei gemieteten Webserver-Accounts der Fall ist, so müssen Sie zu anderen Mitteln greifen.

Entpacken des ZIP-Archives am Webserver

Um ein ZIP-Archiv am Webserver zu entpacken und die Dateien in der gespeicherten Verzeichnisstruktur auf den Webserver zu schreiben, empfiehlt sich der Einsatz einer ASP Komponente.

Ich habe für diesen Artikel (exemplarisch für andere Komponenten), die ActiveFile Komponente der Firma Infomentum gewählt, da diese mit ZIP Dateien am Server umgehen kann und von ASP aus problemlos einsetzbar ist.

Installation der ActiveFile Komponente am Webserver

Bevor die ActiveFile Komponente am Webserver benutzt werden kann, muß sie am Webserver installiert werden. Dies erlaubt für gewöhnlich jeder ernstzunehmende ASP Provider. Wenn Sie ActiveFile selber am Webserver installieren wollen, so müssen Sie dazu nur die Datei ActiveFile22.exe (bei ActiveFile Version 2.2.7) vom Hersteller laden und mit einem Doppelklick auf die Datei die Installation starten.

Während der Installation können Sie eventuell eine kompakte Installation ("Compact" bei Setup Type) wählen, um nur die zum Betrieb notwendigen Dateien, aber keine Dokumentation und Beispiele zu installieren. Installieren Sie die ActiveFile Komponente auf einem beliebigen virtuellen Server, so ist sie normalerweise von den ASP Dateien in allen virtuellen Servern desselben Computers aus verwendbar.

Verwendung der ActiveFile Komponente

Die ActiveFile Komponente ist eine ActiveX Komponente und kann daher von jeder ASP Datei am Webserver benutzt werden.

Dabei verfügt die ActiveFile Komponente über eine Vielzahl von Objekten zum Manipulieren von Dateien, Verzeichnissen und ZIP-Archiven.

Hier ein einfaches ASP Skript (ExtractZIP.asp), das ein beliebiges ZIP-Archiv, das am Webserver liegt, entpackt und die darin enthaltenen Dateien auf den Webserver schreibt. Die Datei ExtractZIP.asp ist im Download zu diesem Artikel enthalten. Die ASP-Fehlerbehandlung mittels On Error Resume Next, die Fehler auffängt wenn zum Beispiel auf ein nicht existierendes Archiv zugegriffen werden soll, sind im nachfolgenden Listing der Überischt halber weggelassen.

<%
 If Request.ServerVariables("CONTENT_LENGTH") <> 0 Then
    isPostBack = True
    ZipDatei = Trim(Request.Form("ZipDatei"))
    Verzeichnis = Trim(Request.Form("Verzeichnis"))
    
    PhysVerzeichnis = Server.MapPath(Verzeichnis)
    PhysZipDatei = Server.MapPath(ZipDatei)
 
    Response.Write("Entpacke Datei<br>" & ZipDatei & _
    " (" & PhysZipDatei & ")<br>in Verzeichnis<br>" & _
    Verzeichnis & " (" & PhysVerzeichnis & ").<br><br>")
    
    ' Instanziere das Archive Objekt
     Set Archive = Server.CreateObject("ActiveFile.Archive")
    
    ' Schreibe alle Dateien auf den Webserver
    ' ACHTUNG: Ueberschreibt alle Dateien ohne Vorwarnung!
    Archive.Extract "*.*", PhysVerzeichnis
    
	Set Archive = Nothing   
 Else
    isPostBack = False
 End If
%>

<% If  isPostBack = False Then %>

 <form action="<%= Request.ServerVariables("SCRIPT_NAME") %>" 
    method="POST">
 ZipDatei am Server: 
   <input type="Text" name="ZipDatei" 
   value="/Verzeichnis/Datei.zip"> <br>
 Entpacken in Verzeichnis: 
   <input type="Text" name="Verzeichnis" value="/Verzeichnis">
 <br>

 <input type="Submit" name="Submit" value="Entpacken">
 </form>

<% End If %>

Dieses ASP Skript präsentiert ein Webformular, in dem Sie angeben können, wo sich die zu entpackenden ZIP-Dateien befinden, und in welches Verzeichnis die Dateien und Verzeichnisse des ZIP-Archives geschrieben werden sollen. Das Programm verlangt relative Pfadangaben (relativ zum Hauptverzeichnis des Webservers), die mittels Server.MapPath in absolute Pfade umgerechnet werden.

Damit das Skript ausführbar ist, muß der IUSR_Machine Account des Windows NT 4.0 oder Windows 2000 Webservers ausreichende Schreibrechte für die Verzeichnisse und Dateien der Website haben. Die Gründe dafür finden Sie in unserem Artikel Schreiben einer Textdatei auf den Server unter der Überschrift "Probleme mit der Zugriffserlaubnis".

Nachdem der Benutzer das Formular abgeschickt hat, werden die Werte der Formularfelder in den Variablen ZipDatei und Verzeichnis gespeichert.

Aus den relativen Pfaden werden mittels Server.MapPath die absoluten Pfade für die ZIP-Datei und das Verzeichnis ermittelt und in den Variablen PhysVerzeichnis und PhysZipDatei gespeichert.

Sodann wird eine Instanz des ActiveFile.Archive Objektes mittels CreateObject instanziert und in der Variablen Archive gespeichert. Über diese Variable kann man nun alle Aktionen setzen, die das ActiveFile.Archive Objekt zur Verfügung stellt.

Das Entpacken der ZIP-Datei selbst geht durch Aufruf der Extract Methode des ActiveFile.Archive Objektes vonstatten:

Archive.Extract "*.*", PhysVerzeichnis

Der Parameter "*.*" bedeutet, daß alle Dateien des ZIP-Archives entpackt und auf den Webserver geschrieben werden. Der Parameter PhysVerzeichnis gibt das Verzeichnis (als physikalischen Pfad) an, in das die Dateien und Verzeichnisse des ZIP-Archives geschrieben werden.

Nachdem das ZIP-Archiv extrahiert ist, können Sie die ZIP-Datei auf dem Webserver (zum Beispiel mittels FTP Programm) löschen, damit kein unnötiger Speicherplatz verbraucht wird.

Wie man nun den umgekehrten Weg geht und Dateien am Webserver, wie zum Beispiel voluminöse Access Datenbanken (*.mdb Dateien) zu komprimieren, um das Laden der Datei vom Webserver zu beschleunigen, möchte ich in einem meiner nächsten Artikel zeigen.

Schlußbemerkung

Dateien von und zum Webserver zu transferieren ist eine zeitaufwendige Aufgabe. Um speziell den Umgang mit einer großen Anzahl von Textdateien zu erleichtern, empfiehlt es sich, die Dateien zu komprimieren und in ein ZIP-Archiv zu verpacken, dieses Archiv zum Server zu transferieren, und es dort wieder zu entpacken. Die Verzeichnisstruktur aller Dateien, Verzeichnisse und Unterverzeichnisse bleibt bei diesem Vorgang erhalten.

Wenn man keinen direkten Zugriff auf den Webserver hat, so kann man sich selbst mittles ASP und einer ActiveX Komponente wie ActiveFile ein Skript schreiben, daß das Entpacken der ZIP-Datei und das Schreiben des komprimierten Inhaltes auf den Webserver erlaubt.

This printed page brought to you by AlphaSierraPapa

Download des Codes

Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20001005.zip

Verwandte Artikel

Eine simple UNZIP-Komponente programmieren
http:/www.aspheute.com/artikel/20001113.htm
Kopieren verboten - Lizenzsicherung bei ASP Scripts
http:/www.aspheute.com/artikel/20020411.htm
Manipulieren von ZIP Archiven am Server
http:/www.aspheute.com/artikel/20001016.htm
Schreiben einer Textdatei auf den Server
http:/www.aspheute.com/artikel/20000725.htm
Web-basiertes Dateimanagement mit dem ASP FileMan
http:/www.aspheute.com/artikel/20010507.htm

Links zu anderen Sites

ActiveFile Komponente
http://www.infomentum.com/activefile/
HOWTO: Troubleshoot IUSR_machine Permissions Problem
http://support.microsoft.com/support/kb/articles/Q188/7/12.ASP
Winzip
http://www.winzip.de

 

©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.