Come visto nell'articolo Il passaggio di valori con PHP, i metodi $_POST e $_GET per inviare dei valori da una pagina ad un'altra usiamo le form.
Allo stesso modo per permettere ad un utente di inviare un file al server useremo una form e un campo input di tipo file, il quale permette all'utente di selezionare un file dal proprio computer e di inviarlo al server.
Per ottenere questo innanzitutto la form che contiene il campo deve aver impostato il parametro method su POST e in aggiunta il parametro enctype, che definisce la tipologia di codifica dei dati, impostato a multipart/form-data.
Ora l'utente non dovrà far altro che clickare sul tasto sfoglia e selezionare il file da inviare e poi clickare sul tasto "Invia il file" ed il gioco è fatto.
A questo punto spetta a PHP il compito di ricevere il file e salvarlo. Quest'operazione è alquanto semplice ma allo stesso tempo delicata.
Quando un file viene inviato PHP valorizza un'array superglobale denominato $_FILES, nel quale aggiunge una chiave corrispondente al nome del campo "input file" e imposta al suo interno i valori name, tmp_name, size e error.
Questi quattro valori contengono rispetivamente:
name => il nome originale del file
tmp_name => il nome e il path del file temporaneo
size => la dimensione del file caricato
error => un codice errore che ci indica se il caricamento è andato a buon fine o meno
Ora nello script PHP incaricato di ricevere il file il primo controllo che andiamo a fare sarà l'esistenza della chiave corrispondente al campo file con isset assieme a is_uploaded_file che verifica che il file è stato caricato via POST e non sia un tentativo di forzatura di utente malizioso.
if(isset($_FILES['uploadFile']) && is_uploaded_file($_FILES['uploadFile']['tmp_name'])){
/** prima verifico l'esistenza della chiave nell'array
* poi verifico che il file sia stato caricato via POST
*/
}
Ora verifichiamo che il valore associato alla chiave error sia 0 e spostiamo il file con move_uploaded_file dalla directory temporanea a quella dove dev'essere archiviato il file.
if(isset($_FILES['uploadFile']) && is_uploaded_file($_FILES['uploadFile']['tmp_name'])){
/** prima verifico l'esistenza della chiave nell'array
* poi verifico che il file sia stato caricato via POST
*/
if($_FILES['uploadFile']['error']==0){
move_uploaded_file($_FILES['uploadFile']['tmp_name'],"./upload/".$_FILES['uploadFile']['name']);
}
}
E con questo abbiamo il nostro file salvato sul server, mentre il file che si trova nella directory temporanea viene eliminato automaticamente al tetrmine dell'esecuzione dello script.
Fino ad ora abbiamo presupposto che il procedimento di upload sia andato a buon fine, ma spesso che la procedura non vada a buon fine e in questo caso la chiave error assume un valore diverso da 0.
I codici errore sono dei numeri interi da 0 a 8 ai quali PHP asocia anche delle costanti predefinite, vediamo questi codici a cosa corrispondono:
Allo stesso modo per permettere ad un utente di inviare un file al server useremo una form e un campo input di tipo file, il quale permette all'utente di selezionare un file dal proprio computer e di inviarlo al server.
Per ottenere questo innanzitutto la form che contiene il campo deve aver impostato il parametro method su POST e in aggiunta il parametro enctype, che definisce la tipologia di codifica dei dati, impostato a multipart/form-data.
Ora l'utente non dovrà far altro che clickare sul tasto sfoglia e selezionare il file da inviare e poi clickare sul tasto "Invia il file" ed il gioco è fatto.
A questo punto spetta a PHP il compito di ricevere il file e salvarlo. Quest'operazione è alquanto semplice ma allo stesso tempo delicata.
Quando un file viene inviato PHP valorizza un'array superglobale denominato $_FILES, nel quale aggiunge una chiave corrispondente al nome del campo "input file" e imposta al suo interno i valori name, tmp_name, size e error.
Questi quattro valori contengono rispetivamente:
name => il nome originale del file
tmp_name => il nome e il path del file temporaneo
size => la dimensione del file caricato
error => un codice errore che ci indica se il caricamento è andato a buon fine o meno
Ora nello script PHP incaricato di ricevere il file il primo controllo che andiamo a fare sarà l'esistenza della chiave corrispondente al campo file con isset assieme a is_uploaded_file che verifica che il file è stato caricato via POST e non sia un tentativo di forzatura di utente malizioso.
if(isset($_FILES['uploadFile']) && is_uploaded_file($_FILES['uploadFile']['tmp_name'])){
/** prima verifico l'esistenza della chiave nell'array
* poi verifico che il file sia stato caricato via POST
*/
}
Ora verifichiamo che il valore associato alla chiave error sia 0 e spostiamo il file con move_uploaded_file dalla directory temporanea a quella dove dev'essere archiviato il file.
if(isset($_FILES['uploadFile']) && is_uploaded_file($_FILES['uploadFile']['tmp_name'])){
/** prima verifico l'esistenza della chiave nell'array
* poi verifico che il file sia stato caricato via POST
*/
if($_FILES['uploadFile']['error']==0){
move_uploaded_file($_FILES['uploadFile']['tmp_name'],"./upload/".$_FILES['uploadFile']['name']);
}
}
E con questo abbiamo il nostro file salvato sul server, mentre il file che si trova nella directory temporanea viene eliminato automaticamente al tetrmine dell'esecuzione dello script.
Fino ad ora abbiamo presupposto che il procedimento di upload sia andato a buon fine, ma spesso che la procedura non vada a buon fine e in questo caso la chiave error assume un valore diverso da 0.
I codici errore sono dei numeri interi da 0 a 8 ai quali PHP asocia anche delle costanti predefinite, vediamo questi codici a cosa corrispondono:
valore: 0
costante: UPLOAD_ERR_OK
significato: nessun errore
valore: 1
costante: UPLOAD_ERR_INI_SIZE
significato: il file caricato supera le dimensioni definite dalla direttiva upload_max_filesize definita in php.ini
valore: 2
costante: UPLOAD_ERR_FORM_SIZE
significato: il file caricato supera le dimensioni definite dalla direttiva MAX_FILE_SIZE specificata nella form
valore: 3
costante: UPLOAD_ERR_PARTIAL
significato: il file non è stato caricato completamente
valore: 4
costante: UPLOAD_ERR_NO_FILE
significato: il file non è stato caricato
valore: 6
costante: UPLOAD_ERR_NO_TMP_DIR
significato: directory temporanea dove caricare i file mancante
valore: 7
costante: UPLOAD_ERR_CANT_WRITE
significato: errore di scritura sul disco
valore: 8
costante: UPLOAD_ERR_EXTENSION
significato: il caricamento del file è stato bloccato a causa dell'estensione file non accettata
con questi codici possiamo facilmente avvisare l'utente se l'upload è andato a buon fine o se si sono verificati errori.
Un'altra direttiva di php.ini che influenza l'upload dei file è post_max_size: questa direttiva se è inferiore a alla dimensione di upload_max_filesize e viene caricato un file maggiore del post_max_size gli array $_POST e $_FILES saranno vuoti, quindi è consigliabile impostare post_max_size sempre maggiore di upload_max_filesize.
costante: UPLOAD_ERR_OK
significato: nessun errore
valore: 1
costante: UPLOAD_ERR_INI_SIZE
significato: il file caricato supera le dimensioni definite dalla direttiva upload_max_filesize definita in php.ini
valore: 2
costante: UPLOAD_ERR_FORM_SIZE
significato: il file caricato supera le dimensioni definite dalla direttiva MAX_FILE_SIZE specificata nella form
valore: 3
costante: UPLOAD_ERR_PARTIAL
significato: il file non è stato caricato completamente
valore: 4
costante: UPLOAD_ERR_NO_FILE
significato: il file non è stato caricato
valore: 6
costante: UPLOAD_ERR_NO_TMP_DIR
significato: directory temporanea dove caricare i file mancante
valore: 7
costante: UPLOAD_ERR_CANT_WRITE
significato: errore di scritura sul disco
valore: 8
costante: UPLOAD_ERR_EXTENSION
significato: il caricamento del file è stato bloccato a causa dell'estensione file non accettata
con questi codici possiamo facilmente avvisare l'utente se l'upload è andato a buon fine o se si sono verificati errori.
Un'altra direttiva di php.ini che influenza l'upload dei file è post_max_size: questa direttiva se è inferiore a alla dimensione di upload_max_filesize e viene caricato un file maggiore del post_max_size gli array $_POST e $_FILES saranno vuoti, quindi è consigliabile impostare post_max_size sempre maggiore di upload_max_filesize.
Ritorna alla pagina Articoli


Home










