-
Upload multiplo immagini
Salve,
sto cercando di scrivere uno script per l'upload multiplo di immagini da un form che mi aiuti anche a ridimensionare i file qualora ce ne sia bisogno.
Ho testato lo script con file singoli, quindi prima di inserire il codice per il caricamento multiplo e tutto funziona alla perfezione.
Il problema è sorto appunto quando ho integrato il codice per il caricamento multiplo, non mi sembrava nienete di complicato, un semplice ciclo foreach eppure non mi carica più alcun file..
Potreste controllare se ho sbagliato o dimenticato qualcosa? Grazie in anticipo.
Il form, semplicissimo per il momento, giusto per testarlo
Codice HTML:
<form method="post" enctype="multipart/form-data" action="galleria.php" id="form">
<h1>Upload immagini PHP</h1>
<hr>
<label for="file">Seleziona l'immagine da caricare: </label>
<input type="file" name="file[]" multiple/>
<input type="submit" name="carica" value="Carica" />
</form>
E qui il codice php che dovrebbe effettuare l'upload
Codice PHP:
<?php
// Caricamento foto…
$nomePostFoto = "file"; // Nome del campo presente nel form di caricamento
$pathImg = "../eventi/"; // Path cartella imamgini
$id = $_FILES[$nomePostFoto]["name"]; // Nome immagine (eventualmente da generare in maniera pseudocasuale)
$wi = 250; // Max larghezza possibile
$he = 150; // Max altezza immagine
$allowedExtensions = array("jpg","jpeg","gif","png"); // Estensioni ammesse
if(!empty($_FILES[$nomePostFoto])) {
foreach ($_FILES[$nomePostFoto]["name"] as $indice => $id) {
if (strlen($nomeFoto)>0)
{
// Caricamento permesso ?
$caricaFoto = "NO";
$nomeFotoUno = basename($_FILES[$nomePostFoto]["name"][$indice]);
if (strlen($nomeFotoUno) > 0)
{
$parts = explode(".",$_FILES[$nomePostFoto]["name"][$indice]);
$ext = strtolower(end($parts));
if (!in_array($ext,$allowedExtensions))
echo "<br><br><br><div align=’center’>".$_FILES[$nomePostFoto]["name"][$indice]." ha una estensione non consentita (PNG, JPG, JPEG, GIF) e non e’ stato caricato!</div><br><br/>";
else
$caricaFoto = "SI";
if ($caricaFoto = "SI")
{
// Elimino il file precedente prima di caricare il nuovo onde evitare doppioni (Es. caricata precedentemente .jpg e carico .png)…
foreach($allowedExtensions as $extTmp)
{
$nomeJPGTmp = $pathImg.$id.".".$extTmp;
if (file_exists($nomeJPGTmp))
unlink($nomeJPGTmp);
}
$nomeFile = $id.".".$ext;
$uploadfile = $pathImg.$nomeFile;
if (move_uploaded_file($_FILES[$nomePostFoto]["tmp_name"][$indice],$uploadfile))
{
$size = getimagesize($uploadfile);
if ($size[0]>$wi)
{
// codice per il ridimensionamento
if ( ($size[0] > $wi) OR ($size[1] > $he) )
{
$rapporto = $wi / $he;
$proporzione = $size[0] / $size[1];
if ($rapporto > $proporzione)
{
// Fisso la larghezza e ricalcolo l’altezza…
$he=$size[1]*($wi/$size[0]);
}
else
{
// Fisso l’altezza e ricalcolo la larghezza…
$wi=$size[0]*($he/$size[1]);
}
$image = imagecreatefromjpeg($uploadfile);
$thumb = imagecreatetruecolor($wi,$he);
imagecopyresampled($thumb,$image,0,0,0,0,$wi,$he,$size[0],$size[1]);
// fisso una proporzione della qualità dell'immagine da caricare (valore predefinito e reale 100)
imagejpeg($thumb,$uploadfile, 80);
}
// distruggiamo il file originale che non ci serve più una volta caricato il file col resize
imagedestroy($image);
imagedestroy($thumb);
}
}
}
}
}
}
}
?>
-
La variabile nomeFoto non l'hai mai inizializzata, a cosa ti serve quel controllo?
-
file[]
Codice PHP:
$_FILES['file']['tmp_name'][0];
é successivi 1,2,3,4,5,6,7 ecc. non aggiungo altro trai le tue conclusioni. http://www.manuelmarangoni.it/sir-bi...mporaneamente/
-
Ciao karl94
hai ragione voleva essere $nomePostFoto, errore di battitura. Quel controllo mi serve per verificare innanzitutto che si stia cercando di caricare un file prima di fare i dovuti controlli. Allo script mancano ancora le risposte negative, ma le sto inserendo adesso.
Comunque forse hai ragione sarebbe più corretta una formula come
Codice PHP:
if ($_FILES[$nomePostFoto]['name'] != "")
oppure
Codice PHP:
if (isset($_FILES[$nomePostFoto]['name']))
Grazie della dritta darbula, l'aggiunta di quella variabile in effetti ha risolto egregiamente il mio problema, adesso il foreach mi cicla a dovere l'array.
Ora però ho un altro piccolo problema, è vero che mi carica tutti i file che seleziono, ma nella directory e nella galleria del sito mi fa visualizzare correttamente solo i file jpeg. Ho provato con diverse estensioni, anche per vedere se funzionava il controllo sulle stesse, ma mi carica anche i bmp sulla directory (anche se il messaggio di errore esce lo stesso). La cosa strana è però che solo i file jpeg sono visualizzabili, tutti gli altri appaiono neri.
Ora mi chiedo, perché fa così? :cry:
EDIT
Ho risolto il problema per cui mi caricava tutti i file, anche quelli con estensione non gradita, banalmente avevo dimenticato di racchiudere le variabili di caricamento all'interno del controllo d'estensione. Così sì mi faceva il controllo, ma ovviamente li caricava lo stesso perché due script separati.
Ora però mi rimane il problema che a parte i file jpeg tutti gli altri li vedo sul server come quadrati neri. C'è qualcosa che mi sfugge nelle impostazioni di Altervista sul caricamento delle immagini? Perché non trovo senso a questa distinzione.
Spero mi possiate chiarire questo dubbio
-
fai uno screen di cosa significa quei quadratini neri, perchè cosi non capisco a cosa ti riferisci. ps. anche corredato di codice php o html in modo da poter riscontrare il tuo stesso problema ed eventualmente risolverlo.
-
Certo, grazie per il supporto.
Questo è lo script al momento:
Codice PHP:
<?php
// Caricamento foto…
$nomePostFoto = "file"; // Nome del campo presente nel form di caricamento
$pathImg = "../eventi/"; // Path cartella imamgini
$id = $_FILES[$nomePostFoto]["name"]; // Nome immagine (eventualmente da generare in maniera pseudocasuale)
$wi = 250; // Max larghezza possibile
$he = 150; // Max altezza immagine
$allowedExtensions = array("jpg","jpeg","gif","png"); // Estensioni ammesse
if(!empty($_FILES[$nomePostFoto])) {
if (isset($_FILES[$nomePostFoto]['name']))
{
$count = 0;
// con foreach ci assicuriamo di effettuare le prossime operazioni per ogni file caricato
foreach ($_FILES[$nomePostFoto]["name"] as $indice)
{
// Caricamento permesso ?
$origin = $_FILES[$nomePostFoto]["tmp_name"][$count];
$caricaFoto = "NO";
$nomeFotoUno = basename($indice);
if (strlen($nomeFotoUno) > 0)
{
// controlliamo l'estensione, se non è tra quelle impostate nell'array allora non carichiamo l'immagine
$parts = explode(".",$_FILES[$nomePostFoto]["name"][$count]);
$ext = strtolower(end($parts));
if (!in_array($ext,$allowedExtensions))
echo "<br><br><br><div align=’center’>".$_FILES[$nomePostFoto]["name"][$count]." ha una estensione non consentita (PNG, JPG, JPEG, GIF) e non e’ stato caricato!</div><br><br/>";
// se l'estenzione è presente allora procediamo
else
{
$caricaFoto = "SI";
if ($caricaFoto = "SI")
{
$nomeFile = $nomeFotoUno;
$uploadfile = $pathImg.$nomeFile;
if (move_uploaded_file($_FILES[$nomePostFoto]["tmp_name"][$count],$uploadfile))
{
// se le dimensioni dell'immagine sono superiori a quelle impostate allora ridimensioniamo l'immagine
$size = getimagesize($uploadfile);
if ($size[0]>$wi)
{
// codice per il ridimensionamento
if ( ($size[0] > $wi) OR ($size[1] > $he) )
{
$rapporto = $wi / $he;
$proporzione = $size[0] / $size[1];
if ($rapporto > $proporzione)
{
// Fisso la larghezza e ricalcolo l’altezza…
$he=$size[1]*($wi/$size[0]);
}
else
{
// Fisso l’altezza e ricalcolo la larghezza…
$wi=$size[0]*($he/$size[1]);
}
$image = imagecreatefromjpeg($uploadfile);
$thumb = imagecreatetruecolor($wi,$he);
imagecopyresampled($thumb,$image,0,0,0,0,$wi,$he,$size[0],$size[1]);
// fisso una proporzione della qualità dell'immagine da caricare (valore predefinito e reale 100)
imagejpeg($thumb,$uploadfile, 80);
}
// distruggiamo il file originale che non ci serve più una volta caricato il file col resize
imagedestroy($image);
imagedestroy($thumb);
}
}
}
}
}
// aumentando $count passiamo al file successivo nel foreach
$count++;
}
}
}
?>
Il form è lo stesso di prima, non penso serva riportarlo.
Questa è la cartella dove vengono salvate le immagini in questione, come puoi notare sono diversi tipi, tutte caricate con lo script di sopra:
http://i61.tinypic.com/29yk0gg.jpg
E questo è ciò che vedo a video nella mia pagina. Come puoi notare si vede solo la foto 1, le altre sono tutti quadrati neri. Anche se le apro singolarmente dal folder dove sono salvate vedo la stessa cosa.
http://i61.tinypic.com/r8sdiq.jpg
Non posso costringere chi deve caricare le foto a scegliere solo jpeg, potrebbero avere png a cui non sono in grado di modificare l'estensione, quindi ho risolvo questo problema o trovo un sistema per trasformare tutte le immagini in jpeg, sempre se esiste.
Però preferirei capire perché non funge, mi lascerebbe l'amaro in bocca non saperne il motivo :cry:
-
Ciao è passato molto tempo ho avuto da fare, non ho verificato il codice ma noto che crei solo file jpeg
Codice PHP:
$image = imagecreatefromjpeg($uploadfile);
. Non hai preso in considerazione che per gif o png la funzione si chiama diversamente. ps. deve creare anche un header con il giusto mime Type. Fammi sapere!!