Ανέβασμα αρχείων

Για να δώσουμε τη δυνατότητα σε ένα χρήστη να ανεβάσει ένα αρχείο, θα πρέπει να δημιουργήσουμε μία φόρμα που να υποστηρίζει τη δυνατότητα αυτή. Έστω ότι έχουμε την παρακάτω φόρμα:

<form action="upload.php" method="post" enctype="multipart/form-data">
    <p><input type="file" name="file" /></p>
    <p><input type="submit" value="Αποστολή" /></p>
</form>

Η ιδιότητα enctype html στοιχείου form είναι απαραίτητο να υπάρχει και να έχει την τιμή multipart/form-data ώστε να υπάρχει η δυνατότητα ανεβάσματος του αρχείου.

Η τιμή 'file' της ιδιότητας type του πρώτου στοιχείου input ορίζει ότι το συγκεκριμένο πεδίο χρησιμοποίειται για το ανέβασμα αρχείου. Πράγματι, αν ανοίξουμε το φυλλομετρητή, θα δούμε δίπλα από το πεδίο αυτό ένα button με την τιμή 'Browse' πάνω που χρησιμοποιείται για την αναζήτηση στο σκληρό μας δίσκο του αρχείου που θέλουμε να ανεβάσουμε.

Τέλος, το δεύτερο στοιχείο input με type 'submit' χρησιμοποιείται για την αποστολή των στοιχείων της φόρμας στο αρχείο upload.php.

Δημιουργούμε το αρχείο upload.php το οποίο αναλαμβάνει να διαχειριστεί το αρχείο που ανεβάζει ο χρήστης και το οποίο περιλαμβάνει τον εξής κώδικα:

<?php
    if ( isset ( $_FILES ['file'] ) )
    {
        echo "Όνομα αρχείου: ".$_FILES['file']['name'].'<br />';
        echo "Προσωρινό όνομα αρχείου: ".$_FILES['file']['tmp_name'].'<br />';
        echo "Τύπος αρχείου: ".$_FILES['file']['type'].'<br />';
        echo "Λάθος: ".$_FILES['file']['error'].'<br />';
        echo "Μέγεθος αρχείου: ".$_FILES['file']['size'].'<br />';
        echo "Σφάλμα: ".$_FILES['file']['error'];
    } // end if
?>

Ανεβάζοντας κάποιο αρχείο, η PHP δημιουργεί τον πίνακας $_FILES, ο οποίος περιέχει όλα τα αρχεία που ανέβηκαν. Στην περίπτωσή μας, επειδή είχαμε μόλις ένα input στοιχείο τύπου file, ο πίνακας $_FILES θα περιέχει μόνο ένα στοιχείο. Για να προσπελάσουμε το στοιχείο αυτό, αρκεί να χρησιμοποιήσουμε το όνομα του πεδίου που είχαμε δώσει στη φόρμα (δηλαδή name=”file”). Το στοιχείο του πίνακα είναι το $_FILES ['file'].

Στον παραπάνω κώδικα, ελέγχουμε αρχικά αν υπάρχει το στοιχείο. Αν υπάρχει, σημαίνει ότι πράγματι ο χρήστης ανέβασε ένα αρχείο. Το στοιχείο $_FILES ['file'] είναι, επίσης, πίνακας και περιέχει τις εξής πληροφορίες:

  • $_FILES['file']['name']: το όνομα του αρχείου που ανεβάσαμε
  • $_FILES['file']['tmp_name']: το όνομα του προσωρινού αρχείου που ανέβηκε στο server
  • $_FILES['file']['type']: ο τύπος του αρχείου (π.χ. αν είναι εικόνα, pdf, doc κλπ.)
  • $_FILES['file']['size']: το μέγεθος του αρχείου σε bytes
  • $_FILES['file']['error']: επιστρέφει 1 αν υπάρχει κάποιο σφάλμα, 0 διαφορετικά

Για παράδειγμα, μπορεί το αποτέλεσμα να είναι της μορφής:

  • Όνομα αρχείου: Paros2003.jpg
  • Προσωρινό όνομα αρχείου: /Applications/MAMP/tmp/php/phpr71yJ4
  • Τύπος αρχείου: image/jpeg
  • Μέγεθος αρχείου: 49548
  • Σφάλμα: 0

Παρατηρώντας την πληροφορία που έχει το στοιχείο $_FILES['file'], μπορούμε να θέσουμε κάποιους περιορισμούς, όπως στον τύπο του αρχείου που μπορεί να ανεβάσει κανείς (π.χ. εικόνες) ή το μέγιστο μέγεθος του αρχείου.
Το είδος του αρχείου είναι το λεγόμενο mime type και κάθε αρχείο συγκεκριμένη τιμή. Παρακάτω, βλέπουμε μερικούς από τους πιο γνωστούς τύπους αρχείων. Αν κάποιος επιθυμεί να δει μεγαλύτερη λίστα, μία αναζήτηση σε μία μηχανή αναζήτησης με βάση τη φράση 'list of mime types' θα τον οδηγήσει στο επιθυμητό αποτέλεσμα.

Προέκταση αρχείου

Περιγραφή αρχείου

Mime type

.jpg

Αρχείο εικόνας jpg

image/jpeg

.jpeg

Αρχείο εικόνας jpeg

image/jpeg

.gif

Αρχείο εικόνας gif

image/gif

.png

Αρχείο εικόνας png

image/png

.doc

Αρχείο word

application/msword

.xls

Αρχείο excel

application/excel

.ppt

Αρχείο powerpoint

application/mspowerpoint

.pdf

Αρχείο pdf

application/pdf

.txt

Αρχείο απλού κειμένου

text/plain

Όσον αφορά το μέγεθος του αρχείου, ισχύουν οι παρακάτω αντιστοιχίες μονάδων:

1 Kb (kilobyte) = 1024 Bytes
1 Mb (megabyte) = 1024 Kilobytes = 1024 * 1024 Bytes

Επομένως, στην περίπτωση που θέλουμε να επιτρέπουμε το ανέβασμα μόνο αρχειών jpg μεγέθους το πολύ 100 Kbs, μπορούμε να γράψουμε:

<?php
    if ( isset ( $_FILES ['file'] ) )
    {
        if ( $_FILES['file']['type'] != 'image/jpeg' )
        {
            echo "Μπορείτε να ανεβάσετε μόνο αρχεία τύπου jpg.";
        } // end if
        else if ( $_FILES['file']['size'] > 1024 * 100 )
        {
            echo "Το αρχείο δεν πρέπει να ξεπερνάει τα 100 Kbs.";
        } // end else if
        else
        {
            // Κώδικας για το ανέβασμα του αρχείου
        } // end else
    } // end if
?>

Αφού είδαμε τον τρόπο με τον οποίο ανεβάζουμε αρχεία προσωρινά στο server καθώς και τους περιορισμούς που μπορούμε να θέσουμε, απομένει να δούμε το τελικό ανέβασμα του αρχείου στο σημείο του server που θέλουμε. Για τη διαδικασία αυτή, χρησιμοποιούμε τη συνάρτηση move_uploaded_file, η οποία στην ουσία μεταφέρει το προσωρινό αρχείο στο σημείο του server που θέλουμε και με την ονομασία που θέλουμε.

Σύνταξη
move_uploaded_file ($old_path, $new_path);

Όπου το όρισμα $old_path παίρνει το μονοπάτι και το όνομα του προσωρινού αρχείου στο server και το $new_path το μονοπάτι και το επιθυμητό όνομα του τελικού αρχείου. Επομένως, αν έχουμε δημιουργήσει τον κατάλογο 'upload', όπου βάζουμε όλα τα αρχεία που ανεβάζει ο χρήστης, μπορούμε να προσαρμόσουμε τον παραπάνω κώδικα ως εξής:

<?php
    if ( isset ( $_FILES ['file'] ) )
    {
        if ( $_FILES['file']['type'] != 'image/jpeg' )
        {
            echo "Μπορείτε να ανεβάσετε μόνο αρχεία τύπου jpg.";
        } // end if
        else if ( $_FILES['file']['size'] > 1024 * 100 )
        {
            echo "Το αρχείο δεν πρέπει να ξεπερνάει τα 100 Kbs.";
        } // end else if
        else
        {
            move_uploaded_file ( $_FILES ['file'] ['tmp_name'], 'upload/'.$_FILES ['file'] ['name'] );
        } // end else
    } // end if
?>

Φυσικά μπορούμε στη 2η παράμετρο να δώσουμε ό,τι όνομα θέλουμε στο τελικό αρχείο και όχι απαραίτητα το όνομα που είχε όταν το βάλαμε στη φόρμα.