[PHP] Informazioni upload

Frozzen

Utente Attivo
18 Gen 2019
55
0
6
28
Milano
Buonasera a tutti ragazzi,

Ho trovato in rete un form html con i classici bottoni "carica" e "seleziona file" con abbinato un file "upload.php".

- È possibile caricare qualsiasi genere di file senza andare ad aggiungere le estensioni?

- Posso far apparire in anteprima l'immagie di ciò che sto caricando?

- Inoltre, ogni qualvolta che carico un file vorrei far uscire la scritta " File caricato con successo" nella stessa pagina senza essere reindirizzati in una nuova pagina con scritto appunto, file caricato con successo...

- È possibile caricare i file selezionando da un menù a tendina un percorso diverso nel server? Esempio: immagini, pdf, etc..etc..

Riuscirebbe ad aiutarmi?


Form:
HTML:
 <body><form enctype="multipart/form-data" action="./upload.php" method="post"> 
 <input name="userimage" type="file" /> 
 <input type="submit" value="Carica foto" name="send">
</form></body>
File upload.php:
PHP:
<?php
//Impostazioni varie da modificare a piacimento
$dimensione_max = '120006000000000000000000000000000000000';                         // Dimensione massima delle foto
$upload_dir = './upload';                        // Cartella dove posizione le foto
$estensioni = array ("png", "jpg", "gif", "pdf", "doc", "avi", "mp4", "txt");      // Tipi di File consentiti
$noSubmitSend = 'Nessun upload eseguito!';            // Messaggio di errore quando viene richiamato direttamente lo script PHP
$wrongExt = 'Estensione file non valida!';            // Messaggio di errore per tipo di file non consentito
$tooBig = 'Il file eccede la dimensione max!';        // Messaggio di errore per file troppo grande
$thatsAll = 'File caricato con successo!';            // Messaggio di OK per upload corretto
$wrongUp = 'Something wrong here!';                    // Messaggio di errore quando lo script non riesce ad eseguire l'upload
//***************************************

// Controllo il submit del form HTML...
if(isset($_POST['send'])) {
    $file = $_FILES['userimage']['name'];

    // Controllo il tipo di file...
    if(in_array(array_pop(explode('.',$file)),$estensioni)) {

        // Controllo la dimensione del file...
        $dimensione_file = $_FILES['userimage']['size'];
        if ($dimensione_file > $dimensione_max) {
            print $tooBig;
        } else {
            doUpload($file, $upload_dir);
        }
        
    } else {
        print $wrongExt;
    }
} else {
    print $noSubmitSend;
}

function doUpload($file, $upload_dir) {
    global $thatsAll;

    $nomefile = $_FILES['userimage']['tmp_name'];
    $nomereale = $_FILES['userimage']['name'];
    $nomereale = htmlentities(strtolower($nomereale));
    
    if (is_uploaded_file($nomefile)) {
        $newname = ($nomereale);
        
        $ext = end(explode('.',$nomereale));
        $filename = explode('.',$nomereale);
        if (file_exists($upload_dir.'/'.$nomereale)) {
            $filename[0] .= '.';
            for ($a=0;$a<=9;$a++)
                $filename[0] .= chr(rand(97,122));
            $newname = $filename[0] . '.' . $ext;
        }
        
        $newname = str_replace(' ', '_', $newname);
        
        @move_uploaded_file($nomefile,($upload_dir.'/'.$newname));
        print $thatsAll;
    } else print $wrongUp;
    
}
?>
 
Ultima modifica di un moderatore:

fratt

Nuovo Utente
19 Gen 2019
33
4
8
Ciao. Provo a rispondere ad alcune delle tue domande...

- È possibile caricare qualsiasi genere di file senza andare ad aggiungere le estensioni?
E' possibile, ma normalmente sconsigliato per ragioni di sicurezza.

- Posso far apparire in anteprima l'immagie di ciò che sto caricando?
Credo che l'unico modo per generare un'anteprima sia prima caricare il file... A meno che non ci sia qualche funzione/libreria javascript o simile che lavora lato client, ma non ne conosco.

- Inoltre, ogni qualvolta che carico un file vorrei far uscire la scritta " File caricato con successo" nella stessa pagina senza essere reindirizzati in una nuova pagina con scritto appunto, file caricato con successo...
Potresti gestire l'upload tramite ajax così non devi ricaricare la pagina (metto un esempio di codice in fondo al post... il codice non è mio, l'ho trovato in rete, ma funziona)

- È possibile caricare i file selezionando da un menù a tendina un percorso diverso nel server? Esempio: immagini, pdf, etc..etc..
Certo che è possibile. Aggiungi alla form una select e poi cambi il valore di $upload_dir di conseguenza.

HTML:
<!DOCTYPE html>
<html>

<head>
<meta charset="UTF-8">
<meta name="revisit-after" content="7">
<meta name="keywords" content="gestione">
<title>..:: PROVA ::..</title>

<script type="text/javascript"> <!--
function _(el) {
  return document.getElementById(el);
}
function uploadFile() {
  var file = _("file1").files[0];
  var formdata = new FormData();
  formdata.append("file1", file);
  var ajax = new XMLHttpRequest();
  ajax.upload.addEventListener("progress", progressHandler, false);
  ajax.addEventListener("load", completeHandler, false);
  ajax.addEventListener("error", errorHandler, false);
  ajax.addEventListener("abort", abortHandler, false);
  ajax.open("POST", "upload.php");   // avevo dimenticato di scrivere il nome dello script php
  ajax.send(formdata);
}
function progressHandler(event) {
  _("loaded_n_total").innerHTML = "Uploaded " + event.loaded + " bytes of " + event.total;
  var percent = (event.loaded / event.total) * 100;
  _("progressBar").value = Math.round(percent);
  _("status").innerHTML = Math.round(percent) + "% uploaded... please wait";
}
function completeHandler(event) {
  _("status").innerHTML = event.target.responseText;
  _("progressBar").value = 0;
}
function errorHandler(event) {
  _("status").innerHTML = "Upload Failed";
}
function abortHandler(event) {
  _("status").innerHTML = "Upload Aborted";
}
//-->
</script>
</head>

<body>
<h2>HTML5 File Upload Progress Bar Tutorial</h2>
<form id="upload_form" enctype="multipart/form-data" method="post">
  <input type="file" name="file1" id="file1"><br>
  <input type="button" value="Upload File" onclick="uploadFile()">
  <progress id="progressBar" value="0" max="100" style="width:300px;"></progress>
  <h3 id="status"></h3>
  <p id="loaded_n_total"></p>
</form>
</body>
</html>
PHP:
<?php
$fileName = $_FILES["file1"]["name"]; // The file name
$fileTmpLoc = $_FILES["file1"]["tmp_name"]; // File in the PHP tmp folder
$fileType = $_FILES["file1"]["type"]; // The type of file it is
$fileSize = $_FILES["file1"]["size"]; // File size in bytes
$fileErrorMsg = $_FILES["file1"]["error"]; // 0 for false... and 1 for true
if (!$fileTmpLoc) { // if file not chosen
    echo "ERROR: Please browse for a file before clicking the upload button.";
    exit();
}
if(move_uploaded_file($fileTmpLoc, "test/$fileName")){
    echo "$fileName upload is complete";
} else {
    echo "move_uploaded_file function failed";
}
?>
 
Ultima modifica:

Frozzen

Utente Attivo
18 Gen 2019
55
0
6
28
Milano
Grazie davvero per la risposta.. riusciresti ad inserirmi quei dati nei file? Non capisco perché, ma non mi funzionano..

Te ne sarei molto grato
 

fratt

Nuovo Utente
19 Gen 2019
33
4
8
Premessa: nel codice javascript avevo dimenticato di scrivere il nome dello script php da richiamare. Adesso ho corretto.

Di quali dati parli? Della select per decidere la cartella di upload?
 

Frozzen

Utente Attivo
18 Gen 2019
55
0
6
28
Milano
Ho visto che nel form che hai postato è stata inserita una barra upload ed è molto bella come idea! In sostanza avrei bisogno che la pagina non mi ricarichi a termine upload e se possibile si, la selezione delle cartelle che saranno dentro a una principale,ovvero la cartella upload.. grazie davvero se riesci a farmi questi 3 file..
 

fratt

Nuovo Utente
19 Gen 2019
33
4
8
Curiosità... ma l'hai provato il codice che ho postato? Probabilmente no...

Per la select, nella form basta inserire qualcosa così:
HTML:
<select id="cartella" name="cartella" >
<option value='cartella1'>Cartella1</option>
<option value='cartella2'>Cartella2</option>
<option value='cartella3'>Cartella3</option>
</select>
Poi però devi gestire anche la parte php.
 

Frozzen

Utente Attivo
18 Gen 2019
55
0
6
28
Milano
Si l'ho provato ma probabilmente sbaglio qualcosa io nell'inserimento dei dati... per questo ti chiedevo se riuscivi solo a crearmi te questi tre file.. tutto qui.. però se non riesci non preoccuparti mi hai aiutato tanto
 

fratt

Nuovo Utente
19 Gen 2019
33
4
8
Deve funzionare...
Salvi l'html come index.html e il php come upload.php
Metti entrambi i files in una cartella dove puoi eseguire codice php e ci crei dentro una sottocartella che si chiama test.
Lanci index.php nel browser e ti appare una pagina striminzita con 2 testi e 2 bottoni. Clicchi sul bottone browse e selezioni un file, poi clicchi sul bottone upload file.
Il file che hai selezionato devi ritrovartelo nella cartella test.
Se questo funziona ha senso pensare alle altre problematiche.
 
  • Like
Reactions: Frozzen

Frozzen

Utente Attivo
18 Gen 2019
55
0
6
28
Milano
Adesso funziona tutto, infatti non riuscivo a collegare i file.. io avevo nell'altro altri nomi, ho cercato di sostituirli prima ma non mi sono reso conto che erano differenti.. ora provo a sistemare il fatto di caricarle in cartelle separate
 

fratt

Nuovo Utente
19 Gen 2019
33
4
8
Facendo riferimento alla select di prima, devi passare il valore selezionato al php tramite javascript.
Puoi provare così:
Codice:
function uploadFile() {
  var file = _("file1").files[0];
  var cartella = _("cartella").value;
  var formdata = new FormData();
  formdata.append("file1", file);
  formdata.append("cartella", cartella);
  var ajax = new XMLHttpRequest();
  ajax.upload.addEventListener("progress", progressHandler, false);
  ajax.addEventListener("load", completeHandler, false);
  ajax.addEventListener("error", errorHandler, false);
  ajax.addEventListener("abort", abortHandler, false);
  ajax.open("POST", "upload.php");   // avevo dimenticato di scrivere il nome dello script php
  ajax.send(formdata);
}
Poi nel php richiami il valore e lo usi
PHP:
<?php
$fileName = $_FILES["file1"]["name"]; // The file name
$fileTmpLoc = $_FILES["file1"]["tmp_name"]; // File in the PHP tmp folder
$fileType = $_FILES["file1"]["type"]; // The type of file it is
$fileSize = $_FILES["file1"]["size"]; // File size in bytes
$fileErrorMsg = $_FILES["file1"]["error"]; // 0 for false... and 1 for true

$cartella = $_POST['cartella'];
$updir = "test/";
if ($cartella == "cartella1") {
  $updir = "pdf/";
} elseif ($cartella == "cartella2") {
  $updir = "img/";
}

if (!$fileTmpLoc) { // if file not chosen
    echo "ERROR: Please browse for a file before clicking the upload button.";
    exit();
}
if(move_uploaded_file($fileTmpLoc, $updir . $fileName)){
    echo "$fileName upload is complete";
} else {
    echo "move_uploaded_file function failed";
}
?>
Il codice l'ho scritto al volo e non l'ho testato... si dovrebbe capire la logica. Poi personalizza in base alle tue esigenze.
 
  • Like
Reactions: Frozzen

Frozzen

Utente Attivo
18 Gen 2019
55
0
6
28
Milano
Sei stato dettagliato al massimo, penso di aver fatto tutto apparte l'anteprima del file che vorrei mi apparisse una volta selezionato..

Grazie dell'aiuto, purtroppo a livello di programmazione" php, java, mysql, css, etc..etc.. "sono ancora neofita, conosco qualcosa e so che bisogna collegare il tutto ma non è semplice indovinare i termini da inserire.. se hai bisogno per hardware o software chiedi pure!
 

Max 1

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
29 Feb 2012
4.012
296
83
@Frozzen
Da regolamento del forum, come tutti noi sei tenuto ad usare il tag
o il tag
per il PHP, quando posti del codice, oppure la funzione codice dalla barra degli strumenti

Inoltre ti prego di leggere attentamente il regolamento generale del forum e quello di sezione dove posti
Grazie
Per questa volta te lo sistemo io ma mi raccomando per il futuro
 
  • Like
Reactions: Frozzen