Finestre.  Virus.  I Quaderni.  Internet.  ufficio.  Utilità.  Autisti

Per creare un sistema per caricare un'immagine o qualsiasi altro file sul server, vengono utilizzati un modulo HTML e uno script PHP per l'elaborazione dei dati inviati da questo modulo. È in questo modo che vengono implementati una varietà di servizi che supportano il caricamento di file sul server. È implementato in modo simile alla solita forma di invio di dati al server.

Modulo di invio file HTML

La forma più semplice di caricamento di file:





Di conseguenza, otteniamo un modulo contenente un campo per la selezione di un file e un pulsante che invia i dati del modulo al server:

Parametro tipo riceve il valore multipart/form-data in questo modulo, che specifica che i dati binari verranno inviati in questo modulo, ad es. file. Se questo valore non è specificato, per impostazione predefinita il modulo verrà eseguito come invio di informazioni di testo.

Parametro MAX_FILE_SIZE Il specificato nel modulo specifica la dimensione massima del file, specificata in byte. Per impostazione predefinita, questa dimensione è determinata dalle impostazioni del server.

Per specificare il tag del file di download deve contenere il tipo "file", e anche per ulteriori lavori dello script PHP, è necessario specificare il valore "nome".

L'invio dei dati del modulo viene effettuato dal tag con il tipo "invia". Viene visualizzato come un normale pulsante.

Codice di salvataggio del file PHP

Il compito di questo gestore, dopo aver ricevuto i dati del modulo, è di verificarne la presenza possibili errori, spostare il file temporaneo ricevuto dal server nella posizione desiderata con il nome specificato. Qui possono anche eseguire varie operazioni necessarie: scrivere informazioni nel database, creare miniature di immagini, salvare immagini con l'aggiunta di diritti d'autore e molto altro.

Nel codice ricevente, i dati del file sono contenuti nell'array superglobale $_FILES. Di conseguenza, puoi visualizzare le informazioni sul file inviato dal modulo in $_FILES["my_file"]. Tale matrice contiene le seguenti informazioni:

Dopo aver ricevuto queste informazioni sul server, il file deve essere copiato in una directory permanente, perché. il file temporaneo verrà eliminato automaticamente al completamento dello script.

La copia viene eseguita dalla funzione copy(), i cui parametri sono il nome del file sorgente (in questo caso, il nome del file temporaneo è $_FILES["my_file"]["tmp_name"]) e il nome della destinazione file.

Il risultato dovrebbe essere il seguente codice:

// specificando la directory e il nome del nuovo file sul server
$new_file = "/upload_files/" .$_FILES["uploadfile" ]["name" ];

// copia il file
if (copy($_FILES["uploadfile" ]["tmp_name" ], $new_file)) (
eco "File caricato sul server";
} altro(
eco "Errore durante il caricamento del file";
?>

La copia di un file deve essere eseguita in una cartella esistente sul server con i diritti per creare file al suo interno.

In questo esempio, il nome del file è lo stesso del file di caricamento originale. Nella vita reale, molto spesso il nome viene impostato in base alle proprie esigenze, il più delle volte utilizzando la data e l'ora del download, che garantisce l'univocità del nome del file. Ciò consente di ridurre l'archiviazione e l'elaborazione dei file a un unico standard. Qui, ovviamente, ci sono alcune attività aggiuntive per memorizzare il nome originale nel database, se necessario, o determinare l'estensione del file scaricato. Ma in questo caso, ci saranno meno problemi con la codifica del nome del file e il nome digitale del file può essere utilizzato anche per formare comodamente sottodirectory per l'archiviazione dei file scaricati.

La funzione copy() ritorna VERO Se la copia ha avuto successo e False se si è verificato un errore durante il processo di copia.

Se la copia viene completata correttamente, puoi eseguire tutte le azioni necessarie con il file caricato sul server.

JavaScript è bloccato nel tuo browser. Consenti a JavaScript di far funzionare questo sito!

Caricamento dei file sul server

Breve digressione da caricare

Cosa sono i file di caricamento o perché non funziona
copy("c:\images\sample.jpg", "http://mysite.ru/uploads/sample.jpg")

Anche se hai a disposizione un solo computer, sul quale sono combinati sia il server che la workstation, non dimenticare che php utilizza la tecnologia client/server. Il file che vogliamo scaricare si trova solitamente sulla macchina del client, ad es. utente, un normale visitatore del sito. La destinazione è il server. Per completare il processo di trasferimento file, abbiamo bisogno del seguente modulo:

Invia questo file:

Allo stesso tempo, l'URL del tuo script php dovrebbe essere specificato nel campo azione, che in seguito elaborerà i file caricati. Il campo nascosto MAX_FILE_SIZE deve precedere il campo di selezione file e contenere la dimensione massima consentita del file in byte. Il suo scopo è controllare la dimensione del file anche prima che il file venga inviato al server. Ciò dovrebbe salvare l'utente da un lungo e infruttuoso caricamento di file sul server e dalla generazione di traffico non necessario, ma non dovresti fare troppo affidamento su questa limitazione, poiché è facile aggirarla.

Cosa succede quando un utente seleziona un file sul proprio disco e fa clic sul pulsante "Invia file"? Il browser invia il file al server, dove l'interprete php lo colloca nella sua directory temporanea, gli assegna un nome casuale ed esegue lo script specificato nel campo azione.

Come dovrebbe essere upload.php?

$uploaddir = "/var/www/uploads/"; if (move_uploaded_file($_FILES["userfile"]["tmp_name"], $uploaddir. $_FILES["userfile"]["name"])) ( print "Il file è valido ed è stato caricato correttamente."; ) else ( print "Ci sono degli errori!"; )

Quando si scrive uno script, sorge una domanda naturale: come ottenere informazioni sul file scaricato e arrivare al file stesso. Se stai usando PHP versione 4.1.0 o successiva, è meglio fare riferimento all'array globale $_FILES. Per ogni file caricato, contiene un hash array, con i seguenti dati:

  • $_FILES["fileutente"]["nome"]- il nome originale del file, come lo ha visto l'utente quando ha selezionato il file;
  • $_FILES["userfile"]["tipo"]- file mime/tipo, ad esempio, può essere immagine/gif; questo campo è utile se vuoi fornire un'interfaccia per scaricare i file caricati;
  • $_FILES["userfile"]["dimensioni"]- la dimensione del file caricato;
  • $_FILES["userfile"]["tmp_name"]- percorso completo del file temporaneo sul disco;
  • $_FILES["userfile"]["errore"]- Dalla versione 4.2.0, contiene un codice di errore che è 0 se l'operazione è andata a buon fine.

Per le versioni di PHP inferiori alla 4.1.0 questo array è chiamato $HTTP_POST_FILES. Non dimenticare che, a differenza di $_FILES, questo array non è superglobale e quando si accede ad esso, ad esempio, da una funzione, è necessario specificare esplicitamente $HTTP_POST_FILES globale;

Se register_globals=on nelle impostazioni del tuo server, verranno create variabili aggiuntive nella forma $userfile_name, $userfile_type, $userfile_size.... define. Il modo migliore per ottenere informazioni sui file caricati, utilizzare l'array $_FILES.

Per lavorare con i file caricati, è meglio utilizzare le funzioni integrate is_uploaded_file() e move_uploaded_file() , che controllano se un file è stato caricato e lo posizionano rispettivamente nella cartella specificata. Informazioni più dettagliate possono essere trovate nelle pagine di manuale. Non dovresti reinventare la ruota e lavorare tu stesso con file temporanei, copiarli, eliminarli. Questo è già stato fatto prima di te e per te.

Ottimizzazione del server

Ho fatto tutto bene, ma qualcosa non funziona per me. Forse il mio server è configurato in modo errato?

Se "hai fatto tutto bene", ma il tuo codice non funziona o non funziona correttamente, non affrettarti a disperare. Forse il problema non è nelle tue mani, ma nelle impostazioni del server sbagliate. Ecco un elenco di direttive che hanno a che fare con i caricamenti di file:

Nel file php.ini:

  • Se vuoi sapere dove si trova il tuo php.ini, esegui
  • file_upload- la possibilità di vietare o consentire il download di file in generale. L'impostazione predefinita è Attivo.
  • upload_max_dimensionefile- la dimensione massima del file che può essere caricato. Se devi lavorare con file di grandi dimensioni, modifica questa impostazione. L'impostazione predefinita è 2M. Non dimenticare di modificare post_max_size.
  • post_max_size- limite superiore generale alla dimensione dei dati trasmessi in una richiesta POST. Se devi lavorare con file di grandi dimensioni o trasferire più file contemporaneamente, modifica questa impostazione. Il valore predefinito è 8M.
  • upload_tmp_dir- directory temporanea sul server in cui verranno posizionati tutti i file caricati. Controlla quali diritti sono previsti per esso (se in questa fase hai qualche difficoltà, vedi le spiegazioni alla fine dell'articolo). Tale directory deve esistere e anche l'utente con cui è in esecuzione Apache deve avere accesso in scrittura a questa directory. Se lavori con la restrizione open_basedir abilitata, la directory temporanea deve trovarsi all'interno. Non devi preoccuparti della pulizia o dell'univocità dei nomi, PHP gestisce questo problema per te.

In archivio httpd.conf:

  • Prima di tutto, assicurati di utilizzare il server Web Apache 1.3 ( ultima versione al momento della stesura di questo documento - 1.3.27). Se stai usando Apache 2.0, dovresti leggere il seguente estratto dalla documentazione:

    Non utilizzare Apache 2.0 e PHP in un ambiente di produzione né su Unix né su Windows.

  • Se ricevi un messaggio "POST Method Not Allowed", significa che dovresti cercare qualcosa di simile alle seguenti direttive e usare parola chiave permettere: Ordine consenti, nega Consenti da tutti
  • Problemi con il caricamento di file binari: la classica domanda "perché i file si rompono durante il caricamento". Ecco una soluzione proposta da Dima Borodin (http://php.spb.ru): Nella directory in cui si trova lo script, crea un file .htaccess, in cui scriviamo: CharsetDisable On Al file httpd.conf aggiungi righe: CharsetRecodeMultipartForms disattivato

Una piccola spiegazione per questa ricetta: il problema sopra descritto, quando gli archivi caricati sul server non vengono decompressi e le immagini non vengono visualizzate, può verificarsi a causa del fatto che viene utilizzato il server web russo Apache. La direttiva CharsetDisable disabilita il modulo di elaborazione del set di caratteri, ad es. non si verificherà alcuna conversione durante il download di file che si trovano in questa cartella. La direttiva CharsetRecodeMultipartForms disabilita la ricodifica dei dati inviati dal metodo POST con l'intestazione Content-Type: multipart/form-data. Quelli. i dati binari trasmessi con questa impostazione verranno lasciati nella loro forma originale e il resto del contenuto del sito verrà ricodificato in base alle impostazioni correnti del server.

Ma questo può causare complicazioni: preparati al fatto che in alcuni casi dovrai ricodificare tu stesso le parti di testo delle query. Ecco cosa dice la documentazione al riguardo:

Utilizzare la direttiva CharsetRecodeMultipartForms, introdotta in PL23, ma è comunque necessario ricodificare manualmente le parti di testo delle richieste. Per fare ciò, puoi utilizzare l'API Apache russa disponibile in altri moduli o l'API Apache Perl russa disponibile da mod_perl.

Puoi trovare un esempio di rilevamento della codifica qui: http://tony2001.phpclub.net/detect_charset/detect.phps

L'ultima documentazione su Apache russo è sul suo sito ufficiale: http://apache.lexa.ru/.

Non dimenticare che dopo ogni modifica alla configurazione, devi riavviare il tuo server web.

È anche possibile configurare le impostazioni di Apache utilizzando .htaccess:

php_value upload_max_filesize 50M php_value post_max_size 50M

Caratteristiche aggiuntive

Download di più file contemporaneamente

Un esempio di modulo di caricamento di più file:

Invia questi file:


E non dimenticare di ingrandire post_max_size se sono previsti molti file

Caricamento automatico dei file sul server

Non dimenticare che i file sul disco dell'utente sono informazioni riservate, con le quali né JavaScript né PHP hanno la minima relazione. Fino a quando l'utente non seleziona il file stesso utilizzando non si tratta di lavorare con lui. E non dimenticarlo dato campo input, l'attributo value è protetto da scrittura.

Memorizzazione di file in un database MySQL

Se hai intenzione di archiviare file scaricabili in un database, devi ricordare i seguenti punti:

  • Deve essere utilizzato il campo di tipo BLOB
  • Prima di inserirlo nel database, non dimenticare di applicare mysql_escape_string () alla stringa
  • Quando si visualizza un file, è necessario specificare l'intestazione content/type

Ricorda che lo script che esegue il rendering del codice HTML non ha nulla a che fare con lo script che dovrebbe eseguire il rendering dell'immagine. Queste devono essere due applicazioni diverse.

La memorizzazione delle immagini nel database non lo è bello stile. È molto più conveniente memorizzare solo i percorsi dei file immagine nel database.

Ottieni le proprietà dell'immagine.

Se devi controllare il tipo o la dimensione di un'immagine prima di caricare un file sul server, avrai bisogno della funzione getimagesize(). Prende come argomento il nome di un file su disco e restituisce un array, i cui primi due elementi sono rispettivamente la larghezza e l'altezza e il terzo è il tipo di immagine. Se è impossibile leggere l'immagine corretta dal file specificato, la funzione restituisce false.

Caricamento di file con un nome in lingua russa

Quando si caricano i file sul server, è necessario controllare i loro nomi originali per la presenza di caratteri "non standard" (ad esempio lettere russe). Se presenti, devono essere sostituiti. Il nome del file originale può essere trovato nella variabile $_FILES["userfile"]["name"]. Come transcodificare una stringa in lingua russa in traslitterazione può essere trovata negli esempi PHP.

Visualizzazione dello stato del download (barra di avanzamento)

Tieni presente che fino a quando il file non è completamente caricato, PHP non può operare né sulla dimensione del file né sulla percentuale del suo download. Solo quando il file è già sul server PHP è in grado di accedere alle informazioni. Se hai ancora assolutamente bisogno di implementare questa funzione, usa un'applet Java.

Autorizzazioni file

Problemi con i permessi sul server (upload_tmp_dir)

Nei sistemi operativi simili a Unix, ogni cartella, file, collegamento ha diritti di accesso corrispondenti. Potrebbero assomigliare a rwx-rw-r- o al numero 754.

La disponibilità di un file o di una directory dipende dall'ID utente e dall'ID del gruppo a cui appartiene. La modalità nel suo insieme è descritta in termini di tre sequenze, ciascuna con tre lettere:

Proprietario Gruppo Altro (u) (g) (o) rwx rwx rwx

Qui, il proprietario, i membri del gruppo e tutti gli altri utenti hanno i diritti di lettura, scrittura ed esecuzione del file. Diritti - qualsiasi combinazione significativa delle seguenti lettere:

r Il diritto alla lettura. (4)
w Autorizzazione di scrittura. (2)
x Il diritto di esecuzione (ricerca nella directory). (1)

  • Impostare il proprietario della directory sull'utente con i cui privilegi è in esecuzione apache. Questo può essere trovato nel file httpd.conf o guardando l'elenco dei processi sul server. I permessi sulla directory devono essere 700 (rwx------).
  • Indipendentemente da chi possiede la directory, impostare le autorizzazioni su 777 (rwxrwxrwx).

    Un esempio dell'implementazione del caricamento delle immagini sul server.

    $max_image_width = 380; $max_image_height = 600; $max_image_size = 64 * 1024; $valid_types = array("gif","jpg", "png", "jpeg"); if (isset($_FILES["userfile"])) ( if (is_uploaded_file($_FILES["userfile"]["tmp_name"])) ( $filename = $_FILES["userfile"]["tmp_name"]; $ ext = substr($_FILES["userfile"]["name"], 1 + strrpos($_FILES["userfile"]["name"], ".")); if (dimensionefile($nomefile) > $max_image_size ) ( echo "Errore: Dimensione file > 64K."; ) elseif (!in_array($ext, $tipo_valido)) ( echo "Errore: Tipo di file non valido."; ) else ( $size = GetImageSize($filename); if (($dimensione) && ($dimensione< $max_image_width) && ($size < $max_image_height)) { if (@move_uploaded_file($filename, "/www/htdocs/upload/")) { echo "File successful uploaded."; } else { echo "Error: moving fie failed."; } } else { echo "Error: invalid image properties."; } } } else { echo "Error: empty file."; } } else { echo "
    Invia questo file:
    "; }
  • Felice di vederti sulle pagine del mio sito. Oggi parleremo dell'implementazione del caricamento dei file sul server. L'argomento è piuttosto interessante. molti principianti sono interessati a questa domanda.

    Caricamento dei file sul server mezzo di PHP faciliterà notevolmente il tuo lavoro sul riempimento della galleria fotografica o sulla progettazione della pagina del sito utilizzando un editor (ad esempio, TinyMCE). Puoi anche caricare qualsiasi tipo di file sul server in base alle tue esigenze.

    Per caricare un file sul server, è necessario creare un modulo per il caricamento dei file. Fondamentalmente data forma non è molto diverso da un normale modulo con campi di testo, tranne per questo tipo non lo farà testo, UN file(poiché stiamo caricando i file) e l'attributo verrà aggiunto al modulo stesso enctype="dati multiparte/modulo". Entipo definisce il tipo di codifica che il browser applica ai parametri del modulo.

    PHP - Caricamento manuale dei file sul server

    Demo: caricamento di file sul server

    Carica le tue foto sul server

    Abbiamo creato il modulo per il caricamento dei file, è ora di scrivere un semplice gestore per caricare i file sul server. Stabiliremo immediatamente solo cosa verrà caricato file grafici con tipo jpeg, png, gif. Dopo aver definito i tipi di file da caricare sul server, dobbiamo creare una cartella sul server stesso dove memorizzeremo i nostri file. Nel mio esempio, questa è la cartella delle immagini, dove metteremo i nostri file.

    "Non ci sono stati errori, il file è stato caricato correttamente sul server. ", 1 => "La dimensione del file ricevuto ha superato la dimensione massima consentita, che è impostata dalla direttiva upload_max_filesize del file di configurazione php.ini.", 2 => "La dimensione del file caricato ha superato il valore MAX_FILE_SIZE specificato nel modulo HTML.", 3 => "Il file caricato è stato ricevuto solo parzialmente.", 4 => "Il file non è stato caricato.", 6 => "Manca la cartella Temp. Aggiunta in PHP 4.3.10 e PHP 5.0.3."); //Determina i tipi di file da caricare $fileTypes = array("jpg" => "image/jpeg", "png" => "image/png", "gif" => "image/gif"); //Se viene premuto il pulsante di caricamento if(isset($_POST["upload"])) ( //Controlla se i dati sono vuoti o meno if(!empty($_FILES)) ( //Controlla la presenza di errori if($ _FILES["files" ]["errore"] > 0) $err = $errUpload[$_FILES["files"]["errore"]]; //Controlla il tipo di file da caricare if(!in_array($_FILES[ "files"][" type"], $fileTypes)) $err = "Questo tipo di file ".$_FILES["files"]["tipo"] ." non adatto per il caricamento!"; //Se non ci sono errori, carica il file if(empty($err)) ( $type = pathinfo($_FILES["files"]["name"]); $name = $uploadDir ." /". uniqid("files_") .".". $type["extension"]; move_uploaded_file($_FILES["files"]["tmp_name"],$name); //Ripristina i parametri POST header("Posizione : http://". $_SERVER["HTTP_HOST"] ."/less/uploads/uploads.php?name=". $name); exit; ) else echo implode("
    ", $err); ) ) //Messaggio sull'avvenuto caricamento del file sul server if(isset($_GET["nome"])) echo "

    File ".htmlentities($_GET["nome"]) ." caricato con successo!

    "; //Emette immagini dalla directory $imgDir = array_values(array_diff(scandir($uploadDir), array("..", ".")))); for($i = 0; $i< count($imgDir); $i++) { if($i % 2 == 0) echo "
    "."\n"; echo " "."\n"; ) echo "

    "."\n"; echo "http://".$_SERVER["HTTP_HOST"] ." "; ?>

    Dopo che abbiamo scritto il codice, verificato che tutto funzioni, un principiante potrebbe trovarsi di fronte al problema di caricare file di grandi dimensioni. Per fare ciò, è necessario regolare le impostazioni in PHP.INI

    ; Tempo massimo di esecuzione per ogni script in secondi max_execution_time = 3000 ; La quantità massima di tempo che ogni script può dedicare all'analisi di una richiesta di dati max_input_time = 400 ; La quantità massima di memoria che lo script può consumare (8 MB) memory_limit = 500M ; La dimensione massima dei dati POST che PHP accetterà. post_max_size = 500 milioni; La dimensione massima consentita per i file caricati. upload_max_filesize = 200M

    Forme multiparte

    • Interfacce Web dei servizi di posta che consentono di aggiungere un allegato (allegato) alla lettera, e per questo è necessario prima caricare il file sul server, e solo dopo può essere aggiunto alla lettera;
    • Gallerie fotografiche interattive e album fotografici che non possono esistere senza un meccanismo per caricare i file sul server;
    • Portali software gratuiti utilizzati per condividere file tra vari programmi, ecc.

    Un file viene caricato sul server utilizzando un modulo multiparte che dispone di un campo di caricamento file. Il parametro enctype è impostato su multipart/form-data :



    Ecco come apparirà il modulo multipart sopra (puoi provare a usarlo per vedere il risultato dei moduli multipart caricando un piccolo file sul server):

    I moduli multiparte utilizzano in genere il metodo di invio POST. Come puoi vedere dall'esempio precedente, questo modulo ha due campi:

    • Campo di selezione file per il caricamento ;
    • Il campo per specificare il nome del file che dovrà avere sul server .

    Gestione di moduli multiparte

    Prima di iniziare a scrivere uno script di elaborazione di moduli multiparte, è necessario modificare il file di configurazione php.ini per consentire il caricamento dei file sul server.

    Configurazione File PHP php.ini ha tre impostazioni relative al caricamento dei file sul server:

    • file_uploads=On - consente di caricare file sul server tramite protocollo HTTP;
    • upload_tmp_dir=/tmp - imposta la directory per l'archiviazione temporanea dei file caricati;
    • upload_max_filesize=2M - imposta la dimensione massima dei file caricati.

    Se il tuo server web è in esecuzione sistema operativo Linux, è necessario riavviare il servizio:

    riavvio del servizio httpd

    In che modo PHP gestisce i moduli multiparte? Dopo aver ricevuto il file, lo salva nella directory temporanea upload_tmp_dir, il nome del file viene scelto in modo casuale. Quindi crea quattro variabili nell'array superglobale $_FILES. Questo array contiene informazioni sul file caricato.

    Le variabili definite per i file caricati dipendono dalla versione PHP e dalla configurazione corrente. L'array superglobale $_FILES è disponibile da PHP 4.1.0. Se la direttiva di configurazione register_globals è impostata su SU, le variabili con i nomi corrispondenti verranno dichiarate in aggiunta. Dalla versione 4.2.0 il valore predefinito per l'opzione register_globals è spento.

    Il contenuto dell'array $_FILES per il nostro esempio è mostrato di seguito. Si noti che qui si assume il nome uploadfile per il campo di selezione del file, come per il modulo multipart sopra. Naturalmente, il nome del campo può essere qualsiasi cosa.

    • $_FILES["uploadfile"]["name"] - nome del file prima che venga inviato al server, ad esempio pict.gif;
    • $_FILES["uploadfile"]["size"] - dimensione del file ricevuto in byte;
    • $_FILES["uploadfile"]["type"] - Tipo MIME del file ricevuto (se il browser è in grado di determinarlo), ad esempio: image/gif, image/png, image/jpeg, text/html;
    • (così abbiamo chiamato il campo di caricamento del file) - contiene il nome del file nella directory temporanea, ad esempio: /tmp/phpV3b3qY;
    • $_FILES["carica file"]["errore"] - Un codice di errore che può verificarsi durante il caricamento di un file. Chiave ["errore"]è stato aggiunto in PHP 4.2.0. È possibile trovare i codici di errore corrispondenti

    Al termine dello script, il file temporaneo verrà eliminato. Ciò significa che dobbiamo copiarlo in un'altra posizione prima che lo script venga completato. Cioè, l'algoritmo dello script per caricare un file sul server è il seguente:

    Se viene premuto il pulsante "Invia", il file sarà già caricato sul server e il suo nome sarà nella variabile $_FILES["uploadfile"]["name"]. In questo caso, lo script dovrebbe copiare immediatamente il file denominato $_FILES["uploadfile"]["tmp_name"] in qualche directory (richiede i permessi di scrittura per questa directory).

    Il file viene copiato dalla funzione copia() :

    Usa solo la funzione copy(), non sposta, perché:

    • Il file temporaneo verrà eliminato automaticamente;
    • Se la directory temporanea si trova su un altro supporto, verrà visualizzato un messaggio di errore.

    Supponiamo di voler caricare un file nella directory uploads, che si trova nella directory principale del server Web (nella directory DocumentRoot).

    // Crea una directory per ogni evenienza. Se è già stato creato,
    // non vedremo un messaggio di errore perché usiamo l'operatore @:

    @mkdir("upload", 0777);

    // Copia il file da /tmp nei caricamenti
    // Il nome del file sarà lo stesso di prima che fosse inviato al server:

    Copia($_FILES["uploadfile"]["tmp_name"],"uploads/".basename($_FILES["uploadfile"]["name"]));

    Su Linux, le cose sono molto più complicate: dobbiamo tenere conto delle autorizzazioni sulla directory dei caricamenti. Molto probabilmente in questo caso, la funzione mkdir() non funzionerà perché non abbiamo accesso in scrittura alla directory DocumentRoot (di solito /var/www/html o /home/httpd/html). Accedi al sistema come root , crea una directory di upload e modificane il proprietario e le autorizzazioni come segue:

    // Crea la directory dei caricamenti

    // Imposta il nome del proprietario di apache e del suo gruppo - anche apache:

    Chown apache: caricamenti Apache

    // Consentire a tutti di scrivere (777) + impostare lo sticky bit (1):

    Caricamenti Chmod 1777

    La dimensione del file può essere limitata, se lo si desidera, è possibile modificare il file .htaccess e limitare l'accesso alla directory dei caricamenti - specificare utenti specifici che possono accedere alla directory o indirizzi IP.

    Ora puoi caricare i file sul server.

    Noi scriviamo script PHP caricamento dei file sul server


    // Directory dove riceveremo il file:
    $ uploaddir = "./files/" ;
    $uploadfile = $uploaddir. basename($_FILES["uploadfile"]["name"]);

    // Copia il file dalla directory per l'archiviazione temporanea dei file:
    if (copy($_FILES["uploadfile"]["tmp_name"], $uploadfile))
    {
    eco "

    Il file è stato caricato correttamente sul server

    " ;
    }
    altro (eco "

    Errore! Impossibile caricare il file sul server!

    "
    ; Uscita; )

    // Visualizza le informazioni sul file caricato:
    eco "

    Informazioni sul file caricato sul server:

    "
    ;
    eco "

    Nome originale del file caricato: ".$ _FILES [ "uploadfile" ][ "name" ]. "

    " ;
    eco "

    Tipo mime del file caricato: ".$_FILES [ "caricafile" ][ "tipo" ]. "

    " ;
    eco "

    Dimensioni del file scaricato in byte: ".$_FILES [ "uploadfile" ][ "size" ]. "

    " ;
    eco "

    Nome file temporaneo: ".$_FILES [ "uploadfile" ][ "tmp_name" ]. "

    " ;

    ?>

    Il caricamento di più file può essere implementato utilizzando, ad esempio, vari valori del nome per il tag di ingresso.

    Fornisce inoltre la possibilità di ottenere automaticamente informazioni organizzate in una matrice di informazioni su diversi file scaricati contemporaneamente. Per implementare questa funzione, utilizzare la stessa sintassi per l'invio di un array da un modulo HTML come per più campi select e checkbox:


    Invia questi file:






    Nel caso in cui sia stato inviato un modulo di questo tipo, gli array $_FILES["userfile"] , $_FILES["userfile"]["name"] e $_FILES["userfile"]["size"] verranno inizializzati (nel allo stesso modo, come $HTTP_POST_FILES per PHP 4.1.0 e versioni successive prime versioni). Se la direttiva di configurazione register_globals è impostata su on , verranno inizializzate anche le variabili globali associate. Ognuna di queste variabili sarà un array indicizzato numericamente dei valori corrispondenti per i file ricevuti.

    Supponiamo che i file /home/test/some.html e /home/test/file.bin siano stati caricati. In questo caso, la variabile $_FILES["userfile"]["name"] avrà il valore some.html , e la variabile $_FILES["userfile"]["name"] avrà il valore file.bin . Allo stesso modo, $_FILES["userfile"]["size"] conterrà la dimensione del file some.html e così via.

    Variabili $_FILES["userfile"]["name"] , $_FILES["userfile"]["tmp_name"], $_FILES["userfile"]["size"] e $_FILES["userfile"]["type"] verranno anch'essi inizializzati.

    Conclusione:

    Come puoi vedere, organizzare il caricamento dei file sul server non è così difficile. È più difficile fornire il livello di sicurezza necessario, poiché il caricamento di file sul server può essere utilizzato dagli aggressori per attaccare il server. Per informazioni su come garantire il livello di sicurezza necessario quando si lavora con i caricamenti, vedere.



    <<< Назад Contenuto Avanti >>>
    Se hai altre domande o qualcosa non è chiaro, benvenuto nel nostro

    L'applicazione per caricare i file sul server è un modulo HTML (upload.html) e lo script upload.php per elaborarlo.

    Commento: Puoi scaricare la versione industriale del sistema di caricamento file sul server dalla sezione. Il sistema ti consentirà non solo di caricare il file sul server, ma anche di modificarne le dimensioni, lo sfondo, ecc.

    Codice modulo (upload.html)

    Modulo caricamento file



    Codice dello script di elaborazione del modulo (upload.php)

    Risultato del caricamento del file 1024 * 3 * 1024 ) ( echo (); esci; ) // Controlla se il file è caricato if(is_uploaded_file ($_FILES [ "nomefile" ][ "tmp_name" ])) ( // Se il file è stato caricato correttamente, spostalo // dalla directory temporanea alla destinazione move_uploaded_file ($_FILES [ "filename" ][ "tmp_name" ], "/path/to/file/" . $_FILES [ "filename" ][ "name" ]); ) altro ( echo( "Errore durante il caricamento del file"); } ?>

    L'attributo entype del modulo specifica il tipo di codifica che il browser applica ai parametri del modulo. Affinché il caricamento dei file sul server funzioni, l'attributo entype deve essere impostato su multipart/form-data. Per impostazione predefinita, questo attributo è impostato su application/x-www-form-urlencoded.

    L'elemento di input di questo modulo deve essere di tipo file.

    Dopo aver ricevuto una richiesta HTTP, il contenuto del file caricato viene scritto in un file temporaneo, che viene creato nella directory predefinita del server per i file temporanei, a meno che non sia specificata un'altra directory nel file php.ini (direttiva upload_tmp_dir).

    Le caratteristiche del file caricato sono disponibili tramite l'array bidimensionale $_FILES.

    Lo script upload.php carica un file sul server e lo copia nella directory /path/to/file/.

    In alcuni casi, è necessario limitare la dimensione di un file che può essere caricato sul server. Ad esempio, per consentire il caricamento sul server solo di file di dimensioni fino a 3 MB, lo script seguente contiene il seguente codice:

    1024 * 3 * 1024 ) ( eco( "La dimensione del file supera i tre megabyte"); Uscita; ) ... ?>

    La dimensione massima del file di caricamento può anche essere impostata utilizzando la direttiva upload_max_filesize, che per impostazione predefinita è 2 MB:

    upload_max_filesize ) .. ?>

    Se noti un errore, seleziona una parte di testo e premi Ctrl + Invio
    CONDIVIDERE: