Forum und email

Υποστήριξη της PUT μεθόδου

Η υποστήριξη για την PUT μέθοδο έχει αλλάξει μεταξύ της PHP 3 και της PHP 4. Στην PHP 4, πρέπει να χρησιμοποιείτε το standard input stream για να διαβάσετε τα περιεχόμενα ενός HTTP PUT.

Example#1 Αποθηκεύοντας HTTP PUT αρχεία με την PHP 4

<?php
/* PUT data comes in on the stdin stream */
$putdata fopen("php://stdin","r");

/* Open a file for writting */
$fp fopen("myputfile.ext","w");

/* Read the data 1kb at a time
   and write to the file */
while ($data fread($putdata,1024))
  
fwrite($fp,$data);

/* Close the streams */
fclose($fp);
fclose($putdata);
?>

Note: Όλη η τεκμηρίωση που ακολουθεί ισχύει για την PHP 3 μόνο.

Η PHP προσφέρει υποστήριξη για την HTTP PUT μέθοδο που χρησιμοποιείται από client σαν τους Netscape Composer και W3C Amaya. Οι PUT request είναι αρκετά απλούστερες από ένα upload αρχείου και μοιάζουν κάπως έτσι:

PUT /path/filename.html HTTP/1.1
     

Αυτό κανονικά σημαίνει πως ο remote client θα ήθελε να αποθηκεύσει τα περιεχόμενα που ακολουθούν: /path/filename.html στο web tree σας. Προφανώς δεν είναι και τόσο καλή ιδέα ο Apache ή η PHP να αφήνουν αυτόματα οποιονδήποτε να κάνει overwrite αρχεία στο web tree σας. Έτσι, για να χειριστείτε ένα τέτοιο request πρέπει πρώτα να πείτε στον web server σας πως θέλετε ένα συγκεκριμένο PHP script να χειριστεί το request. Στον Apache το κάνετε αυτό με το Script directive. Μπορεί να τοποθετηθεί σχεδόν οπουδήποτε μέσα στο αρχείο ρυθμίσεων του Apache. Ένα συνηθισμένο μέρος είναι μέσα σε ένα <Directory> μπλοκ ή πιθανώς μέσα σε ένα <Virtualhost> μπλοκ. Μια γραμμή σαν και αυτή θα κάνει το κόλπο:

Script PUT /put.php
     

Αυτό λέει στον Apache να στέλνει όλα τα PUT request για URI που ταιριάζουν στο περιεχόμενο στο οποίο τοποθετήσατε αυτή τη γραμμή στο put.php script σας. Αυτό υποθέτει, φυσικά, πως έχετε την PHP συνδεδεμένη για την .php επέκταση και πως η PHP είναι ενεργοποιημένη.

Μέσα στο put.php αρχείο σας θα θέλετε να κάνετε κάτι τέτοιο:

<?php copy($PHP_UPLOADED_FILE_NAME,$DOCUMENT_ROOT.$REQUEST_URI); ?>

Αυτό θα αντιγράψει το αρχείο στην τοποθεσία που ζητήθηκε από τον remote client. Θα θέλετε πιθανώς να κάνετε κάποιους έλεγχους ή/και να αναγνωρίσετε των χρήστη πριν να εκτελέσει αυτή την αντιγραφή του αρχείου. Το μόνο κόλπο εδώ είναι πως όταν η PHP δει ένα request μέσω PUT μεθόδου αποθηκεύει το αρχείο που έχει γίνει upload σε ένα προσωρινό αρχείο όπως εκίνα που χειρίζεται η POST-μέθοδος. Όταν το request τελειώσει, αυτό το προσωρινό αρχείο διαγράφεται. Έτσι, το PHP script σας που χειρίζεται το PUT πρέπει να αντιγάψει το αρχείο αυτό κάπου αλλού. Το όνομα του προσωρινού αυτού αρχείου είναι μέσα στην $PHP_PUT_FILENAME μεταβλητή, και μπορείτε να δείτε το προτεινόμενο όνομα προορισμού στο $REQUEST_URI (μπορεί να διαφέρει σε web server εκτός του Apache). Αυτό το όνομα αρχείου προορισμού είναι αυτό που ο remote client ορίζει. Δεν χρειάζεται να ακούσετε τον client. Θα μπορούσατε, για παράδειγμα, να αντιγράφετε όλα τα αρχεία που γίνονται upload σε ένα ειδικό κατάλογο για τα upload.