Fatal error upload immagini

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

LaKanka

Utente Attivo
29 Ago 2008
166
0
0
Salve a tutti!!
Ho un problema con il caricamento delle immagini che superano i 2 MB..
Non so più dove sbattere la testa!!! :crying:

Fatal error: Allowed memory size of 25165824 bytes exhausted (tried to allocate 17323 bytes) in ... /classes/resize.class.php on line 54

Ho dato un occhio alla mia classe resize ma non ho trovato alcun problema:
PHP:
class resize{	
	var $urlimage = "";
	var $maxX = 700;
	var $maxY = 700;
	var $fisso = 0;
	var $latofisso = "XY";
	var $folder = "upload_img/";
	var $newName = "";
	
	
	
	function controlladati(){
		$this->errore = array();
		$this->Estensione = "";
		$this->originalX = 0;
		$this->originalY = 0;
		$this->originalName = "";
		$this->newX = 0;
		$this->newY = 0;
		
		if($this->urlimage==""){
			array_push($this->errore,"Scegliere un file da ridimensionare");
		}elseif(!file_exists($this->urlimage) || !is_file($this->urlimage)){
			array_push($this->errore,"Il file selezionato non esiste");
		}
		if(!is_numeric($this->maxX) || !is_numeric($this->maxY) || $this->maxX<0 || $this->maxY<0){
			array_push($this->errore,"L'altezza e la larghezza dell'immagine devono essere numerici");
		}
		if(!file_exists($this->folder) || !chmod($this->folder,0777)){
			array_push($this->errore,"La cartella di destinazione non esiste o non è scrivibile");
		}
		if($this->fisso!=0 && $this->fisso!=1){
			array_push($this->errore,"La variabile di dimensione fissa deve essere 0 o 1");
		}
		if($this->latofisso!="XY" && $this->latofisso!="X" && $this->latofisso!="Y"){
			array_push($this->errore,"La variabile di lato fisso devono essere X o Y o XY");
		}
		if(count($this->errore)>0){
			return false;
		}else{
			return true;
		}
	}
	
	function go(){
		if($this->controlladati()){
			$filename = basename($this->urlimage);
			$this->originalName = $filename;
			if($this->newName==""){$this->newName=$filename;}
			$this->Estensione = strtolower(substr($filename, strrpos($filename, "."), strlen($filename)-strrpos($filename, ".")));
			if($this->Estensione==".jpeg" || $this->Estensione==".jpg"){
/[COLOR="Red"]/Questa è la linea 54
				$handle_immagine = imagecreatefromjpeg($this->urlimage);[/COLOR]
			}elseif($this->Estensione==".gif"){
				$handle_immagine = imagecreatefromgif($this->urlimage);
			}elseif($this->Estensione==".png"){
				$handle_immagine = imagecreatefrompng($this->urlimage);
			}else{
				array_push($this->errore,"Formato immagine non valido");
				return null;
			}
			$handle_immagine_adattata=$this->adatta($handle_immagine);
			imagejpeg($handle_immagine_adattata, $this->folder.$this->newName, 80);
			chmod($this->folder.$this->newName,0777);
			unset($handle_immagine);
			unset($handle_immagine_adattata);
		}
	}
	
	function adatta($handle_immagine){
		$this->originalX=imagesx($handle_immagine);
		$this->originalY=imagesy($handle_immagine);
		if($this->fisso==1){
			$this->newX=$this->maxX;
			$this->newY=$this->maxY;
		}else{
			if($this->latofisso=="XY"){
				if ($this->originalX/$this->originalY>$this->maxX/$this->maxY) {
					$this->newX=$this->maxX;
					$this->newY=($this->originalY/$this->originalX)*$this->maxX;
				} else {
					$this->newX=($this->originalX/$this->originalY)*$this->maxY;
					$this->newY=$this->maxY;
				}
			}elseif($this->latofisso=="X"){
				$this->newX=$this->maxX;
				$this->newY=($this->originalY/$this->originalX)*$this->maxX;
			}elseif($this->latofisso=="Y"){
				$this->newX=($this->originalX/$this->originalY)*$this->maxY;
				$this->newY=$this->maxY;
			}else{
				if ($this->originalX/$this->originalY>$this->maxX/$this->maxY) {
					$this->newX=$this->maxX;
					$this->newY=($this->originalY/$this->originalX)*$this->maxX;
				} else {
					$this->newX=($this->originalX/$this->originalY)*$this->maxY;
					$this->newY=$this->maxY;
				}
			}
		}
		$tmp_immagine = imagecreatetruecolor($this->newX, $this->newY);
		$handle_immagine_adattata = imagecopyresampled($tmp_immagine, $handle_immagine, 0, 0, 0, 0, $this->newX, $this->newY, $this->originalX, $this->originalY);
		return $tmp_immagine;
		
	}

}

Ma cosa può essere????
 
Il problema dovrebbe essere dovuto al superamento del limite di memoria massima disponibile per l'esecuzione dello script. Tale valore è impostato nel file php.ini ed il valore di default dovrebbe essere di 8 mega (memory_limit = 8M), ma probabilmente nel tuo caso esso è impostato a 2M.
Puoi provare a modificare tale valore direttamente nel file php.ini oppure inserendo all'inizio dello script php la seguente riga di codice:

PHP:
ini_set("memory_limit", "12M");

Ovviamente al posto di 12M puoi scegliere il migliore compromesso per le tue esigenze.
 
Ultima modifica:
Bugia!

Non è vero.. Continua a darmi lo stesso errore..
avevo le allucinazioni da speranza...
Ma il codice che mi hai dato lo devo inserire nel file php.ini???
O basta nel file resize.php???
 
Sul mancato salvataggio non saprei cosa risponderti, dovrei fare delle prove. Il problema iniziale era sicuramente dovuto al parametro memory_limit. Ma per immagini di dimensioni più ridotte funzionava e se si continua a funzionare anche dopo la modifica al memory_limit?
Se la risposta è affermativa, allora credo che la dimensione dell'immagine oltre a superare il limite di memoria per lo script impatti anche sulle funzioni che utilizzi per il suo ridimensionamento.
Così al volo non saprei risponderti, magari faccio delle ricerche.
 
Non è vero.. Continua a darmi lo stesso errore..
avevo le allucinazioni da speranza...
Ma il codice che mi hai dato lo devo inserire nel file php.ini???
O basta nel file resize.php???

Se hai accesso al file php.ini puoi modificare il valore del parametro memory_limit. Fatto ciò credo tu debba stoppare e restartare apache o IIS. Altrimenti puoi aggiungere la riga di codice che ti ho postato all'inizio del file resize.php.
 
La funzione ini_set() ti permette di modificare a runtime i parametri di configurazione di PHP.
 
Ho aggiunto la riga di codice all'inizio del file resize.php. ma non è servito a nulla.. ora provo a guardare il file ini
 
Prova ad inserire la riga di codice non all'inizio del file resize.php ma nel del file php in cui utilizzi i metodi della classe resize.
 
Controlla che la direttiva upload_max_filesize nel php non sia settata su 2 Mb.
La puoi modificare anche con ini_set(), ad esempio per 8Mb:
PHP:
ini_set('max_upload_filesize', 8388608);
 
Dove mi consigli di inserirla??
all'inizio del file resize.class.php o all'inizio del file dove utilizzo i metodi della classe resize?
 
se lo inserisci all'interno del file che contiene la classe è più comodo perché in questo modo la regola vale per tutti i file in cui lo includi.
 
Ho scoperto che è il numero di px dell'immagine che da dei problemi non il peso perchè mi da lo stesso fatal error per un img da 600Kb... ho provato ad inserire il codice all'interno del file class ma non cambia...
 
Aiuto!!!

"lo script esegue un resize al volo dell'immagine, il problema allora dipende dalle librerie GD. Esse hanno un noto bug, indicato dagli stessi sviluppatori:
“Why does gd cause my PHP script to run out of memory?

Most often, the problem is that the memory_limit parameter in php.ini is set to something very conservative, like 8M (eight megabytes). Increase that setting and restart the web server.

Of course, opening truly huge images can cause real memory problems, if several are open at once. 8,000 pixels times 8,000 pixels times four bytes for truecolor equals a walloping 256 megabytes.”"

Questo è quello che mi sono sentita rispondere da Aruba quando ho chiesto se c'era un limite di memoria.........
Cosa posso fare????:dipser:
 
Questo riconduce al memory_limit di cui ti accennavo all'inizio e che ti consigliavo di modificare nel file php.ini oppure a codice mediante l'utilizzo della funzione ini_set(). Purtroppo per quanto ne so la funzione ini_set() può essere disabilitata dal fornitore del servizio di hosting (anche giustamente a mio avviso) in quanto si potrebbero creare script troppo avidi di risorse.
Se hai già contattato Aruba ed appurato che non è possibile modificare tale impostazione credo non ci sia nulla da fare se non provare con un differente fornitore oppure con un server virtuale nel quale si ha un maggiore controllo delle configurazioni di sistema.
 
imagemagik!

Come posso sostituire il resize class con image magick??
Mi hanno consigliato di usare quello... ma sinceramente non ci ho mai messo le mani....
Ho provato a guardare un pò ma non capisco.......
dovrei utilizzare la funzione system???
 
ok.. il manuale mi sembrava chiaro ma ovviamente non sono stat buona.....
invece di richiamare la resize class faccio:

convert $_FILES['image']['name'] -resize 600x600 $_FILES['image']['name'];

ma a questo punto mi da un parse error... dove sbaglio???
Ho tralasciato qualcosa di importante vero???:(
 
Magic!

Certo che imagemagick è davvero magic!!!!!!!!!!
Non mi da più alcun problema con nessun tipo di img!
Grazie!!!! :tifoso:
 

Discussioni simili