PHP
downloads | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

Utilisation des fichiers à distance> <Gestion des chargements de fichiers
Last updated: Fri, 10 Oct 2008

view this page in

Chargement par méthode PUT

PHP supporte la méthode HTTP PUT utilisée par les navigateurs pour y stocker des fichiers sur un serveur. Les requêtes de type PUT sont beaucoup plus simples que les chargements de fichiers en utilisant le type POST, et elles ressemblent à :

Exemple #1 Méthode PUT pour les chargements de fichiers

PUT /path/filename.html HTTP/1.1

Normalement, cela signifie que le client distant va sauver les données qui suivent dans le fichier : /path/filename.html de votre disque. Ce n'est évidemment pas très sécurisé de laisser Apache ou PHP écraser n'importe quel fichier de l'arborescence. Pour éviter ceci, il faut d'abord dire au serveur que vous voulez qu'un script PHP donné gère la requête. Avec Apache, il y a une directive pour cela : Script. Elle peut être placée n'importe où dans le fichier de configuration d'Apache. En général, les webmestres la placent dans le bloc <Directory>, ou peut-être dans le bloc <VirtualHost>. La ligne suivante fera très bien l'affaire :

Exemple #2 Directive Apache pour le chargement par méthode PUT

Script PUT /put.php

Elle indique à Apache qu'il doit envoyer les requêtes de chargement par méthode PUT au script put.php. Bien entendu, cela présuppose que vous avez activé PHP pour qu'il prenne en charge les fichiers de type .php, et que PHP est actif. La ressource de destination pour toutes les requêtes PUT de ce script doit être le script lui-même, et non le nom du fichier que le fichier téléchargé doit avoir.

Avec PHP, vous voudriez faire quelque chose comme ce qui suit dans votre put.php. Ceci va copier le contenu du fichier téléchargé dans le fichier myputfile.ext sur le serveur. Vous devez probablement vouloir effectuer quelques vérifications et/ou identifier l'utilisateur avant d'effectuer cette copie de fichier.

Exemple #3 Sauvegarde de fichiers HTTP PUT

<?php
/* Les données PUT arrivent du flux */
$putdata fopen("php://input""r");

/* Ouvre un fichier pour écriture */
$fp fopen("myputfile.ext""w");

/* Lecture des données, 1 Ko à la fois
and write to the file */
while ($data fread($putdata1024))
fwrite($fp$data);

/* Fermeture du flux */
fclose($fp);
fclose($putdata);
?>



add a note add a note User Contributed Notes
Chargement par méthode PUT
yaogzhan at gmail dot com
14-Dec-2005 01:01
PUT raw data comes in php://input, and you have to use fopen() and fread() to get the content. file_get_contents() is useless.

The HTTP PUT request MUST contain a Content-Length header to specify the length (in bytes) of the body, or the server will not be able to know when the input stream is over. This is the common problem for many to find the php://input empty if no such header available.

This should make PUT work properly on win32 using PHP5.1.1 and apache2.
warhog at warhog dot net
20-Sep-2005 11:11
Here's my solution on my Note below

The .htacces-File

Options FollowSymLinks

RewriteEngine on
RewriteBase !!!The Path of your PUT-Upload-Folder, relative to the DocumentRoot!!!
RewriteRule ^index\.php$ - [L]
RewriteRule ^(.*)$ index.php?url=$1 [L]

index.php:
<?php

if ($_SERVER['REQUEST_METHOD'] == "PUT")
{
$f = fopen(basename($_SERVER['REQUEST_URI']), "w");
 
$s = fopen("php://input", "r");
  while(
$kb = fread($s, 1024))
  {
fwrite($f, $kb, 1024); }
 
fclose($f);
 
fclose($s);
 
Header("HTTP/1.1 201 Created"); }
elseif (
$_SERVER['REQUEST_METHOD'] == "GET")
{
readfile(basename($_SERVER['REQUEST_URI'])); }

?>

Testes with Apache 2 and PHP 5, php as a module (win32)
warhog at warhog dot net
20-Sep-2005 10:22
NOTE: The <Script>-Directive can not be placed in .htaccess files.

So if you're having shared webspace and no access to the apache-configuration file you will have little chance to make something like this work.

But you can solve the problem, using mod_rewrite (for Apache) - for further information see the documentation at http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html
gherson
15-Aug-2005 11:16
A Case Study:  To set up publishing with Netscape 7.2 Composer to Apache/PHP, no need to use CGI (which I tried unsuccessfully for too long) or to alter Apache's httpd.conf.  I needed only to click Publish As, fill in put2disk.php as the filename (where its contents are the below), and fill in that file's dir as the "Publishing address".
XAMPP 1.4.14: Apache/2.0.54 (Win32) mod_ssl/2.0.54 OpenSSL/0.9.7g PHP/5.0.4.

<? // filename: put2disk.php.

//file_put_contents ("get_def.out", print_r (get_defined_vars(), TRUE)); // debugging

// Two slurp methods: (a) didn't work, (b) did.
//$stdin_rsc = fopen("php://input", "r");
//$putdata='';
//while ($putdata .= fread($stdin_rsc, 1024)); // a. Hangs the "Publishing..." dialog.
//while (!feof($stdin_rsc)) $putdata.=fread($stdin_rsc, 8192); // b. Worked, but file_get_contents is faster.
//fclose($stdin_rsc);

// All that's nec:
$putdata=file_get_contents('php://input'); // Not php://stdin! (When the ability to see error messages isn't available, the doc (this manual page) needs to be more accurate.)

file_put_contents("stdin.out",$putdata);
?>
gomez_NOSPAM_pixline_dot_net
18-Apr-2004 09:59
Trying to capture a PUT stream into a single variable seems not to be allowed, probably because of the non presence of some kind of EOF. In this way save a PUT request into a database isn't easy.

The only way I find would be output to a cache file, then either insert filename into db or read again its content and place it in some kind of query.
mikeb at mikebanahan dot com
03-Nov-2003 11:41
I have spent a lot of time trying to make PUT work with Apache 2.0.40. I have not yet been able to find any way of making the Script directive invoke php via mod_php, the only way has been to have a file called example.cgi and invoke it via CGI, with the file starting
#!/usr/bin/php
so the PHP interpreter is invoked through the CGI mechanism and not as a module.

If there IS a way of making it work 'right' I'd love to know! After six hours of messing around, I've settled for CGI. The error messages in the apache error log are significantly misleading and the whole thing has been an exercise in frustration.

Attempts to use AddHandler and all 'normal' ways of trying to persuade Apache to do this have been fruitless. It does seem as if PUT can only be handled by CGI invocation.
php at dreier dot nu
13-Feb-2003 07:21
I can only make it work when I am using PHP as CGI, not as an Apache module.
I am using the version of PHP/Apahce that is shipped with Debian/testing.

You have to load the action_module, but not the put_module in Apache config.

 
show source | credits | stats | sitemap | contact | advertising | mirror sites