ΥπολογιστέςΤύποι αρχείων

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

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

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

Ασφάλεια

Χρησιμοποιώντας την PHP, η αποστολή αρχείων στο διακομιστή είναι αρκετά εύκολη. Ο κώδικας είναι πολύ σύντομος και απλός. Μόνο μερικές γραμμές. Αλλά μια τέτοια μέθοδος είναι επικίνδυνη. Όπου περισσότερο χρόνο και γραμμές κώδικα δαπανώνται για την ασφάλεια.

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

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

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

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

Δημιουργία φόρμας PHP

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

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

Αλλά σημειώστε ότι για να μεταφέρετε δεδομένα στη φόρμα, πρέπει να προσθέσετε το χαρακτηριστικό enctype.

Διαφορετικά, τα δεδομένα σχετικά με το πρόγραμμα χειρισμού αρχείων δεν θα μεταδοθούν.

Πώς πρέπει να λειτουργήσει αυτό;

Όταν κάνετε κλικ στο κουμπί περιήγησης, θα πρέπει να ανοίξετε ένα παράθυρο, όπου θα σας ζητηθεί να επιλέξετε ένα αρχείο.

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

Εάν η διαδρομή δεν εμφανίζεται, κάντε ξανά αυτό το βήμα.

Αφού κάνετε κλικ στο κουμπί λήψης με το αρχείο χειριστή, μπορείτε να δώσετε οποιαδήποτε πληροφορία.

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

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

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

Προσαρμογή

Στην PHP, η μεταφόρτωση ενός αρχείου σε ένα διακομιστή απαιτεί ορισμένες ρυθμίσεις στο αρχείο php.ini. Υπάρχουν πολλές ρυθμίσεις σε αυτό το αρχείο. Όλοι δεν τους χρειαζόμαστε. Μας ενδιαφέρουν τρεις γραμμές: file_uploads, upload_tmp_dir και upload_max_filesize.

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

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

Μπορείτε να το κάνετε αυτό στην κονσόλα συνδέοντας μέσω SSH στο διακομιστή. Αρκεί να εισαγάγετε την υπηρεσία εντολών httpd restart και, στη συνέχεια, οι ρυθμίσεις θα τεθούν σε ισχύ.

Ένας άλλος τρόπος είναι να κάνετε επανεκκίνηση μέσω του πίνακα ISP ή μέσω του πίνακα χρέωσης του παρόχου.

Array με αρχείο

Στην PHP, το αρχείο φορτώνεται χρησιμοποιώντας τη συστοιχία $ _FILES. Περιέχει όλες τις πληροφορίες σχετικά με τα αρχεία που θα μεταφορτώσουμε.

Για να δείτε τι είδους πληροφορία περιέχεται σε αυτόν τον πίνακα, αρκεί να γράψετε τα ακόλουθα στο αρχείο χειριστή:

Επιλέξτε οποιοδήποτε αρχείο και κάντε κλικ στην επιλογή "Λήψη". Η σελίδα χειριστή εμφανίζει πληροφορίες που είναι αποθηκευμένες σε $ _FILES. Η μεταβλητή γράφεται εντελώς με μεγάλα γράμματα. Η PHP είναι μια γλώσσα ευαίσθητη σε πεζά.

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

Η στήλη τύπου υποδεικνύει τον τύπο αρχείου. Το πεδίο tmp_name αντιστοιχεί στο όνομα του προσωρινού αρχείου. Αφού τελειώσει το σενάριο, θα διαγραφεί.

Το πεδίο σφάλματος αποθηκεύει τον κωδικό σφάλματος. Σχετικά με αυτό λίγο περισσότερο. Μέγεθος - μέγεθος σε bytes.

Λάθη

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

Εξετάστε τις τιμές όλων των σφαλμάτων:

Πάνω από αυτό αναφέρθηκε για την παράμετρο, η οποία μπορεί να οριστεί στη συνήθη HTML.

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

PHP: αρχείο λήψης δέσμης ενεργειών

Πώς γίνεται όλα στην πράξη; Στην PHP, το αρχείο φορτώνεται με την εντολή copy. Εάν σας ενδιαφέρει το ερώτημα πώς να φορτώσετε ένα αρχείο, η απάντηση είναι απλά αντίγραφο, το οποίο χρησιμοποιεί δύο παραμέτρους - το αρχείο προέλευσης και το αρχείο προορισμού.

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

Ας υποθέσουμε ότι θέλετε οι χρήστες να μεταφορτώσουν μια φωτογραφία με την ανάλυση μόνο GIF, JPEG ή PNG. Μπορείτε να το ορίσετε έτσι.

Εάν ($ _ FILES ['file_upload'] ['type']! = "Image / gif") {
Echo "Λυπούμαστε, υποστηρίζουμε τη λήψη μόνο των αρχείων Gif";
Έξοδος;
}}

Εάν θέλετε να στείλετε και τους 3 τύπους, απλώς προσθέστε μια επιπλέον κατάσταση με έναν άλλο τύπο εικόνας.

Η αντιγραφή γίνεται ως εξής: αντίγραφο (αρχείο 1, αρχείο 2).

Στην περίπτωσή μας, όταν η εργασία συνεχίζεται με τη λήψη από τον υπολογιστή στο διακομιστή, μπορείτε να το κάνετε

Αντιγραφή ($ _ FILES ['file_upload'] ["tmp_name"], "1.jpg")

Δηλαδή, το αρχείο θα αντιγραφεί με το όνομα 1.jpg. Αυτό δεν είναι απολύτως σωστό. Στην περίπτωση αυτή, αυτό είναι μόνο ένα παράδειγμα. Το όνομα του αρχείου πρέπει πάντα να έχει διαφορετική ρύθμιση και να διευκρινίζεται η επέκταση ανάλογα με το αρχείο.

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

$ Path_info = pathinfo ($ _ FILES ['photo1'] ["όνομα"]);

$ Ext = $ path_info ['επέκταση'];

Στη μεταβλητή $ ext θα αποθηκεύσουμε την απαιτούμενη επέκταση. Και το όνομα αρχείου μπορεί να ρυθμιστεί τυχαία χρησιμοποιώντας το md5. Εάν σκοπεύετε να κάνετε λήψη πολλών αρχείων, είναι καλύτερο να τα φορτώσετε σε διαφορετικούς φακέλους. Έτσι θα είναι πιο βολικό. Ειδικά αν θέλετε να το καθαρίσετε.

Ο κώδικας για λήψη θα είναι ο ακόλουθος.

/// διαθεσιμότητα φωτογραφιών

Εάν ($ _FILES ['photo1'] ['tmp_name'] == null)

{

Echo ("

Δεν έχει οριστεί αρχείο.

Πίσω ... ").

Έξοδος;

}}

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

Εάν ($ _FILES ["photo1"] ["μέγεθος"]> 1024 * 1024 * 2)

{

?>

Το μέγιστο επιτρεπόμενο μέγεθος εικόνας είναι 2 MB

Πίσω ...

Έξοδος;

}}

// δημιουργήστε φακέλους

// δημιουργήστε το φάκελο του τρέχοντος μήνα

Εάν (!! File_exists ("img /". Ημερομηνία ("M")))

{

Mkdir ("img /" Ημερομηνία ("M")).

}}

// δημιουργήστε ένα φάκελο της τρέχουσας ημέρας

Εάν (!! File_exists ("img /" Ημερομηνία ("M").

{

Mkdir ("img /" Ημερομηνία ("M"). "/" Ημερομηνία ("d"));

}}

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

$ Path_info = pathinfo ($ _ FILES ['photo1'] ["όνομα"]);

$ Ext = $ path_info ['επέκταση'];

/// παράγει το όνομα του αρχείου

$ Id = md5 (ημερομηνία ("YMd")).

Εάν (αντιγράψετε ($ _FILES ['photo1'] ["tmp_name"], "img /" ημερομηνία ("M"). )

{

Echo ("αρχείο κατέβασμα με επιτυχία");

}}

/// οποιεσδήποτε περαιτέρω ενέργειες (γραφή στη βάση δεδομένων κ.λπ.)

}}

Πολλαπλά αρχεία

Λήψη πολλών αρχείων (PHP) συμβαίνει χρησιμοποιώντας πρόσθετα πεδία στη φόρμα.

Αυτή η μέθοδος δεν είναι πολύ καλή, καθώς περιορίζει τον αριθμό των αρχείων προς λήψη. Επιπλέον, θεωρείται κακός τόνος στον προγραμματισμό. Προσπαθήστε να κάνετε τα πάντα δυναμικά.

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

Για αυτό, δημιουργούμε τη φόρμα με αυτόν τον κώδικα.

<Εισαγωγή class = "form_upload" type = "file" όνομα = "file1 []" πολλαπλή τιμή = "Επισκόπηση">

<Εισαγωγή τάξης = "form_upload" type = "submit" όνομα = "upldFile" value = "Προσθήκη" />

Σημειώστε ότι η λέξη πολλαπλών προστίθεται και το όνομα ορίζεται ως πίνακας []. Σε αυτήν την περίπτωση, ο πίνακας $ _FILES θα είναι ελαφρώς διαφορετικός. Θα πάρετε μια συστοιχία σε μια συστοιχία.

Για να ελέγξετε, μπορείτε να χρησιμοποιήσετε πάλι var_dump ($ _ FILES);

Όλα τα αρχεία σας θα βρίσκονται στον πίνακα όπως αυτό:

  1. $ _FILES ["αρχείο1"] ["όνομα"] [0]
  2. $ _FILES ["αρχείο1"] ["όνομα"] [1]
  3. Και ούτω καθεξής.

Σε παρένθεση, γράφεται ο αριθμός αρχείου στον πίνακα. Μετρώντας από το μηδέν. Τα επεξεργαζόμαστε με τον ίδιο τρόπο, απλά ρυθμίζουμε τον βρόχο και, κατά την πρόσβαση στον παραπάνω κώδικα, προσθέτουμε το τέλος [$ i] στο τέλος.

$ I = 0;

Ενώ ($ _FILES ["file1"] ["όνομα"] [$ i] <> '')

{

/// εισαγάγετε τον παραπάνω κώδικα

}}

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

Similar articles

 

 

 

 

Trending Now

 

 

 

 

Newest

Copyright © 2018 el.birmiss.com. Theme powered by WordPress.