hi zusammen!
ich verzweifle gerade an einem problem: ich möchte viele dateien (php/txt/html/jpg/usw) von meinem webserver runterladen. meine idee war, die files per php in ein archiv zu packen um das dann als einzelne datei laden zu können. nun unterstütz mein webserver kein zip. also dachte ich mir, einfach alle dateien aneinanderzuhängen (natürlich inkl infos um sie danach wieder auseinanderzuschnippeln) und das ganze zu gzippen.
das funzt auch soweit. die andere hälfte des konstrukts ist ein VB programm, welches den stream dann aufdröseln soll, sprich un-gzippen ^^ und da hörts auch schon auf: ich schaffs mit keiner zlib.dll (von denen, die ich gefunden habe) den stream wieder zu entpacken...
wär super wenn jemand ne idee hätte, womit ich das in php packen und in vb entpacken muss, damit das funzt. (oder von mir aus auch na ganz andere alternative zu meinem konstrukt)
vielen dank im voraus!
Seite 1 von 1
Gzinflate In Visual Basic nach gzdeflate in php
Anzeige
#3
geschrieben 25. Februar 2007 - 21:49
Möchtest du uns mitteilen die du das Problem gelöst hast?
#4
geschrieben 25. Februar 2007 - 22:24
joa eigentlich ganz einfach: ich hab die daten jetzt nicht mehr mit gzdeflate gepackt, sondern (ich sprech grade von der php seite) einfach aneinandergehängt, mittels gzwrite komprimiert und in eine temp datei geschrieben. mit infos zu den einzelnen dateien im header (brauch ich ja zum entpacken):
so. das ganze mit
danach ins vb programm laden:
erstmal die deklarationen: (zlib.dll bei google suchen ^^)
dann der simple code:
das ganze sieht recht gut aus für ascii data, allerdings werde ich wahrscheinlich für binary-safe statt dem out string ein byte-array verwenden.
der rest vom vb-programm sollte einfach sein. die daten in "out" mittels den header infos slicen und auf der pladde speichern.
viel spaß damit. vielleicht hab ja jemandem helfen können. ^^
mfg.
<?php $data=""; $fils=array(/* mit dateinamen auffüllen */); $header="<info>"; foreach($fils as $fil){ if(!is_file($fil)) continue; // sicher ist sicher $filsz=filesize($fil); $cfilsz+=$filsz; // $cfilsz ist die gesamtgröße der unkomprimierten daten. $header.=$fil."*".$filsz."|"; $data.=file_get_contents($fil); } $header=substr($header,0,strlen($header)-1)."</info>"; //die pipe am schluss entfernen $data=$header.$data; //alles zusammen in die $data variable $tfil=tempnam("./","stf"); //temp datei... file_put_contents($tfil,$data); // und rein mit dem schmodder ^^ //ausgabe: //die funktion "gzcompressfile" hab ich von php.net/gzwrite echo pack("l",$cfilsz); //erst die uncompressed filesize als long ausgeben fpassthru(fopen(gzcompressfile($tfil,9),"r")); // dann die komprimierten daten unlink($tfil.".gz"); //aufräumarbeit... unlink($tfil); ?>
so. das ganze mit
header("Content-Type: application/octet-stream");ausgeben und runterladen.
danach ins vb programm laden:
erstmal die deklarationen: (zlib.dll bei google suchen ^^)
Public Declare Function gzopen Lib "zlib.dll" (ByVal path As String, ByVal mode As String) As Long Public Declare Function gzread Lib "zlib.dll" (ByVal file As Long, ByVal buf As String, ByVal buf_len As Long) As Long Public Declare Function gzclose Lib "zlib.dll" (ByVal file As Long) As Long
dann der simple code:
Dim fil As String, tfil As String, fh As Long, out As String Dim F As Integer, SFh As Long, SFd() As Byte fil = "archive.gz" tfil = fil & ".tmp" F = FreeFile ' ein braver coder mach das ^^ ReDim SFd(FileLen(fil) - 5) ' byte-array dimensionieren auf FileLen - 1 - 4 Open fil For Binary Access Read As #F Get #F, , SFh ' der long wert mit der uncompressed filesize Get #F, , SFd ' die daten Close #F F = FreeFile Open tfil For Binary Access Write As #F Put #F, , SFd ' und die daten allein in ne tempdatei Close #F fh = gzopen(tfil, "r") ' tempfile öffnen out = String(SFh, 0) ' stringbuffer mit nullen füllen gzread fh, out, SFh ' dekomprimieren gzclose fh ' und voila! in "out" ist der datenstring inkl header!
das ganze sieht recht gut aus für ascii data, allerdings werde ich wahrscheinlich für binary-safe statt dem out string ein byte-array verwenden.
der rest vom vb-programm sollte einfach sein. die daten in "out" mittels den header infos slicen und auf der pladde speichern.
viel spaß damit. vielleicht hab ja jemandem helfen können. ^^
mfg.
mfg,
_seym.
_seym.
Thema verteilen:
Seite 1 von 1