upload multiplo di file

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).
 

flameseeker

Utente Attivo
27 Nov 2013
699
0
0
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.
 

skoien

Nuovo Utente
30 Nov 2013
10
0
0
VA
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:
 

skoien

Nuovo Utente
30 Nov 2013
10
0
0
VA
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!
 

flameseeker

Utente Attivo
27 Nov 2013
699
0
0
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 ;)
 

skoien

Nuovo Utente
30 Nov 2013
10
0
0
VA
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....
 

flameseeker

Utente Attivo
27 Nov 2013
699
0
0
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 ?
 

skoien

Nuovo Utente
30 Nov 2013
10
0
0
VA
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
Autore Titolo Forum Risposte Data
C [PHP] Problema upload file (multiplo) PHP 1
P Script per upload multiplo file Javascript 3
Cosina Upload multiplo con invio allegati per email PHP 0
Cosina Upload multiplo con archiviazione in cartella PHP 16
L [PHP] problema con upload e javascript (upload multiplo) Javascript 2
P [PHP] Upload multiplo PHP 4
A Upload multiplo di immagini in PHP PHP 3
P Problema con lettura filesystem del client da server! Upload multiplo foto. PHP 5
L upload + textarea + checkbox in un form multiplo Javascript 7
R upload immagini multiplo e ridimensionamento PHP 0
S [RISOLTO] Fatal error in Upload Multiplo di immagini PHP 2
M upload multiplo di 2 immagini su database mysql PHP 23
R Upload multiplo con creazione di cartella PHP 10
L upload multiplo PHP 4
P Risuscito un vecchio script di upload immagine multiplo PHP 10
F upload multiplo Classic ASP 3
P Upload multiplo nella stessa cartella PHP 3
M Upload immagine con javascript problemi con FormData() Javascript 1
Z Upload protetto e sicuro PHP 1
L Modifica file upload in ASP Classic ASP 2
Cosina Creare bottone delete in form upload PHP 5
Cosina Creare bottone delete in form upload PHP 1
P Script upload immagini jQuery 0
L upload image tramite url e cache PHP 10
W Non fa l'upload PHP 0
L Upload di un'immagine all'interno di un database usando php PHP 6
S Upload file senza doverlo selezionare PHP 2
P Upload foto cover e profilo jQuery 0
G Upload file error Apache 0
R Modifica codice per l'upload di più file PHP 1
S Problemi con modulo upload video php (help!) PHP 0
S [PHP] Upload stesso file PHP 14
max1974 [Javascript] dropzone upload to server Javascript 0
S [ASP.Net] [ASP] Upload Image ASP.NET 6
F [PHP] Informazioni upload PHP 11
G [PHP] upload file in server: percorso cartella PHP 2
M Upload 4 file php PHP 11
M [ASP] Upload file da form controllo Classic ASP 5
D [PHP] Upload intera cartella PHP 2
felino [PHP] Uploadify: upload immagini PHP 0
M [PHP] Nome file, upload e rinominare PHP 2
R Configurazione upload ftp su dvr IP Cam e Videosorveglianza 3
M [PHP] upload di un file esistente overwrite PHP 1
N [PHP] Test per l'upload di file attraverso un bot Telegram PHP 2
L [PHP] upload con errore PHP 2
V [PHP] Upload Excel in db PHP 0
jailbait [PHP] Upload immagine e stampa a schermo PHP 0
G PHP upload dati ed immagine PHP 7
F [PHP] Validare form prenotazione appuntamento tattoo con upload image PHP 0
D [PHP] Upload encrypt image PHP 0

Discussioni simili