E' possibile! Da una mia recente scoperta basta uploadare nel proprio spazio la classe di una libreria di multicompressione (cercate in PEAR). AV per fortuna nn puo' togliere l'estensione zlib (nn hanno messo la bz2!!! ) percio' possiamo benissimo cominciare ad abolire i problemi di upload usando la libreria File_Archive:
1) La dimensione di upload (2MB) :
l'user manda un file (es: materiale.doc) che e' superiore a 2MB. Che facciamo? Il caricamento va a vuoto... Allora l'user comprime il suo file in zip. Il file e' minore di 2MB ma PHP da solo nn puo' leggere il file zip (serve l'estensione apposita che AV nn sara' MAI disposta ad attivare!). Quindi File_Archive con la sua OOPta' decomprime il file che sara' leggibile nello spazio web.
2) Uploadare una cartella :
Molti utenti hanno chiesto di poter uploadare anche le cartelle. Ma si sa' che AV e' peggio di eMule :smile: . Poi PHP puo' comprimere un solo file tramite Gzip! E si sa che nn si possono estrarre i file zip! Ma che facciamo?? File_Archive (con la sua OOPta') puo' decomprimere i file di un zip (come ho detto prima). Ma che succede se il file zip e' superiore a 2MB? L'user sara' costretti a splittare il file zip. E se l'user ha trovato un migliore ratio di compressione con tar.gz? PHP da solo puo' decomprimere il file gzip, MA lasciamo in tatto il file tar??? Archive_Tar puo' estrarre la cartella. Ma noi usiamo File_Archive! Estratti tutti i files dal tar voila'!
La seconda tecnica e' TROPPO UTILE se si bisogna uploadare TUTTI i mini-file di PHP-Nuke o di qualsiasi script preconfezzionato (da Makpaolo ) percio' chiedo ai mod di mettere in rilievo questo utile topic! Poi vi consiglio di utilizzare File_Archive per comprimere/decomprimere files in PHP perche' e' il piu' veloce! Il sito e' http://poocl.la-grotte.org e qui sotto posto la funzione per decomprimere i files Gzip da Aaron G.
Codice PHP:
<?php
function gzdecode($data) {
$len = strlen($data);
if ($len < 18 || strcmp(substr($data,0,2),"\x1f\x8b")) {
return null; // Not GZIP format (See RFC 1952)
}
$method = ord(substr($data,2,1)); // Compression method
$flags = ord(substr($data,3,1)); // Flags
if ($flags & 31 != $flags) {
// Reserved bits are set -- NOT ALLOWED by RFC 1952
return null;
}
// NOTE: $mtime may be negative (PHP integer limitations)
$mtime = unpack("V", substr($data,4,4));
$mtime = $mtime[1];
$xfl = substr($data,8,1);
$os = substr($data,8,1);
$headerlen = 10;
$extralen = 0;
$extra = "";
if ($flags & 4) {
// 2-byte length prefixed EXTRA data in header
if ($len - $headerlen - 2 < 8) {
return false; // Invalid format
}
$extralen = unpack("v",substr($data,8,2));
$extralen = $extralen[1];
if ($len - $headerlen - 2 - $extralen < 8) {
return false; // Invalid format
}
$extra = substr($data,10,$extralen);
$headerlen += 2 + $extralen;
}
$filenamelen = 0;
$filename = "";
if ($flags & 8) {
// C-style string file NAME data in header
if ($len - $headerlen - 1 < 8) {
return false; // Invalid format
}
$filenamelen = strpos(substr($data,8+$extralen),chr(0));
if ($filenamelen === false || $len - $headerlen - $filenamelen - 1 < 8) {
return false; // Invalid format
}
$filename = substr($data,$headerlen,$filenamelen);
$headerlen += $filenamelen + 1;
}
$commentlen = 0;
$comment = "";
if ($flags & 16) {
// C-style string COMMENT data in header
if ($len - $headerlen - 1 < 8) {
return false; // Invalid format
}
$commentlen = strpos(substr($data,8+$extralen+$filenamelen),chr(0));
if ($commentlen === false || $len - $headerlen - $commentlen - 1 < 8) {
return false; // Invalid header format
}
$comment = substr($data,$headerlen,$commentlen);
$headerlen += $commentlen + 1;
}
$headercrc = "";
if ($flags & 1) {
// 2-bytes (lowest order) of CRC32 on header present
if ($len - $headerlen - 2 < 8) {
return false; // Invalid format
}
$calccrc = crc32(substr($data,0,$headerlen)) & 0xffff;
$headercrc = unpack("v", substr($data,$headerlen,2));
$headercrc = $headercrc[1];
if ($headercrc != $calccrc) {
return false; // Bad header CRC
}
$headerlen += 2;
}
// GZIP FOOTER - These be negative due to PHP's limitations
$datacrc = unpack("V",substr($data,-8,4));
$datacrc = $datacrc[1];
$isize = unpack("V",substr($data,-4));
$isize = $isize[1];
// Perform the decompression:
$bodylen = $len-$headerlen-8;
if ($bodylen < 1) {
// This should never happen - IMPLEMENTATION BUG!
return null;
}
$body = substr($data,$headerlen,$bodylen);
$data = "";
if ($bodylen > 0) {
switch ($method) {
case 8:
// Currently the only supported compression method:
$data = gzinflate($body);
break;
default:
// Unknown compression method
return false;
}
} else {
// I'm not sure if zero-byte body content is allowed.
// Allow it for now... Do nothing...
}
// Verifiy decompressed size and CRC32:
// NOTE: This may fail with large data sizes depending on how
// PHP's integer limitations affect strlen() since $isize
// may be negative for large sizes.
if ($isize != strlen($data) || crc32($data) != $datacrc) {
// Bad format! Length or CRC doesn't match!
return false;
}
return $data;
}
?>