upload multiplo di file

  • Creatore Discussione Creatore Discussione rober23
  • Data di inizio Data di inizio

rober23

Utente Attivo
4 Ott 2013
32
0
0
ciao a tutti. nei miei siti, usavo SmartImage per l'upload delle immagini con ridimensionamento delle stesse. praticamente lo usavo per caricare un'immagine sul server, salvavo il nome nel db e in questo modo potevo vedere quell'immagine sul sito. ora ho la seguente necessità: devo poter caricare più immagini contemporaneamente (se ci fosse iul drag and drop da desktop sarebbe meglio). ho visto alcuni tutorial ma non riesco ad integrarli col codice dello smartimage (è essenziale il ridimensionamento delle immagini).
 
In caso di upload multiplo, l'unica differenza rispetto a prima è che nel vettore $_FILES, lato php, le informazioni sono salvate in un array sotto le chiavi primarie.

Per cui, ad esempio, se il tuo script prima utilizzava questi dati:
PHP:
$imageName = $_FILES["file"]["name"]; 
$imageType = $_FILES["file"]["type"];
$imageSize = $_FILES["file"]["size"];

#> Codice di ridimensionamento e salvataggio immagine

In caso di immagini multiple, dovrai scorrerle tramite ciclo:
PHP:
foreach ($_FILES["file"]["name"] as $i => $imageName) {
    $imageType = $_FILES["file"]["type"][$i];
    $imageSize = $_FILES["file"]["size"][$i];

    #> Codice di ridimensionamento e salvataggio immagine
}


Per la parte client, grazie alle possibilità di html5 è puoi specificare il parametro multiple negli input di tipo file e se cerchi tramite google dovresti trovare con facilità script già pronti per un eventuale drag 'n drop.
 
Ciao, dato che il discorso interessa anche a me (e non poco), voglio parlarne anche io... sto dando la possibilità ai miei utenti di caricare massimo 4 immagini.... delle quali 1 obbligatoria e le altre 3 facoltative. Non ho mai trattato con l'upload di immagini...quindi siate buoni e non parlatemi troppo complicato anche perchè non sono esperto in php... :evil:

Il mio form sul quale lavoro (e quindi di prova) è cosi:
PHP:
<form action="upload.php" method="post" enctype="multipart/form-data">
    <input type="file" name="immagine1" /><br>
    <input type="file" name="immagine2" /><br>
    <input type="file" name="immagine3" /><br>
    <input type="file" name="immagine4" /><br>
    <input type="submit" name="submit" value="Submit">
</form>

La pagina upload.php è composta da un santo codice che ho trovato in rete, semplice e pulito:
PHP:
<?php
$uploadDir="upload/";
$images = array();
foreach (array('immagine1', 'immagine2', 'immagine3', 'immagine4') as $name) {
    $images[$name] = new stdClass();
    $images[$name]->fileName = $_FILES[$name]['name'];
    $images[$name]->tmpName  = $_FILES[$name]['tmp_name'];
    $images[$name]->fileSize = $_FILES[$name]['size'];
    $images[$name]->fileType = $_FILES[$name]['type'];
    $images[$name]->path = $uploadDir . sha1($images[$name]->fileName);
    $result = move_uploaded_file($images[$name]->tmpName, $images[$name]->path);
    echo sha1($images[$name]->fileName);
}
?>

Lo script funziona benissimo, carica le immagini e trasforma il nome del file in sha1 salvando l'immagine nella cartella upload.
Il problema è che anche se immagine2, immagine3 ed immagine4 non sono "settate", lo script mi carica le foto assegnando il nome dell'immagine1 alle altre (2,3,4).
Magari se voi poteste farmi anche dei piccoli esempi ve ne sarei grato.... sono bloccato per questo upload multiplo di immagini :hammer:
 
Ciao, dato che il discorso interessa anche a me (e non poco), voglio parlarne anche io... sto dando la possibilità ai miei utenti di caricare massimo 4 immagini.... delle quali 1 obbligatoria e le altre 3 facoltative. Non ho mai trattato con l'upload di immagini...quindi siate buoni e non parlatemi troppo complicato anche perchè non sono esperto in php... :evil:

Il mio form sul quale lavoro (e quindi di prova) è cosi:
PHP:
<form action="upload.php" method="post" enctype="multipart/form-data">
    <input type="file" name="immagine1" /><br>
    <input type="file" name="immagine2" /><br>
    <input type="file" name="immagine3" /><br>
    <input type="file" name="immagine4" /><br>
    <input type="submit" name="submit" value="Submit">
</form>

La pagina upload.php è composta da un santo codice che ho trovato in rete, semplice e pulito:
PHP:
<?php
$uploadDir="upload/";
$images = array();
foreach (array('immagine1', 'immagine2', 'immagine3', 'immagine4') as $name) {
    $images[$name] = new stdClass();
    $images[$name]->fileName = $_FILES[$name]['name'];
    $images[$name]->tmpName  = $_FILES[$name]['tmp_name'];
    $images[$name]->fileSize = $_FILES[$name]['size'];
    $images[$name]->fileType = $_FILES[$name]['type'];
    $images[$name]->path = $uploadDir . sha1($images[$name]->fileName);
    $result = move_uploaded_file($images[$name]->tmpName, $images[$name]->path);
    echo sha1($images[$name]->fileName);
}
?>

Lo script funziona benissimo, carica le immagini e trasforma il nome del file in sha1 salvando l'immagine nella cartella upload.
Il problema è che anche se immagine2, immagine3 ed immagine4 non sono "settate", lo script mi carica le foto assegnando il nome dell'immagine1 alle altre (2,3,4).
Magari se voi poteste farmi anche dei piccoli esempi ve ne sarei grato.... sono bloccato per questo upload multiplo di immagini :hammer:

EDIT: avrei voluto modificare il mio post precedente ma il forum non me lo permette :)

Comunque, per quanto riguarda l'upload di file multipli ho risolto con il seguente codice, molto piu' semplice:

PHP:
<?php
// i campi del form hanno l'attributo name="file[]"
$uploads_dir = 'upload/';
foreach ($_FILES["file"]["error"] as $key => $error) {
    if ($error == UPLOAD_ERR_OK) {
        $tmp_name = $_FILES["file"]["tmp_name"][$key];
        $name = md5($_FILES["file"]["name"][$key]);
        move_uploaded_file($tmp_name, "$uploads_dir/$name");
        // mysqli_query eccetera
        echo "$name caricato con successo\n";
    }
}
?>

Ora devo cercare di rendere questa pagina il piu' sicuro possibile onde evitare di incappare in qualche simpaticone che mi carica qualche shell camuffata o roba simile.

Adesso vorrei:
- controllare che il file sia un immagine jpg,png.
- controllare che il file sia davvero un immagine.

Il tutto, ripetuto per tutti e 4 i campi input... ma ovviamente non so come fare :evil: help carissimi guru....grazie!
 
Ciao!

Ti suggerisco di usare la funzione getimagesize(), la quale legge i dati di un immagine dai bytes di cui è composta e, di conseguenza, è un buon modo per fare delle semplici verifiche in proposito, ad esempio:
PHP:
    $uploads_dir = 'upload/';
    
    foreach ($_FILES["file"]["error"] as $key => $error) {
        if ($error == UPLOAD_ERR_OK) {
            $tmp_name = $_FILES["file"]["tmp_name"][$key];
            $name = md5($_FILES["file"]["name"][$key]);
            
            $imageInfo = @getimagesize($tmp_name);
            
            if (in_array($imageInfo[2], array(IMAGETYPE_PNG, IMAGETYPE_JPEG))) {
                move_uploaded_file($tmp_name, "$uploads_dir/$name");
                // mysqli_query eccetera
                echo "$name caricato con successo\n";
            
            }else
            {
                echo "$name non è un file valido.";
            }
        }
    }

La chiocciola serve a sopprimere gli errori in caso l'immagine caricata non sia valida (il contenuto dell'indice 2 risulterà vuoto e quindi il controllo dirà che il file non è valido).
Per concludere, hai chiesto solo di PNG e JPG, ma ti lascio incluso l'elenco delle costanti per il mime type delle immagini di PHP, così puoi aggiungere all'array quello che più ti fa comodo ;)
 
Ciao!

Ti suggerisco di usare la funzione getimagesize(), la quale legge i dati di un immagine dai bytes di cui è composta e, di conseguenza, è un buon modo per fare delle semplici verifiche in proposito, ad esempio:
PHP:
    $uploads_dir = 'upload/';
    
    foreach ($_FILES["file"]["error"] as $key => $error) {
        if ($error == UPLOAD_ERR_OK) {
            $tmp_name = $_FILES["file"]["tmp_name"][$key];
            $name = md5($_FILES["file"]["name"][$key]);
            
            $imageInfo = @getimagesize($tmp_name);
            
            if (in_array($imageInfo[2], array(IMAGETYPE_PNG, IMAGETYPE_JPEG))) {
                move_uploaded_file($tmp_name, "$uploads_dir/$name");
                // mysqli_query eccetera
                echo "$name caricato con successo\n";
            
            }else
            {
                echo "$name non è un file valido.";
            }
        }
    }

La chiocciola serve a sopprimere gli errori in caso l'immagine caricata non sia valida (il contenuto dell'indice 2 risulterà vuoto e quindi il controllo dirà che il file non è valido).
Per concludere, hai chiesto solo di PNG e JPG, ma ti lascio incluso l'elenco delle costanti per il mime type delle immagini di PHP, così puoi aggiungere all'array quello che più ti fa comodo ;)

Ciao! gentilissimo :D
Ho provato a risolvere con della farina dal mio piccolo sacco (piu' o meno) ^^

Cosa ne pensi?

PHP:
<?php
$uploads_dir = 'upload/';
foreach ($_FILES["file"]["error"] as $key => $error) {
    if ($error == UPLOAD_ERR_OK) {
        $consentiti = array(IMAGETYPE_PNG, IMAGETYPE_JPEG);
        $tipo_file = exif_imagetype($_FILES['file']['tmp_name'][$key]);
        if (!in_array($tipo_file, $consentiti)) {
        echo "L'immagine che stai provando a caricare non è nel formato consentito (png,jpeg)";
        } else {
        $tmp_name = $_FILES["file"]["tmp_name"][$key];
        $name = md5($_FILES["file"]["name"][$key]);
        move_uploaded_file($tmp_name, "$uploads_dir/$name");
        // mysqli_query eccetera
        echo "<img src=\"upload/$name\"> caricato con successo<br>";
        }
    }
}
?>

Tra l'altro tendo a precisare che se carico soltanto una foto su quattro lo script non da errore....
 
Non ho usato le exif perché sono un incognita: dipende dalla configurazione del server e quindi alcuni servizi di hosting potrebbero averlo e altri no, mentre getimagesize è inclusa nel core di php.

Per il resto sono uguali, il controllo si può fare sia con l'una sia con l'altra e, perdonami, credevo che i problemi fossero relativi al vecchio script.


Quali errori ti mostra se provi a caricare più di un immagine ?
 
Non ho usato le exif perché sono un incognita: dipende dalla configurazione del server e quindi alcuni servizi di hosting potrebbero averlo e altri no, mentre getimagesize è inclusa nel core di php.

Per il resto sono uguali, il controllo si può fare sia con l'una sia con l'altra e, perdonami, credevo che i problemi fossero relativi al vecchio script.


Quali errori ti mostra se provi a caricare più di un immagine ?


Nono nessun errore... funziona tutto alla grande... ora sto soltanto cercare di implementare il resize dell'immagine appena caricata e poi dovrò includere questo popò di roba dentro al mio codice che controlla l'inserzione dell'annuncio.... prevedo un gran casino :)
 

Discussioni simili