Problema download e file compressi

  • Creatore Discussione Creatore Discussione LaKanka
  • Data di inizio Data di inizio

LaKanka

Utente Attivo
29 Ago 2008
166
0
0
Ciao a tutti!
Eccomi con un altro bel rompicapo.. :hammer:
Ho un sito su un server che ha una vecchia versione di php e quindi non contiene le librerie php zip e non sono nemmeno installabili.
Ho un file zip che contiene un xml di 100Mb su un ftp esterno al server su cui lavoro.

Devo fare il download del file sul mio sito e dezipparlo per poterci lavorare.

Il problema è che una volta nel mio server non riesco a dezipparlo per la mancanza delle librerie php zip e le classi gz (sono l'unica cosa che ho trovato in sostituzione alle librerie php zip) hanno un limite di memoria che il file supera abbondantemente!! e come risultato non ottengo niente....

Allora ho provato a decomprimerlo sull'ftp esterno e poi fare il download (che con il file .zip ha sempre funzionato) sul mio sito ma il server su cui lavoro :incazz: non riesce a terminare il download e da "internal server error".

Esistono altri modi per decomprimere file zip senza le librerie oltre alle classi gz?
Altrimenti non riesco proprio a venirne fuori....
 
lavorando da remoto non è che hai un ampio ampio margine di manovra, hai provato a segnalare la cosa al provider?
 
Certo, mi hanno fatto un mucchio di storie, mandaci il link, dacci le password e sono ancora in attesa di una risposta...
L'unica cosa che sono riusciti a dirmi è stata di comprare un server dedicato o virtuale per avere ftp secondari.

Ma davvero non ci sono altre soluzioni per decomprimere file??
 
Non ho mai provato ad usarle, però phpMyAdmin usa due classi (./libraries/unzip.lib.php e ./libraries/zip.lib.php) per gestire i file ZIP.

Ho fatto solo un test per verificarne il funzionamento:

PHP:
<?php

include 'unzip.lib.php';

$unzip = new SimpleUnzip("crayon.zip");

foreach($unzip->Entries as $entry) {
	if($entry->Error == 0) {
		if(!file_exists($entry->Path)) {
			if(!@mkdir($entry->Path, 0777, true)) {
				echo "<div>Errore nella creazione della cartella: " . $entry->Path . "</div>";
			}
		}
		$fp = fopen($entry->Path . "/" . $entry->Name, "w");
		fwrite($fp, $entry->Data);
		fclose($fp);
	} else {
		echo "Errore file compresso: " . $entry->ErrorMsg;
	}
}

?>

Ma non garantisco su memoria e timeout...
 
Ma ho chiesto al provider del server su cui lavoro se hanno a disposizione librerie come php zip e mi ha risposto:
"La informo che sui nostri Server allo stato attuale non sono presenti le librerie "Php_zip" e non sono installabili."

Ora phpMyAdmin l'ho utilizzato una volta per un sito di cui necessitavo di un pannello di controllo del database... in questo server ho già a disposizione questo...

Aiuto.... mi stò perdendo...
 
Non volevo intendere di usare phpMyAdmin, ma solo le sue due librerie, anzi solo quella per decomprimere.

La libreria la puoi scaricare da qui.

La salvi e fai l'upload nel tuo sito, insieme ad uno script come quello che ho postato prima. L'unica cosa che devi cambiare è:

PHP:
$unzip = new SimpleUnzip("tuo_file_zip.zip");
 
Ho aumentato la versione di php al 5.2 ed ho 64MB di memoria ma ora riscontro un problema di codice....:dipser:

Ecco la mia classe gz:
PHP:
class gz_single {

/* Inizializza le variabili */
var $source;
var $dest;
var $level;
var $pointer;
var $gzdata;
var $data;
var $status;

function compress($source, $dest, $level)
{
/* Inizializza le variabili */
$this->source = $source;
$this->dest = $dest;
$this->level = $level;

/* Controlla che il file d'origine esista e che sia leggibile */
if(!is_file($this->source) OR !file_exists($this->source) OR !is_readable($this->source)) exit("Error 1: Source file doesn't exists or it's not readable!<br>");

/* Controlla che il file di destinazione non sia di sola lettura */
if(is_file($this->dest) AND !is_writeable($this->dest)) exit("Error 2: The destination file it's not writeable");

/* Arrotonda il livello di compressione */
$this->level = round($this->level);

/* Controlla il livello e se è troppo grande, lo porta al massimo */
if($this->level == 'MAX' OR $this->level > 9) $this->level = 9;

/* Controlla il livello e se è troppo piccolo, lo porta al minimo */
if($this->level == 'MIN' OR $this->level < 1) $this->level = 1;

/* Prende i dati dal file d'origine */
$this->data = file_get_contents($this->source);

/* Comprime i dati del file d'origine */
$this->gzdata = gzcompress($this->data, $this->level);

/* Scrive i dati compressi nel file di destinazione */
$this->status = file_put_contents($this->dest, $this->gzdata);

/* Ritorna i valori positivi e negativi in base all'esito dell'operazione */
if($this->status) return TRUE; else return FALSE;
}

function decompress($source, $dest)
{
/* Inizializza le variabili */
$this->source = $source;
$this->dest = $dest;

/* Controlla che il file d'origine esista e che sia leggibile */
if(!is_file($this->source) OR !file_exists($this->source) OR !is_readable($this->source)) exit("Error 1: Source file doesn't exists or it's not readable!<br>");

/* Controlla che il file di destinazione non sia di sola lettura */
if(is_file($this->dest) AND !is_writeable($this->dest)) exit("Error 2: The destination file it's not writeable");

/* Prende i dati dal file d'origine */
$this->gzdata = file_get_contents($this->source);

/* Comprime i dati del file d'origine */
$this->data = gzuncompress($this->gzdata);

/* Scrive i dati decompressi nel file di destinazione */
$this->status = file_put_contents($this->dest, $this->data);

/* Ritorna i valori positivi e negativi in base all'esito dell'operazione */
if($this->status) return TRUE; else return FALSE;
}
}

Ecco il codice:
PHP:
$singlegz = new gz_single();
$status = $singlegz->decompress("file.zip", "file.xml");
if(!$status) print "Errore durante la decompressione dell'archivio gz";

Come risultato ottengo:
Warning: gzuncompress() [function.gzuncompress]: data error in /gz_single.class.php
Errore durante la decompressione dell'archivio gz

Non capisco quale sia il problema....
 
Il problema di fondo è che gzip e zip sono molto diversi anche se il nome è molto simile.

In più la funzione gzuncompress effettua solo la decompressione di una stringa compressa con l'algoritmo usato da gzip.

Per usare una classe come questa dovresti provare a comprimere il file XML sull'altro server usando la stessa classe che qui usi per decomprimere.
Così facendo ci sarebbe omogeneità nei formati!
 
Hoprovato la libreria che mi hai consigliato, ma ora come risultato da:
Errore file compresso: Compressed size is not equal with the value in header information.Errore file compresso: Compressed size is not equal with the value in header information.

Ho provato a dezippare il file sul mio pc ed all'interno ho 2 file
-file.MDB
-file.MDB.xml

Forse è questo che da dei problemi?
 
Direi proprio di no. Lo ZIP che ho provato a decomprimere io contiene diversi file con cartelle nidificate. In più è un file scaricato da Internet, quindi non creato "ad hoc" come test per la classe.

Ma nello ZIP non doveva esserci solo un file? Sei sicuro che lo ZIP non sia lievemente corrotto? Come viene creato lo ZIP sull'altro server?
 
No lo zip è corretto, pensavo contenesse solo un xml poi quando l'ho dezippato su pc ho visto anche il file MDB.... scusate...:p
L'xml contenuto, dezippato è 101.000.000 Kb, forse è troppo grande?
Lo zip viene creato su un server ancora diverso e non da me, ma da un professionista, che lo invia a questo ftp di cui ho i dati di accesso proprio per poterne fare il downlod sul server del mio sito....
 
Se non trovo una soluzione mi conviene cambiare provider.......:gun:
Questo server ha troppe limitazioni...
 
Ecco per quanto riguarda la dimensione potrebbe anche essere un problema. Lo ZIP che ho provato io decompresso era sui 12MB.
potresti provare a configurarti un webserver di test in locale per fare le prove con questo ZIPPONE e verificare così se il problema è nella classe, o nelle risorse che hai a disposizione sul server dove risiede il tuo script.
 
Grazie per il vostro aiuto, ma sto già procedendo a spostare il sito su un server migliore. Comunque se qualcuno ha il mio stesso problema ho trovato una classe adatta qui.

Grazie ancora!:p
 

Discussioni simili