Upload di file multipli

di il
11 risposte

Upload di file multipli

Ciao a tutti


Sto facendo un form per caricare da 1 a 4 file con vari controlli.. alla fine, per l’upload in 2 diverse cartelle del server uso questa stinga per caricare i files e popolare un db con i vari dati:


if (move_uploaded_file($file_1_loc,$folder1.$final_file_1) || move_uploaded_file($file_2_loc,$folder2.$final_file_2)|| move_uploaded_file($file_3_loc,$folder1.$final_file_3) || move_uploaded_file($file_4_loc,$folder2.$final_file_4))



{
$sql="INSERT INTO ……

Carica solo il primo dei 4 file che trova anche se il db viene popolato correttamente con dimensione nome dei file….



Se invece uso

if (move_uploaded_file($file_1_loc,$folder1.$final_file_1) && move_uploaded_file($file_2_loc,$folder2.$final_file_2) && move_uploaded_file($file_3_loc,$folder1.$final_file_3) && move_uploaded_file($file_4_loc,$folder2.$final_file_4))



Funziona… ma solo se sono presenti tutti e 4 i file.


Una persona però può caricarne anche solo uno.. in posizione 1, 2 ,3 o 4…..

Se uno dei 4 è vuoto, l’upload si ferma. Spero di essermi spiegato….
Se carico i file 1, 3 e 4, carica solo il primo…

Se inserisco i file 2 e 4, carica solo il 2 ecc
E inoltre da errore anche se carica i primi file…

Io vorrei che caricasse i file e proseguisse lo script indipendentemente da quale file venga uplodato…


Spero di essere stato chiaro.

grazie

11 Risposte

  • Re: Upload di file multipli

    Cito il manuale e la creazione interna della chiave numerica
    <form action="" method="post" enctype="multipart/form-data">
    <p>Pictures:
    <input type="file" name="pictures[]" />
    <input type="file" name="pictures[]" />
    <input type="file" name="pictures[]" />
    <input type="submit" value="Send" />
    </p>
    </form>
    <?php
    if(isset($_FILES['pictures']['error']) && is_array($_FILES['pictures']['error'])) {
    $max = 3;
    $count = count($_FILES['pictures']['error']);
    $min = 0;
    if(isset($_FILES['pictures']['error'][0])) {
    $min = 1;
    }
    if(isset($_FILES['pictures']['error'][1])) {
    $min += 2;
    }
    if(isset($_FILES['pictures']['error'][2])) {
    $min += 4;
    }
    if($min == 7 && $max == $count) {
    foreach ($_FILES["pictures"]["error"] as $key => $error) {
        if ($error == UPLOAD_ERR_OK) {
            $tmp_name = $_FILES["pictures"]["tmp_name"][$key];
            // basename() may prevent filesystem traversal attacks;
            // further validation/sanitation of the filename may be appropriate
            $name = basename($_FILES["pictures"]["name"][$key]);
            move_uploaded_file($tmp_name, "data/$name");
        }
    }
    }
    }
    ?>
    in questo esempio il browser visualizza (nel sorgente è) pictures[] elemento input type file. Dopo aver selezionato
    e confermato tramite il submit, invia una richiesta POST di uno/due o più file quando si usa le parentesi
    quadre php trasforma in chiave numerica da 0 a successivo se necessario e se già la chiave non è definita.
    In questo esempio il primo file è sempre con chiave 0. Altrimenti la gestione del codice dovrà essere gestito dal programmatore.
    Sarebbe bene anche indicare l'errore.
  • Re: Upload di file multipli

    Mi sembra un approccio che puoi migliorare.
    Invece di mettere "hardcoded" 4 nomi di file diversi, puoi fare un ciclo, un vettore, quello che vuoi, da 1 a N file che ti vengono sottoposti.
    A quel punto puoi magare segare quelli dopo il quarto e quello che ti pare
  • Re: Upload di file multipli

    Intanto grazie... di php non ne so molto...

    vi spiego meglio cosa devo fare. form con inserimento vari dati...

    poi si passa a caricare 4 file
    
    <table>
    <tr>
    <td>CATEGORIA A</td>
    <td>CATEGORIA A</td>
    </tr>
                                     
    
    <tr>
    <td>FILE1 (PULSANTE CARICA) </td>                FILE2 (PULSANTE CARICA)</td>
    </tr>
    <tr>
    <td>TITOLO FILE 1      </td>                            TITOLO FILE 2</td>
    </tr>
    <tr>
    <td>DESCRIZIONE FILE 1      </td>                    DESCRIZIONE FILE 2</td>
    </tr>
    <tr>
    <td></td><td></td>
    </tr>
    
    <tr>
    <td>FILE3 (PULSANTE CARICA)    </td>             FILE4 (PULSANTE CARICA)</td>
    </tr>
    <tr>
    <td>TITOLO FILE 3      </td>                            TITOLO FILE 4</td>
    </tr>
    <tr>
    <td>DESCRIZIONE FILE 3      </td>                    DESCRIZIONE FILE 4</td>
    </tr>
    



    Quindi si possono caricare da 1 a 4 file in qualsiasi posizione. Il controllo prevede che se c'è il file, si debba inserire titolo e descrizione.

    una volta caricati si invia e si popola un db con tutti i dati inseriti. i file dovrebbero finire in due sottocartelle CATEGORIA A e CATEGORIA B a seconda di dove vengono inserite.

    i controlli funzionano. ho problema nell'upload come indicato nel post.

    grazie
  • Re: Upload di file multipli

    Carichi i file tramite form HTML? Probabilmente l'errore è lì. Scusa non stai dicendo nulla se fai la tabella con i titoli mentre se indichi il codice del form si può tentare di capire l'errore.
    Nel mio codice precedente c'era il codice del form nel formato più semplice possibile, occorre quello racchiuso tra i tag form.
  • Re: Upload di file multipli

    Questo è il form HTML che carica i file (tralascio la parte precedente di inserimento dati anagrafici...
    
    <table>
    <tr>
    <td><b><i>Categoria a</i><b/>
    </td>
    <td><b><i>Categoria b</i><b/>
    </td>
    </tr>
    <tr>
    <td style="vertical-align: top; width: 475px;"><br /><b>File 1a<b/></td>
    <td style="vertical-align: top; width: 475px;"><br /><b>File 1b<b/></td>
    </tr>
    
    <tr>
    <td><br>
    <input name="file" type="file">
    </td>
    <td><br>
    <input name="file1" type="file"></td>
    </tr>
    
    <tr>
    <td> Luogo  *:<br>
    <input name="luogo1" type="text"><br>
    </td>
    <td> Luogo  *:<br>
    <input name="luogo2" type="text"> <br>
    </td>
    </tr>
    <tr>
    <td> Titolo  *:<br>
    <input name="titolo1" type="text"><br>
    </td>
    <td> Titolo  *:<br>
    <input name="titolo2" type="text"> <br>
    </td>
    </tr>
    
    
    <tr>
    <td style="vertical-align: top; width: 475px;"><br /><b>File 2a<b/></td>
    <td style="vertical-align: top; width: 475px;"><br /><b>File 2b<b/></td>
    </tr>
    
    <tr>
    <td><br>
    <input name="file2" type="file">
    </td>
    <td><br>
    <input name="file3" type="file"></td>
    </tr>
    
    
    <tr>
    <td> Luogo  *:<br>
    <input name="luogo3" type="text"><br>
    </td>
    <td> Luogo *:<br>
    <input name="luogo4" type="text"> <br>
    </td>
    </tr>
    <tr>
    <td> Titolo *:<br>
    <input name="titolo3" type="text"><br>
    </td>
    <td> Titolo  *:<br>
    <input name="titolo4" type="text"> <br>
    </td>
    </tr>
    
    che poi vengono passatti al file upload php


    ..... per ogni file:
    
    
    $file_1 = rand(1000,100000)."-".$_FILES['file']['name'];
        $file_1_loc = $_FILES['file']['tmp_name'];
    	$file_1_size = $_FILES['file']['size'];
    	$file_1_type = $_FILES['file']['type'];	
    	$folder1= "uploads/categoria_a/";
    	
    $file_2 = rand(1000,100000)."-".$_FILES['file1']['name'];
        $file_2_loc = $_FILES['file1']['tmp_name'];
    	$file_2_size = $_FILES['file1']['size'];
    	$file_2_type = $_FILES['file1']['type'];
    	$folder2 = "uploads/categoria_b/";
    	
    eccetera...
    
    
    ...

    poi il caricamento
    										
    												
    if (move_uploaded_file($file_1_loc,$folder1.$final_file_1) || move_uploaded_file($file_2_loc,$folder2.$final_file_2) || move_uploaded_file($file_3_loc,$folder1.$final_file_3) || move_uploaded_file($file_4_loc,$folder2.$final_file_4))
    													
    																					
    												
    													{
    													$sql="INSERT INTO .. (qui tutta la parte di inserimento dat in tabella che funziona..... 
     ,,,                              ','$caricateil')";
    													mysql_query($sql);	
    
    
    										<script>
    										alert("Invio dati eseguito correttamente. ");
    										window.location.href='index.php?success';
    										</script>
    										<?php
    			
    													} else 	{
    															?>
    															<script>
    															alert("Errore nell'invio dei dati");
    															window.history.back(1); 
    															</script>
    															<?php
    															}
    													} 
    	
    									} ......
    
    
  • Re: Upload di file multipli

    Come detto ci sono hardcoded file1, file2 etc
  • Re: Upload di file multipli

    +m2+ ha scritto:


    Come detto ci sono hardcoded file1, file2 etc
    non ho idea di come si usino...
  • Re: Upload di file multipli

    Potrai o usare <input name="file[]" type="file"> per tutti i tuoi quattro file e validare un massimo di 4 file oppure comunque dovrai controllare l'esistenza con isset per if(isset($_FILES['input_name'])) {
    //etc
    }
    Dovrai sostituire input_name con il valore name in questo esempio è un array $_FILES['file']['error'][0] sino alla chiave 4, come spiegato nel mio primo intervento https://www.iprogrammatori.it/forum-programmazione/post8673868.html#p8673868
  • Re: Upload di file multipli

    Hormus ha scritto:


    Potrai o usare <input name="file[]" type="file"> per tutti i tuoi quattro file e validare un massimo di 4 file oppure comunque dovrai controllare l'esistenza con isset per if(isset($_FILES['input_name'])) {
    //etc
    }
    Dovrai sostituire input_name con il valore name in questo esempio è un array $_FILES['file'][0] sino alla chiave 4, come spiegato nel mio primo intervento https://www.iprogrammatori.it/forum-programmazione/post8673868.html#p8673868
    però così poi non credo di riuscire a far andare il file 1 e 3 nella cartella A e i file 2 e 4 in quella B...
  • Re: Upload di file multipli

    Perché non puoi?
    Pensa alla struttura non tanto al codice.
    Nella tua tabella dentro il form il file è abbinato anche a qualche input? Nel caso semplice quando sono presenti tutti (nel tuo esempio 4 file e nel mio 3 tramite array) https://www.iprogrammatori.it/forum-programmazione/post8673868.html#p8673868
    Altrimenti dovrai modificare la logica del codice è comunque ti bastano due array che potranno contenere uno o due file (cioè esattamente 1, 2, 3, 4) poiché il massimo di un array che contiene 2 chiavi x 2 fa 4.
    $min è il minimo possibile che dovrà essere da 1 in poi, che comunque nel mio codice mi limito al confronto di $min == 7 (se presente entrambi i tre file).
    Cosa non capisci dal mio codice (per array di file)?
  • Re: Upload di file multipli

    Hormus ha scritto:


    Perché non puoi?
    Pensa alla struttura non tanto al codice.
    Nella tua tabella dentro il form il file è abbinato anche a qualche input? Nel caso semplice quando sono presenti tutti (nel tuo esempio 4 file e nel mio 3 tramite array) https://www.iprogrammatori.it/forum-programmazione/post8673868.html#p8673868
    Altrimenti dovrai modificare la logica del codice è comunque ti bastano due array che potranno contenere uno o due file (cioè esattamente 1, 2, 3, 4) poiché il massimo di un array che contiene 2 chiavi x 2 fa 4.
    $min è il minimo possibile che dovrà essere da 1 in poi, che comunque nel mio codice mi limito al confronto di $min == 7 (se presente entrambi i tre file).
    Cosa non capisci dal mio codice (per array di file)?
    non sono molto esperto.. non so come modificare il mio codice con le indicazioni che mi hai fornito...
Devi accedere o registrarti per scrivere nel forum
11 risposte