Php μεταφόρτωση αρχείου. Μεταφόρτωση αρχείων στον διακομιστή με χρήση PHP. Στάδια φόρτωσης αρχείου στον διακομιστή

Πώς να ανεβάσετε ένα αρχείο στον διακομιστή χρησιμοποιώντας PHP; Σε αυτό το άρθρο θα εξετάσουμε αυτό το ζήτημα λεπτομερώς με παραδείγματα.

Φόρμα HTML για την υποβολή αρχείου

Το πρώτο πράγμα που πρέπει να γνωρίζετε για να ανεβάσετε αρχεία στον διακομιστή είναι οι δυνατότητες των φορμών HTML που υποβάλλουν το αρχείο.

Ακολουθεί ένα παράδειγμα κώδικα HTML για αυτήν τη φόρμα:

Φόρμα μεταφόρτωσης αρχείου



Τι είναι μοναδικό σε αυτή τη φόρμα:

  1. Η ετικέτα φόρμας πρέπει να περιέχει το χαρακτηριστικό enctype="multipart/form-data. Αυτό το χαρακτηριστικό υποδεικνύει ότι η φόρμα θα υποβάλει ένα αρχείο. Από προεπιλογή, το χαρακτηριστικό enctype έχει οριστεί σε application/x-www-form-urlencoded .
  2. Η φόρμα πρέπει να περιέχει ένα κρυφό χαρακτηριστικό (type="hidden") με το όνομα MAX_FILE_SIZE του οποίου η τιμή (τιμή) υποδεικνύει το μέγεθος του αρχείου. Θεωρητικά, τα προγράμματα περιήγησης θα πρέπει να αναφέρουν ότι το αρχείο είναι μεγαλύτερο από επιτρεπόμενες διαστάσεις, αλλά στην πράξη τα προγράμματα περιήγησης δεν το υποστηρίζουν. Νομίζω ότι αυτό το χαρακτηριστικό μπορεί να παραλειφθεί.
  3. Για να επιλέξετε το αρχείο που θα μεταφερθεί, χρησιμοποιήστε την ετικέτα εισαγωγής, η οποία έχει το χαρακτηριστικό type="file".

Αφού ο διακομιστής λάβει ένα αίτημα HTTP από μια τέτοια φόρμα, εγγράφει το αρχείο σε έναν προσωρινό φάκελο του διακομιστή.

Εάν θέλετε το αρχείο να αποθηκευτεί σε διαφορετικό κατάλογο σε αυτό το στάδιο, καθορίστε το στην οδηγία upload_tmp_dir του αρχείου php.ini.

Για να μετακινήσετε ένα μεταφορτωμένο αρχείο σε μια νέα θέση, χρησιμοποιήστε τη συνάρτηση move_uploaded_file.

Πριν όμως αρχίσουμε να εργαζόμαστε με αυτή τη συνάρτηση, πρέπει να εξετάσουμε τον δισδιάστατο πίνακα $_FILES, μέσω του οποίου έχουμε πρόσβαση στα χαρακτηριστικά του αρχείου που ανεβάσατε.

Έτσι, αφού το σενάριο έλαβε τα δεδομένα της φόρμας με το μεταφερόμενο αρχείο, έγραψε το αρχείο σε έναν ειδικό φάκελο και έγραψε τα δεδομένα σχετικά με το αρχείο σε έναν δισδιάστατο πίνακα $_FILES .

Ας δούμε ένα παράδειγμα που εμφανίζει τα περιεχόμενα του πίνακα $_FILES στην οθόνη.

Φόρμα μεταφόρτωσης αρχείου


";) else (ηχώ"
", print_r($_FILES), "
"; } ?>

Αυτό είναι αυτό που παίρνουμε ως αποτέλεσμα αυτού του σεναρίου:

Εικ.1. Πίνακας $_FILES.

Τώρα ας δούμε τι περιέχεται σε αυτόν τον πίνακα.

Ο δισδιάστατος πίνακας $_FILES μας έχει ένα στοιχείο, όνομα αρχείου . Αυτή είναι η τιμή του πεδίου ονόματος από το στοιχείο φόρμας:

Δεδομένα για αυτό το αρχείο:

  • $_FILES["όνομα αρχείου"]["όνομα"] - όνομα αρχείου;
  • $_FILES["όνομα αρχείου"]["τύπος"] - τύπος αρχείου;
  • $_FILES["όνομα αρχείου"]["tmp_name"] - πλήρης διαδρομή προς τον προσωρινό κατάλογο στο δίσκο.
  • $_FILES["όνομα αρχείου"]["σφάλμα"] - περιέχει τον κωδικό σφάλματος, ο οποίος είναι 0 εάν η λειτουργία ήταν επιτυχής.
  • $_FILES["όνομα αρχείου"]["μέγεθος"] - μέγεθος αρχείου.

Θα ήταν δυνατό να καθορίσετε δύο πεδία για αρχεία στη φόρμα, για παράδειγμα ως εξής:


Σε αυτήν την περίπτωση, ο πίνακας μας θα μοιάζει με αυτό:


Εικ.2. Πίνακας $_FILES.

Έτσι, τώρα γνωρίζουμε πώς είναι δομημένος ο πίνακας $_FILES και το επόμενο βήμα είναι να τοποθετήσουμε το αρχείο που προκύπτει στη θέση που χρειαζόμαστε.

συνάρτηση move_uploaded_file

Όπως έγραψα ήδη, η συνάρτηση move_uploaded_file χρησιμοποιείται για τη μετακίνηση ενός μεταφορτωμένου αρχείου σε μια νέα θέση.

Η σύνταξη της συνάρτησης move_uploaded_file είναι:

move_uploaded_file (από πού να μεταφέρετε, πού να μεταφέρετε)

Η συνάρτηση move_uploaded_file επιστρέφει μια boolean τιμή:

  • ΑΛΗΘΕΙΑ - εάν είναι επιτυχής,
  • FALSE - εάν το πρώτο όρισμα είναι ένα φορτωμένο αρχείο, αλλά για κάποιο λόγο δεν μπορεί να μετακινηθεί στην καθορισμένη θέση, σε αυτήν την περίπτωση δεν γίνεται καμία ενέργεια.

Ας χρησιμοποιήσουμε αυτή τη συνάρτηση σε ένα παράδειγμα:

Φόρμα μεταφόρτωσης αρχείου


"; ) else ( move_uploaded_file ($_FILES["filename"]["tmp_name"], __DIR__ . DIRECTORY_SEPARATOR . $_FILES["filename"]["name"]); ) ?>

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

  • __DIR__ - μία από τις "μαγικές" σταθερές, περιέχει τον κατάλογο αρχείων.
  • Το DIRECTORY_SEPARATOR είναι μια προκαθορισμένη σταθερά που περιέχει το διαχωριστικό διαδρομής. Για λειτουργικό σύστημα Windows είναι "\", για λειτουργικό σύστημα Linux και άλλα είναι "/".

Σημείωση: Εάν το αρχείο που προκύπτει υπάρχει ήδη, θα αντικατασταθεί.

συνάρτηση is_uploaded_file

Υπάρχει μια ακόμη λειτουργία που πρέπει να χρησιμοποιείται κατά την εργασία με τη μεταφόρτωση αρχείων στον διακομιστή. Αυτή είναι η συνάρτηση is_uploaded_file και χρησιμοποιείται για λόγους ασφαλείας.

is_uploaded_file - Καθορίζει εάν το αρχείο μεταφορτώθηκε χρησιμοποιώντας HTTP POST και επιστρέφει TRUE εάν ναι.

Η χρήση αυτής της συνάρτησης είναι χρήσιμη για να διασφαλιστεί ότι ένας κακόβουλος χρήστης δεν προσπαθεί να ξεγελάσει το σενάριο για να εργαστεί με αρχεία που δεν θα έπρεπε - για παράδειγμα, /etc/passwd.

Σημείωση: για να λειτουργήσει σωστά η συνάρτηση is_uploaded_file, πρέπει να περάσετε τη διαδρομή προς το αρχείο σε προσωρινή αποθήκευση στον διακομιστή, δηλαδή ένα όρισμα όπως $_FILES["filename"]["tmp_name"] , αλλά το όνομα του το μεταφορτωμένο αρχείο στον υπολογιστή-πελάτη ($_FILES["όνομα αρχείου"]["όνομα"]) δεν ισχύει εδώ.

Το τελευταίο μας παράδειγμα δέσμης ενεργειών που χειρίζεται τη φόρμα υποβολής αρχείου θα μοιάζει με αυτό:

Φόρμα μεταφόρτωσης αρχείου


"; ) else ( // Ελέγξτε εάν το αρχείο έχει μεταφορτωθεί if(is_uploaded_file($_FILES["filename"]["tmp_name"])) ( // Εάν το αρχείο μεταφορτωθεί με επιτυχία, μετακινήστε το // από τον προσωρινό κατάλογο στο το τελευταίο move_uploaded_file ($_FILES ["filename"]["tmp_name"], __DIR__ . DIRECTORY_SEPARATOR . $_FILES["filename"]["name"] (echo("Σφάλμα φόρτωσης αρχείου"); ) ? >

Περιορισμός μεγέθους αρχείου

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

1024*3*1024) ( echo ("Το μέγεθος αρχείου υπερβαίνει τα τρία megabyte"); έξοδος; ) ... ?>

Το μέγιστο μέγεθος αρχείου μεταφόρτωσης μπορεί επίσης να οριστεί χρησιμοποιώντας την οδηγία upload_max_filesize στο αρχείο php.ini. Η προεπιλεγμένη τιμή αυτής της οδηγίας είναι 2 MB:

$upload_max_filesize) ... ?>

Ρυθμίσεις PHP.ini για τη μεταφόρτωση αρχείων στον διακομιστή

Έτσι, μάθαμε για την οδηγία upload_max_filesize του αρχείου php.ini, η οποία ορίζει το μέγιστο μέγεθος του μεταφορτωμένου αρχείου. Ποιες άλλες οδηγίες στο αρχείο php.ini είναι υπεύθυνες για τη μεταφόρτωση αρχείων στον διακομιστή;

Παρεμπιπτόντως, εάν θέλετε να μάθετε πού βρίσκεται το αρχείο php.ini, εκτελέστε το σενάριο:

Έτσι, η λίστα των οδηγιών στο αρχείο php.ini:

  • file_uploads - η δυνατότητα να απαγορεύεται ή να επιτρέπεται η μεταφόρτωση αρχείων στο διακομιστή ως σύνολο, ενεργοποιημένη από προεπιλογή (τιμή On).
  • post_max_size - γενικό ανώτατο όριο για το μέγεθος των δεδομένων που μεταδίδονται σε ένα αίτημα POST. Εάν χρειάζεται να μεταφέρετε πολλά αρχεία ταυτόχρονα ή να εργαστείτε με μεγάλα αρχεία, αλλάξτε την τιμή αυτής της οδηγίας. Η προεπιλεγμένη τιμή είναι 8 MB.
  • upload_max_filesize είναι η οδηγία που έχουμε ήδη συζητήσει. Μην ξεχάσετε να αλλάξετε επίσης το post_max_size εάν είναι απαραίτητο.
  • upload_tmp_dir - προσωρινός κατάλογος στον διακομιστή όπου θα τοποθετηθούν όλα τα μεταφορτωμένα αρχεία.

Αυτό ήταν το μόνο που ήθελα να σας πω στο θέμα "Μεταφόρτωση αρχείων σε διακομιστή σε PHP".

Σχεδόν σε κάθε έργο, ο προγραμματιστής αντιμετωπίζει την ανάγκη να ανεβάσει αρχεία στον διακομιστή. Φωτογραφίες, εικόνες, έγγραφα, αρχεία και πολλά άλλα μπορούν να μεταφορτωθούν στον διακομιστή μέσω της διεπαφής ιστού (μέσω ενός προγράμματος περιήγησης).


Http://localhost/index.php?name=myname&page=10

ορίζει ένα αίτημα GET στη σελίδα index.php. Σε αυτήν την περίπτωση, στο σενάριο μεταβιβάζονται οι παράμετροι "όνομα" και "σελίδα" με τις τιμές "myname" και "10", αντίστοιχα. Όπως μπορείτε να δείτε, το αίτημα αποτελείται από ζεύγη "όνομα=τιμή", ενωμένα με "&". Το αίτημα διαχωρίζεται από τη διεύθυνση της σελίδας με ένα ερωτηματικό "?".

Αλλά το GET δεν είναι κατάλληλο για μεταφορά μεγάλων δεδομένων. Υπάρχει μια μέθοδος POST για αυτό. Αυτή η μέθοδος μεταφέρει δεδομένα που είναι κρυμμένα από τον χρήστη και η διεύθυνση της σελίδας παραμένει αμετάβλητη. Θεωρητικά, η μέθοδος POST σάς επιτρέπει να μεταφέρετε τεράστια μπλοκ δεδομένων, αλλά οι περισσότεροι πάροχοι θέτουν ένα σκληρό όριο 5-10 megabyte.

Για την υλοποίηση της λήψης αρχείων, είναι απαραίτητο να παρέχετε στον χρήστη την κατάλληλη φόρμα. Η ετικέτα εισαγωγής αρχείου χρησιμοποιείται για τη μεταφόρτωση αρχείων.

Επιλέξτε αρχείο για λήψη:

Ο χρήστης επιλέγει απαιτούμενο αρχείο, κάνει κλικ στο κουμπί "Υποβολή!", μετά το οποίο το πρόγραμμα περιήγησης μεταφέρει το καθορισμένο αρχείο στον διακομιστή. Μόλις γίνει λήψη του αρχείου, εκκινείται το receiver.php και όλα τα δεδομένα που υποβάλλονται στη φόρμα γίνονται αυτόματα διαθέσιμα σε αυτό.

Η λίστα των ληφθέντων αρχείων αποθηκεύεται στον καθολικό πίνακα $_FILES. Αυτό συσχετικός πίνακας, όπου κάθε στοιχείο περιέχει μια περιγραφή ενός από τα αρχεία. Ας δούμε ένα παράδειγμα:

3145728) ( $filesize = ($filesize != 0)? sprintf("(%.2f MB)" , $filesize / 1024): ""; die("Σφάλμα: Το μέγεθος του συνημμένου αρχείου ". $filesize. " είναι πολύ μεγάλο (3 MB)." ) else ($filename = $_FILES["file"]["name"]; $filepath = $_FILES["file"]["tmp_name"]; $filetype = $_FILES[" file"]["type"] if($this->filetype == null || $this->filetype == "") $this->filetype = "άγνωστο/άγνωστο" ) ) echo "Το αρχείο φορτώθηκε με επιτυχία: ". $filename; ?>

Όλα τα ληφθέντα αρχεία αποθηκεύονται από τον διακομιστή σε έναν προσωρινό κατάλογο και διαγράφονται αυτόματα μετά την ολοκλήρωση του σεναρίου. Εάν πρέπει να αποθηκεύσετε ένα αρχείο στον διακομιστή, πρέπει να το μετακινήσετε σε έναν από τους καταλόγους του ιστότοπου. Υπάρχει μια ειδική λειτουργία για αυτό. move_uploaded_file(). Συνήθως χρησιμοποιείται σε συνδυασμό με τη συνάρτηση is_uploaded_file(), το οποίο σας επιτρέπει να προσδιορίσετε εάν το αρχείο μεταφορτώθηκε μέσω της φόρμας. Για παράδειγμα:

Οι πληροφορίες για κάθε ληφθέν αρχείο αντιπροσωπεύονται στο σενάριο ως στοιχεία του πίνακα $_FILES. Το όνομα του στοιχείου καθορίζεται από το χαρακτηριστικό name της ετικέτας φόρμας. Στην περίπτωσή μας, το χαρακτηριστικό name είναι ίσο με "ufile", που σημαίνει ότι τα δεδομένα σχετικά με αυτό το αρχείο θα αποθηκευτούν στο στοιχείο $_FILES["ufile"].

Κάθε στοιχείο $_FILES είναι επίσης ένας πίνακας που περιέχει πέντε στοιχεία με σταθερά ονόματα:

Το μέγεθος των ληφθέντων αρχείων μπορεί να διαφέρει σημαντικά από πάροχο σε πάροχο. Ορισμένοι διαχειριστές απαγορεύουν εντελώς τη μεταφόρτωση αρχείων. Σε αυτήν την περίπτωση, το αρχείο μπορεί ακόμα να ληφθεί, ο διακομιστής θα το διαγράψει και θα ενημερώσει το σενάριο ότι το αρχείο ήταν εκεί, αλλά έχει ήδη διαγραφεί.

Στο άρθρο μας θα δούμε ένα παράδειγμα δημιουργίας ενός σεναρίου PHP για τη μεταφόρτωση αρχείων στον διακομιστή. Το απλό παράδειγμα αποστολής αρχείων μας θα έχει 2 αρχεία: μια φόρμα (form.html), ένα σενάριο μεταφόρτωσης αρχείου php (uploader.php).

Τώρα ας δούμε τα πάντα λεπτομερώς. Αρχικά, ας αναλύσουμε το αρχείο φόρμας form.html:


Όπως μπορείτε να δείτε είναι απλό κώδικας html, δεν υπάρχει τίποτα περίπλοκο εδώ, το μόνο πράγμα είναι ότι εάν η φόρμα θα ανεβάσει αρχεία στον διακομιστή, τότε πρέπει να καθοριστεί το χαρακτηριστικό enctype="πολυμερών/μορφή-δεδομένα".

Η φόρμα μας θα μοιάζει με αυτό:

ΠαράδειγμαΣενάριο μεταφόρτωσης αρχείου PHP

Τώρα ας δούμε το αρχείο php που θα ανεβάσει αρχεία στον διακομιστή. Παρακάτω είναι το δικό του πηγαίος κώδικας:

// Πού πρόκειται να τοποθετηθεί το αρχείο $target_path = 'uploaded_files/; /* Προσθέστε το αρχικό όνομα αρχείου στη διαδρομή στόχου μας. Το αποτέλεσμα είναι "uploaded_files/filename.extension" */ $target_path = $target_path . basename($_FILES ["αρχείο"]["όνομα"]); "όνομα"] " έχει μεταφορτωθεί" ) else( echo "Υπήρξε σφάλμα κατά τη μεταφόρτωση του αρχείου, δοκιμάστε ξανά!")

Πώς λειτουργεί το σενάριο μεταφόρτωσης αρχείου PHP;

uploader.php είναι απλή php script για τη μεταφόρτωση αρχείων στον διακομιστή, ο οποίος θα ανεβάσει τα αρχεία μας σε έναν συγκεκριμένο κατάλογο στον ιστότοπο, ο οποίος υποδεικνύεται από τη γραμμή $target_path = "uploaded_files/";

Λοιπόν, φυσικά, κάνουμε μια βασική έξοδο μηνυμάτων χρησιμοποιώντας το if/else, ώστε να είναι ξεκάθαρο αν το αρχείο μας είναι φορτωμένο ή όχι.

Προστασία από χάκερ κατά τη λήψη ενός αρχείου

Θα εξετάσουμε όχι μόνο την προστασία από πλευράς hacking, αλλά και άλλα ανεπιθύμητα προβλήματα που προκύπτουν κατά τη μεταφόρτωση αρχείων στον διακομιστή.

Περιτύλιγμα αρχείων PHP

Αυτό είναι το πρώτο πρόβλημα που σχετίζεται με τη μεταφόρτωση αρχείων στον διακομιστή. Όταν το ληφθέν αρχείο έχει περιτύλιγμα php, δεν σημαίνει ότι η επέκτασή του θα είναι php. Μπορεί να μοιάζει με image.jpg (.gif, .png…). Αλλά μέσα μοιάζει με αυτό:

Ορισμένοι τεχνίτες μπορούν επίσης να εκτελέσουν εντολές στον διακομιστή περιηγώντας το url:

$ curl http://server/uploads/shell.php?command=any_unix_command

Μέθοδος προστασίας:

Για προστασία, μπορείτε να εφαρμόσετε τον έλεγχο αρχείων MIME. Δείτε παρακάτω για παράδειγμα:

If($_FILES["file"]["type"] != "image/gif") ( echo "Λυπούμαστε, επιτρέπουμε μόνο τη μεταφόρτωση εικόνων GIF"; έξοδος; )

Αυτό το κομμάτι κώδικα phpελέγχει αν το bootable Αρχείο GIFαρχείο. Επικολλήστε αυτόν τον κώδικα πριν από το σενάριο μεταφόρτωσης του αρχείου php. Φυσικά, μπορείτε να αλλάξετε τον έλεγχο σε jpg, png ή άλλα αρχεία που χρειάζεστε.

Στην πραγματικότητα, αυτή η μέθοδος προστασίας μπορεί να παρακαμφθεί εάν στείλετε την κεφαλίδα με οδηγίες MIME. Για να γίνει αυτό, είναι απαραίτητο να ελέγξετε τη διαθεσιμότηταετικέτες στο ληφθέν αρχείο.

Όριο μεγέθους αρχείου μεταφόρτωσης

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

Μπορείτε να το κάνετε αυτό χρησιμοποιώντας μια φόρμα για να το κάνετε αυτό, πρέπει να προσθέσετε την ακόλουθη γραμμή στο περιβάλλον html της φόρμας:

Αυτό το κρυφό πεδίο εισαγωγής θα περιορίσει το μέγεθος του μεταφορτωμένου αρχείου. Ή μπορείτε να ελέγξετε το μέγεθος του αρχείου χρησιμοποιώντας PHP.

Γράψτε γιαΤο σενάριο php για τη μεταφόρτωση αρχείων μπορεί να διαρκέσει πολύ, αλλά έχουμε ήδη συζητήσει τη βασική αρχή της αποστολής αρχείων στον διακομιστή. Έτσι, αν κάποιος έχει περισσότερες ερωτήσεις, ρωτήστε τον στα σχόλια.


Σε τι μπορεί να επισυνάπτονται οι φωτογραφίες σε ένα διαδικτυακό άλμπουμ φωτογραφιών e-mailή αρχεία που υποβάλλονται σε μια ηλεκτρονική εφαρμογή επεξεργασίας παρτίδων; Όλα αυτά πρέπει να μεταφορτωθούν στον διακομιστή μέσω Διαδικτύου από πρόγραμμα περιήγησης ιστού. Πράγματι, η μεταφόρτωση αρχείων είναι ένα σημαντικό χαρακτηριστικό πολλών από τους ιστότοπους και τις εφαρμογές Ιστού που χρησιμοποιούμε σε καθημερινή βάση. Σε αυτό το άρθρο θα μάθετε πώς να προσθέτετε υποστήριξη αποστολής αρχείων στον ιστότοπό σας χρησιμοποιώντας PHP.

Απαιτήσεις πριν από τη μεταφόρτωση αρχείων

Η επεξεργασία των ληφθέντων αρχείων είναι μια τυπική διαδικασία, αλλά υπάρχουν μερικά μικρά πράγματα που πρέπει να προσέξετε πριν ξεκινήσετε. Το πρώτο πράγμα που πρέπει να βεβαιωθείτε είναι ότι η PHP έχει ρυθμιστεί και σας επιτρέπει να ανεβάσετε αρχεία. Για να το κάνετε αυτό, θα πρέπει να ελέγξετε την οδηγία file_uploads στο php.ini και αν είναι απενεργοποιημένη, τότε να την ενεργοποιήσετε.

File_uploads = On

Τα μεταφορτωμένα αρχεία αποθηκεύονται πρώτα σε έναν προσωρινό κατάλογο (αλλά μην ανησυχείτε... το σενάριο PHP μπορεί αργότερα να μετακινήσει τα αρχεία σε μια πιο κατάλληλη τοποθεσία). Η τοποθεσία προέλευσης είναι ο προεπιλεγμένος προσωρινός κατάλογος του συστήματος. Μπορείτε να καθορίσετε έναν διαφορετικό κατάλογο χρησιμοποιώντας την οδηγία upload_tmp_dir στο php.ini. Ανεξάρτητα από αυτό, είναι καλή ιδέα να ελέγξετε ότι η διαδικασία PHP έχει τα σωστά δικαιώματα εγγραφής ανάλογα με τον κατάλογο που χρησιμοποιείται.

Upload_tmp_dir = "/tmp" tboronczyk@zarkov:~$ ls -l / | grep tmp drwxrwxrwt 13 root root 40960 2011-08-31 00:50 tmp

Αφού είστε βέβαιοι ότι η διαμόρφωση επιτρέπει στον διακομιστή να δέχεται αρχεία που έχουν μεταφορτωθεί, μπορείτε να εστιάσετε στις λεπτομέρειες και να προσθέσετε τη φόρμα HTML. Είναι εξαιρετικά σημαντικό το στοιχείο σας

χρησιμοποίησε τη μέθοδο POST και είχε το χαρακτηριστικό enctype ορίστηκε σε multipart/form-data .

Στάδια φόρτωσης αρχείου στον διακομιστή

Πιθανότατα, μπορείτε ήδη να φανταστείτε πώς ανεβαίνουν τα αρχεία στον διακομιστή, με βάση τη δική σας εμπειρία και τις απαιτήσεις που ανέφερα παραπάνω.

  • Ο επισκέπτης προβάλλει μια σελίδα HTML με μια φόρμα ειδικά γραμμένη για να υποστηρίζει τις μεταφορτώσεις αρχείων.
  • Στη συνέχεια, παρέχει το αρχείο που θέλει να κατεβάσει και κάνει κλικ στο κουμπί υποβολής.
  • Το πρόγραμμα περιήγησης κωδικοποιεί το αρχείο και το στέλνει ως μέρος του αιτήματος POST.
  • Η PHP λαμβάνει τη φόρμα υποβολής, αποκωδικοποιεί το αρχείο και το αποθηκεύει σε μια προσωρινή θέση στον διακομιστή.
  • Το γραπτό σενάριο PHP που είναι υπεύθυνο για την επεξεργασία του μηνύματος της φόρμας επιθεωρεί το αρχείο και το επεξεργάζεται με κάποιο τρόπο, μετακινώντας το συχνά από την προσωρινή του θέση σε μια μόνιμη θέση όπου θα αποθηκευτεί το αρχείο.

Για να προσθέσετε υποστήριξη αποστολής αρχείων, πρέπει να δημιουργήσετε μια φόρμα HTML που θα παρουσιαστεί στον χρήστη και ένα σενάριο PHP που θα φροντίζει το αρχείο που έχει μεταφορτωθεί στον διακομιστή.

Προσθήκη φόρμας HTML για τη μεταφόρτωση ενός αρχείου

Οι φόρμες HTML παρέχουν μια διεπαφή μέσω της οποίας ο χρήστης ξεκινά μια μεταφόρτωση αρχείου. Πρέπει να θυμόμαστε ότι το στοιχείο πρέπει να έχει οριστεί το χαρακτηριστικό της μεθόδου για δημοσίευση και το χαρακτηριστικό enctype να έχει οριστεί σε multipart/form-data . Στοιχείο Το αρχείο παρέχει ένα πεδίο που χρησιμοποιείται για τον καθορισμό του αρχείου που θα φορτωθεί. Όπως κάθε άλλο στοιχείο φόρμας, είναι σημαντικό να παρέχετε ένα χαρακτηριστικό όνομα ώστε να μπορείτε να το αναφέρετε Σενάριο PHPε, επεξεργασία της φόρμας.

Δείτε πώς μοιάζει μια τυπική διάταξη φόρμας μεταφόρτωσης αρχείου:


Αξίζει να σημειωθεί ότι διαφορετικά προγράμματα περιήγησηςθα αποδώσει το πεδίο μεταφόρτωσης αρχείου διαφορετικά. Τα IE, Firefox και Opera το εμφανίζουν ως πλαίσιο κειμένου με ένα κουμπί δίπλα που λέει "Αναζήτηση" ή "Επιλογή". Το Safari το εμφανίζει ακριβώς όπως ένα κουμπί που λέει "Επιλογή αρχείου". Σε γενικές γραμμές, αυτό δεν είναι πρόβλημα, καθώς οι χρήστες έχουν συνηθίσει τον τρόπο που εμφανίζεται το πεδίο στο πρόγραμμα περιήγησής τους και ξέρουν πώς να το χρησιμοποιούν. Μερικές φορές, ωστόσο, θα συναντήσετε έναν πελάτη ή σχεδιαστή που είναι ανένδοτος να το παρουσιάσει με συγκεκριμένο τρόπο. Η ποσότητα CSS και JavaScript που μπορεί να εφαρμοστεί σε ένα πεδίο αρχείου είναι εξαιρετικά περιορισμένη λόγω παραμέτρων ασφαλείας που επιβάλλονται από τα προγράμματα περιήγησης. Η πληκτρολόγηση ενός αρχείου μπορεί να είναι δύσκολη. Αν εμφάνισηπολύ σημαντικό για εσάς, σας συνιστώ να διαβάσετε ένα από τα άρθρα Είσοδος "Peter-Paul Koch" type="file".

Μεταβείτε στον διακομιστή και δουλέψτε με την PHP

Οι πληροφορίες λήψης αρχείων παρέχονται χρησιμοποιώντας πολυδιάστατος πίνακας$_FILES. Αυτός ο πίνακας έχει τη δική του δομή, εκχωρημένα ονόματα για τα πεδία αρχείων στη φόρμα HTML, όπως ακριβώς όταν εργάζεστε με $_GET και $_POST. Στη συνέχεια, ο πίνακας κάθε αρχείου περιέχει τα ακόλουθα στοιχεία:

  • $_FILES["myFile"]["name"] - αποθηκεύει το αρχικό όνομα αρχείου.
  • $_FILES["myFile"]["type"] - αποθηκεύει τον τύπο mime του αρχείου.
  • $_FILES["myFile"]["size"] - αποθηκεύει το μέγεθος του αρχείου (σε byte);
  • $_FILES["myFile"]["tmp_name"] - αποθηκεύει το όνομα του προσωρινού αρχείου.
  • $_FILES["myFile"]["error"] - αποθηκεύει τον κωδικό σφάλματος που ελήφθη ως αποτέλεσμα της μεταφοράς.

Χρησιμοποιώντας τη συνάρτηση move_uploaded_file(), μπορούμε να μετακινήσουμε ένα αρχείο από τον προσωρινό του κατάλογο σε μια μόνιμη θέση. Είναι επίσης καλή πρακτική να το χρησιμοποιείτε αντί για copy() και rename() για αυτόν τον σκοπό, καθώς εκτελεί πρόσθετους ελέγχους για να διασφαλίσει ότι το αρχείο λήφθηκε πράγματι από ένα αίτημα HTTP POST.

Εάν πρόκειται να αποθηκεύσετε το αρχείο με το αρχικό όνομα που παρέχεται από τον χρήστη, συνιστάται να βεβαιωθείτε ότι είναι ασφαλές να το κάνετε. Το όνομα του αρχείου δεν πρέπει να περιέχει χαρακτήρες που ενδέχεται να επηρεάσουν τη διαδρομή προορισμού, όπως κάθετες προς τα εμπρός. Το όνομα αρχείου πρέπει να είναι μοναδικό για να αποφευχθεί η αντικατάσταση υπαρχόντων με το ίδιο όνομα (εάν η αίτησή σας δεν παρέχει αυτό). Μπορείτε να το διασφαλίσετε αντικαθιστώντας τυχόν χαρακτήρες με μια υπογράμμιση, η οποία δεν είναι γράμμα, και στη συνέχεια προσθέτοντας έναν αυξανόμενο αριθμό εάν υπάρχει ήδη ένα αρχείο με αυτό το όνομα.

Έτσι φαίνεται η λήψη και η επεξεργασία ενός αρχείου λήψης χρησιμοποιώντας PHP:

Define("UPLOAD_DIR", "/srv/www/uploads/"); if (!empty($_FILES["myFile"])) ( $myFile = $_FILES["myFile"]; if ($myFile["error"] !== UPLOAD_ERR_OK) ( echo "

Παρουσιάστηκε σφάλμα.

"; έξοδος; ) // εξασφαλίστε ένα ασφαλές όνομα αρχείου $name = preg_replace("/[^A-Z0-9._-]/i", "_", $myFile["name"]); // κάντε Δεν γίνεται αντικατάσταση του υπάρχοντος αρχείου $i = 0 $parts = pathinfo($name while (file_exists(UPLOAD_DIR . $name)) ($i++; $name = $parts["filename"] . ". $parts["επέκταση"] // αποθήκευση του αρχείου από τον προσωρινό κατάλογο $success = move_uploaded_file($myFile["tmp_name"], UPLOAD_DIR . $name); "; έξοδος; ) // ορίστε τα σωστά δικαιώματα για το νέο αρχείο chmod(UPLOAD_DIR. $name, 0644)

Πρώτα βεβαιωνόμαστε ότι η μεταφόρτωση του αρχείου PHP στον διακομιστή έγινε χωρίς σφάλματα. Στη συνέχεια ορίζουμε ένα ασφαλές όνομα αρχείου όπως μόλις περιέγραψα παραπάνω και μετά μετακινούμε το αρχείο στον κατάλογο προορισμού του χρησιμοποιώντας την move_uploaded_file() . Τέλος, καλούμε την chmod() για να διασφαλίσουμε ότι το νέο αρχείο έχει τα απαραίτητα δικαιώματα.

Θέματα Ασφάλειας

Το ένα είναι να ελέγξετε τον τύπο του αρχείου που μεταφορτώνεται, ποιος πρέπει να είναι. Το να βασίζεσαι στην τιμή του $_FILES["myFile"]["type"] ή στην επέκταση ονόματος αρχείου δεν είναι ασφαλές, καθώς και τα δύο μπορούν εύκολα να πλαστογραφηθούν. Αντίθετα, χρησιμοποιήστε τη συνάρτηση exif_imagetype() για να ελέγξετε τα περιεχόμενα του αρχείου και να προσδιορίσετε εάν είναι πραγματικά GIF, JPEG ή μία από πολλές άλλες υποστηριζόμενες μορφές εικόνας. Εάν η exif_imagetype() δεν είναι διαθέσιμη (η συνάρτηση απαιτεί την ενεργοποίηση της επέκτασης Exif), μπορείτε να χρησιμοποιήσετε την getimagesize() . Ο πίνακας που επιστρέφεται σε αυτήν θα περιέχει τον τύπο εικόνας, εάν κάποιος αναγνωρίζεται.

// ελέγξτε το αρχείο GIF, JPEG ή PNG $fileType = exif_imagetype($_FILES["myFile"]["tmp_name"]); $επιτρέπεται = πίνακας(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG); if (!in_array($fileType, $επιτρέπεται)) ( // ο τύπος αρχείου δεν επιτρέπεται...

Για αρχεία χωρίς εικόνα, μπορείτε να χρησιμοποιήσετε την exec() για να καλέσετε το βοηθητικό πρόγραμμα αρχείων unix. καθορίζει τον τύπο αρχείου αναζητώντας γνωστές δυαδικές υπογραφές σε αναμενόμενες τοποθεσίες.

// ελέγξτε το αρχείο PDF $mime = "application/pdf; charset=binary"; exec("file -bi " . $_FILES["myFile"]["tmp_name"], $out); εάν ($out != $mime) ( // το αρχείο δεν είναι PDF ...

Ένα άλλο βήμα που μπορείτε να κάνετε είναι να θέσετε αυστηρούς περιορισμούς στο συνολικό μέγεθος του αιτήματος POST και στον αριθμό των αρχείων που μπορούν να μεταφορτωθούν. Για να το κάνετε αυτό, καθορίστε την κατάλληλη τιμή για τις οδηγίες upload_max_size , post_max_size και max_file_uploads στο php.ini. Η οδηγία upload_max_size καθορίζει το μέγιστο μέγεθος μεταφόρτωσης αρχείου. Εκτός από το μέγεθος μεταφόρτωσης, μπορείτε να περιορίσετε το μέγεθος ολόκληρου του αιτήματος POST με την οδηγία post_max_size. Το max_file_uploads είναι μια νέα οδηγία (που προστέθηκε στην έκδοση 5.2.12) που περιορίζει τον αριθμό των μεταφορτώσεων αρχείων. Αυτές οι τρεις οδηγίες βοηθούν στην προστασία του ιστότοπού σας από επιθέσεις που προσπαθούν να διαταράξουν τη διαθεσιμότητά του προκαλώντας έντονες κυκλοφορίας δικτύουή εκκίνηση συστήματος.

Post_max_size = 8M upload_max_size = 2M max_file_uploads = 20

Το τρίτο βήμα που μπορείτε να κάνετε για να ελαχιστοποιήσετε τον κίνδυνο είναι να σαρώσετε τα ληφθέντα αρχεία σας με έναν σαρωτή ιών. Αυτό είναι ζωτικής σημασίας για την προστασία από κοινούς ιούς και κακόβουλο λογισμικό, ειδικά εάν ο ιστότοπός σας ανταλλάσσει αρχεία μεταξύ διαφορετικών ατόμων, όπως συνημμένα σε ένα πρόγραμμα-πελάτη ηλεκτρονικού ταχυδρομείου ιστού ή σε έναν (νόμιμο) ιστότοπο κοινής χρήσης αρχείων. Υπάρχει επέκταση PHPπου παρέχει πρόσβαση στο ClamAV, αλλά φυσικά μπορείτε να καλέσετε το βοηθητικό πρόγραμμα γραμμή εντολών ClamAV όπως ακριβώς έδειξα για το αρχείο.

Exec("clamscan --stdout " . $_FILES["myFile"]["tmp_name"], $out, $return); εάν το αρχείο ($return) ( // έχει μολυνθεί...

Σύνοψη και εξαγωγή συμπερασμάτων

Σήμερα μάθατε πώς να διαμορφώνετε και να εφαρμόζετε τη διαδικασία PHP για τη μεταφόρτωση αρχείων στον διακομιστή από τον ιστότοπο ή την εφαρμογή Ιστού σας. Για να είναι επιτυχής η λήψη, Φόρμα HTMLπρέπει να αποστέλλεται μέσω αιτήματος POST με πολλαπλή μορφοποίηση δεδομένων και η PHP πρέπει να επιτρέπει τη μεταφόρτωση όπως καθορίζεται χρησιμοποιώντας την οδηγία file_uploads. Μετά τη μεταφορά του αρχείου, το σενάριο που είναι υπεύθυνο για την επεξεργασία της μεταφόρτωσης χρησιμοποιεί τις πληροφορίες που βρίσκονται στον πίνακα $_FILES για να μετακινήσει το αρχείο από τον προσωρινό κατάλογο στην επιθυμητή θέση. Έχω επίσης κοινοποιήσει ορισμένες πρόσθετες προφυλάξεις που μπορείτε να λάβετε για να προστατεύσετε τον εαυτό σας και τους χρήστες σας από ορισμένους από τους κινδύνους που σχετίζονται με τη δυνατότητα λήψης αρχείων. Για να διασφαλίσετε την ασφάλειά σας, ελέγξτε τον τύπο του αρχείου, επιβάλετε αυστηρούς περιορισμούς στη φόρτωση της κυκλοφορίας και χρησιμοποιήστε σάρωση ιών.

Για όσους μπορεί να ενδιαφέρονται, πρόσθετος κωδικόςγια αυτό το άρθρο είναι διαθέσιμο στο GitHub. Μπορείτε να περιηγηθείτε, να κατεβάσετε ή να κλωνοποιήσετε το αποθετήριο και να παίξετε με τον κώδικα για να κατανοήσετε καλύτερα πώς λειτουργεί η διαδικασία μεταφόρτωσης αρχείων.

Πολυμερείς φόρμες

  • Διασυνδέσεις Ιστού ταχυδρομικές υπηρεσίες, που σας επιτρέπουν να προσθέσετε ένα συνημμένο (επισύναψη) σε ένα γράμμα και για να το κάνετε αυτό πρέπει πρώτα να ανεβάσετε το αρχείο στον διακομιστή και μόνο μετά από αυτό μπορεί να προστεθεί στο γράμμα.
  • Διαδραστικές γκαλερί φωτογραφιών και άλμπουμ φωτογραφιών που δεν μπορούν να υπάρχουν χωρίς μηχανισμό για τη μεταφόρτωση αρχείων στον διακομιστή.
  • Πύλες ελεύθερου λογισμικού που χρησιμοποιούνται για την ανταλλαγή αρχείων διαφόρων προγραμμάτων κ.λπ.

Η μεταφόρτωση ενός αρχείου στον διακομιστή πραγματοποιείται χρησιμοποιώντας μια φόρμα πολλαπλών τμημάτων, η οποία έχει ένα πεδίο αποστολής αρχείου. Η παράμετρος enctype έχει οριστεί σε multipart/form-data:



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

Οι πολυμερείς φόρμες χρησιμοποιούν συνήθως τη μέθοδο υποβολής POST. Όπως φαίνεται από το προηγούμενο παράδειγμα, αυτή τη μορφήέχει δύο πεδία:

  • Πεδίο επιλογής αρχείου για μεταφόρτωση ;
  • Πεδίο για τον καθορισμό του ονόματος αρχείου που θα έχει στον διακομιστή .

Επεξεργασία πολυμερών εντύπων

Πριν ξεκινήσετε τη σύνταξη ενός σεναρίου για την επεξεργασία μιας φόρμας πολλαπλών τμημάτων, πρέπει να επεξεργαστείτε το αρχείο διαμόρφωσης php.iniγια να επιτρέπεται η αποστολή αρχείων στον διακομιστή.

Διαμόρφωση αρχείο PHPΤο php.ini έχει τρεις παραμέτρους που σχετίζονται με τη μεταφόρτωση αρχείων στον διακομιστή:

  • file_uploads=Ενεργό - επιτρέπει τη μεταφόρτωση αρχείων στον διακομιστή μέσω HTTP.
  • upload_tmp_dir=/tmp - ορίζει τον κατάλογο για την προσωρινή αποθήκευση των μεταφορτωμένων αρχείων.
  • upload_max_filesize=2M - ορίζει το μέγιστο μέγεθος των μεταφορτωμένων αρχείων.

Εάν ο διακομιστής ιστού σας λειτουργεί με λειτουργικό σύστημα Συστήματα Linux, τότε πρέπει να επανεκκινήσετε την υπηρεσία:

επανεκκίνηση της υπηρεσίας httpd

Πώς χειρίζεται η PHP φόρμες πολλαπλών τμημάτων; Μόλις λάβει το αρχείο, το αποθηκεύει σε έναν προσωρινό κατάλογο που ονομάζεται upload_tmp_dir , με το όνομα αρχείου να επιλέγεται τυχαία. Στη συνέχεια δημιουργεί τέσσερις μεταβλητές υπερσφαιρικού πίνακα $_FILES . Αυτός ο πίνακας περιέχει πληροφορίες σχετικά με το ληφθέν αρχείο.

Οι μεταβλητές που ορίζονται για τα μεταφορτωμένα αρχεία εξαρτώνται από την έκδοση PHP και την τρέχουσα διαμόρφωση. Ο υπερσφαιρικός πίνακας $_FILES είναι διαθέσιμος από την PHP 4.1.0. Σε περίπτωση που η οδηγία ρύθμισης παραμέτρων register_globals έχει οριστεί σε επί, επιπλέον θα δηλωθούν μεταβλητές με κατάλληλα ονόματα. Από την έκδοση 4.2.0, η προεπιλεγμένη τιμή για την επιλογή register_globals είναι μακριά από.

Τα περιεχόμενα του πίνακα $_FILES για το παράδειγμά μας φαίνονται παρακάτω. Σημειώστε ότι αυτό προϋποθέτει ότι το όνομα uploadfile χρησιμοποιείται για το πεδίο επιλογής αρχείου, σύμφωνα με την παραπάνω φόρμα πολλαπλών τμημάτων. Φυσικά, το όνομα πεδίου μπορεί να είναι οτιδήποτε.

  • $_FILES["uploadfile"]["name"] - το όνομα του αρχείου πριν σταλεί στον διακομιστή, για παράδειγμα, pict.gif;
  • $_FILES["uploadfile"]["size"] - μέγεθος του ληφθέντος αρχείου σε byte.
  • $_FILES["uploadfile"]["type"] - τύπος MIME του ληφθέντος αρχείου (εάν το πρόγραμμα περιήγησης μπόρεσε να το εντοπίσει), για παράδειγμα: image/gif, image/png, image/jpeg, text/html;
  • (αυτό ονομάσαμε πεδίο αποστολής αρχείου) - περιέχει το όνομα του αρχείου στον προσωρινό κατάλογο, για παράδειγμα: /tmp/phpV3b3qY;
  • $_FILES["uploadfile"]["σφάλμα"] -Κωδικός σφάλματος που μπορεί να προκύψει κατά τη λήψη ενός αρχείου. Κλειδί ["σφάλμα"]προστέθηκε στην PHP 4.2.0. Μπορείτε να δείτε τους αντίστοιχους κωδικούς σφαλμάτων

Αφού ολοκληρωθεί το σενάριο, το προσωρινό αρχείο θα διαγραφεί. Αυτό σημαίνει ότι πρέπει να το αντιγράψουμε σε άλλη θέση πριν ολοκληρωθεί το σενάριο. Δηλαδή, ο αλγόριθμος για το σενάριο για να ανεβάσει ένα αρχείο στον διακομιστή είναι ο εξής:

Εάν πατηθεί το κουμπί "Υποβολή", το αρχείο θα μεταφορτωθεί ήδη στον διακομιστή και το όνομά του θα βρίσκεται στη μεταβλητή $_FILES["uploadfile"]["name"]. Σε αυτήν την περίπτωση, το σενάριο θα πρέπει να αντιγράψει αμέσως ένα αρχείο με όνομα $_FILES["uploadfile"]["tmp_name"]σε κάποιον κατάλογο (απαιτούνται δικαιώματα εγγραφής σε αυτόν τον κατάλογο).

Το αρχείο αντιγράφεται χρησιμοποιώντας τη συνάρτηση αντίγραφο() :

Χρησιμοποιήστε μόνο τη συνάρτηση copy() και όχι τη συνάρτηση μετακίνησης, γιατί:

  • Το προσωρινό αρχείο θα διαγραφεί αυτόματα.
  • Εάν ο προσωρινός κατάλογος βρίσκεται σε άλλα μέσα, θα εμφανιστεί ένα μήνυμα σφάλματος.

Ας υποθέσουμε ότι πρέπει να ανεβάσουμε ένα αρχείο στον κατάλογο μεταφορτώσεων, ο οποίος βρίσκεται στον ριζικό κατάλογο του διακομιστή web (στον κατάλογο DocumentRoot).

// Ας δημιουργήσουμε έναν κατάλογο για κάθε ενδεχόμενο. Εάν έχει ήδη δημιουργηθεί,
// δεν θα δούμε μήνυμα σφάλματος επειδή θα χρησιμοποιήσουμε τον τελεστή @:

@mkdir("μεταφορτώσεις", 0777);

// Αντιγράψτε το αρχείο από το /tmp στις μεταφορτώσεις
// Το όνομα του αρχείου θα είναι το ίδιο όπως πριν από την αποστολή στον διακομιστή:

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

Στο Linux, όλα είναι πολύ πιο περίπλοκα - πρέπει να λάβουμε υπόψη τα δικαιώματα του καταλόγου μεταφορτώσεων. Πιθανότατα σε αυτή την περίπτωση, η συνάρτηση mkdir()δεν θα λειτουργήσει επειδή δεν έχουμε άδεια εγγραφής στον κατάλογο DocumentRoot (συνήθως /var/www/html ή /home/httpd/html). Συνδεθείτε ως root, δημιουργήστε έναν κατάλογο μεταφορτώσεων και αλλάξτε τον κάτοχο και τα δικαιώματα ως εξής:

// Δημιουργήστε τον κατάλογο μεταφορτώσεων

// Ορίστε το όνομα κατόχου του apache και την ομάδα του - επίσης apache:

Chown apache: μεταφορτώσεις apache

// Να επιτρέπεται σε όλους να γράφουν (777) + να ορίζουν το κολλώδες bit (1):

Μεταφορτώσεις Chmod 1777

Το μέγεθος του αρχείου μπορεί να περιοριστεί εάν το επιθυμείτε, μπορείτε να επεξεργαστείτε το αρχείο .htaccess και να περιορίσετε την πρόσβαση στον κατάλογο μεταφορτώσεων - καθορίστε είτε συγκεκριμένους χρήστες που έχουν πρόσβαση στον κατάλογο είτε διευθύνσεις IP.

Τώρα μπορείτε να ανεβάσετε αρχεία στον διακομιστή.

Σύνταξη σεναρίου PHP για τη μεταφόρτωση αρχείων στον διακομιστή


// Κατάλογος όπου θα λάβουμε το αρχείο:
$uploaddir = "./files/" ;
$uploadfile = $uploaddir . όνομα βάσης($_FILES["uploadfile"]["name"]);

// Αντιγράψτε το αρχείο από τον κατάλογο για προσωρινή αποθήκευση αρχείων:
if (αντιγραφή ($ _FILES [ "uploadfile" ][ "tmp_name" ], $uploadfile ))
{
ηχώ "

Το αρχείο μεταφορτώθηκε με επιτυχία στον διακομιστή

" ;
}
άλλο (ηχώ "

Σφάλμα! Απέτυχε η μεταφόρτωση του αρχείου στον διακομιστή!

"
;

έξοδος ; )
ηχώ "

// Εμφάνιση πληροφοριών σχετικά με το ληφθέν αρχείο:

"
;
ηχώ "

Πληροφορίες σχετικά με το αρχείο που μεταφορτώθηκε στον διακομιστή:Αρχικό όνομα του μεταφορτωμένου αρχείου: "

" ;
ηχώ "

.$ _FILES [ "uploadfile" ][ "name" ]. "Τύπος mime του μεταφορτωμένου αρχείου: "

" ;
ηχώ "

.$ _FILES [ "uploadfile" ][ "type" ]. "Μέγεθος αρχείου μεταφόρτωσης σε byte: "

" ;
ηχώ "

.$ _FILES [ "uploadfile" ][ "size" ]. "Προσωρινό όνομα αρχείου: "

" ;

?>

.$ _FILES [ "uploadfile" ][ "tmp_name" ]. "

Η φόρτωση πολλών αρχείων μπορεί να υλοποιηθεί χρησιμοποιώντας, για παράδειγμα, διαφορετικές τιμές ονόματος για την ετικέτα εισόδου.


Είναι επίσης δυνατή η αυτόματη λήψη πληροφοριών οργανωμένων σε μια συστοιχία σχετικά με πολλά αρχεία που έχουν ληφθεί ταυτόχρονα. Για να εφαρμόσετε αυτήν τη δυνατότητα, χρησιμοποιήστε την ίδια σύνταξη για την υποβολή ενός πίνακα από μια φόρμα HTML όπως για τα πεδία πολλαπλής επιλογής και πλαισίου ελέγχου:






Αποστολή αρχείων Εάν υποβλήθηκε μια τέτοια φόρμα, οι πίνακες $_FILES["userfile"] , $_FILES["userfile"]["name"] και $_FILES["userfile"]["size"] θα αρχικοποιηθούν (στο ίδιο τρόπο , όπως $HTTP_POST_FILES για PHP 4.1.0 και νεότερη έκδοσηπροηγούμενες εκδόσεις

). Εάν η οδηγία ρύθμισης παραμέτρων register_globals έχει οριστεί σε , οι συνοδευτικές καθολικές μεταβλητές θα αρχικοποιηθούν επίσης. Κάθε μία από αυτές τις μεταβλητές θα είναι ένας αριθμητικά ευρετηριασμένος πίνακας αντίστοιχων τιμών για τα ληφθέντα αρχεία.

Ας υποθέσουμε ότι φορτώθηκαν τα αρχεία /home/test/some.html και /home/test/file.bin. Σε αυτήν την περίπτωση, η μεταβλητή $_FILES["userfile"]["name"] θα έχει την τιμή some.html , και η μεταβλητή $_FILES["userfile"]["name"] θα έχει την τιμή file.bin . Ομοίως, η μεταβλητή $_FILES["userfile"]["size"] θα περιέχει το μέγεθος του αρχείου some.html και ούτω καθεξής. Μεταβλητές $_FILES["userfile"]["name"] ,$_FILES["αρχείο χρήστη"]["tmp_name"]

, $_FILES["userfile"]["size"] και $_FILES["userfile"]["type"] θα αρχικοποιηθούν επίσης.

Σύναψη:



<<< Назад Όπως μπορείτε να δείτε, η οργάνωση των μεταφορτώσεων αρχείων στον διακομιστή δεν είναι τόσο δύσκολη. Είναι πιο δύσκολο να διασφαλιστεί το απαιτούμενο επίπεδο ασφάλειας, καθώς η μεταφόρτωση αρχείων στον διακομιστή μπορεί να χρησιμοποιηθεί από εισβολείς για να επιτεθούν στον διακομιστή. Για πληροφορίες σχετικά με τον τρόπο διασφάλισης του απαιτούμενου επιπέδου ασφάλειας κατά την εργασία με τις μεταφορτώσεις, ανατρέξτε στην ενότητα. Περιεχόμενο
Εμπρός >>>
Σύνδεση