2008-09-28 6 views
1

Tous,Impossible d'accéder aux données HTTP PUT dans le code webservice

Dans le cadre d'une application que je vous écris que je dois avoir un webservice HTTP PUT qui accepte imageData entrant, qui par analyse, validé et ajouté à un magasin de fichiers local.

Ma question se pose après la validation de la taille que la

$_SERVER['CONTENT_LENGTH']

a une> 0 valeur, et cette valeur est identique à la taille du fichier de test, donc je peux supposer que tout est va bien jusqu'à ce point mais lorsque je tente de lire les données de flux entrants en utilisant

file_get_contents('php://stdin');

Je reçois une chaîne vide. J'ai aussi essayé d'utiliser

file_get_contents('php://input');

Et cela me donne le même résultat d'une chaîne vide.

Toute aide, suggestion ou direction sera appréciée.

NB: J'utilise

  • PHP 5.2.6
  • Apache 2,0
+0

le script en cours d'exécution sur IIS ou Apache? – Kev

+0

Hey Kev, le service fonctionne sur Apache 2.0. Texte de la question mis à jour – flungabunga

Répondre

1

Ma meilleure estimation est que vous devez modifier httpd.conf pour ne pas refuser les requêtes PUT. Avez-vous vérifié cela?

0

Le r vous avez le deuxième arg n'est pas juste. file_get_contents n'utilise pas les arguments a/r/w/a+/r+/w+ qu'utilise fopen. Vous voulez sans doute de l'enlever et juste faire:

file_get_contents('php://input'); 

Voir http://us3.php.net/file_get_contents.

string file_get_contents (string $filename [, int $flags...) 

$flag valides valeurs sont FILE_USE_INCLUDE_PATH, FILE_TEXT, FILE_BINARY: voir the PHP manual page -

+0

Bon point! :) J'ai enlevé le «r» du code de la question pour éliminer toute confusion supplémentaire. Pourtant, le 'r' est ignoré par le fichier file_get_contents, donc cela ne résout pas le problème de la chaîne vide. (confirmé en changeant le code de l'application) – flungabunga

0

file_get_contents ne prend pas le paramètre "r".

Essayez de retirer le drapeau « r » et d'essayer à nouveau

Modifier - question mise à jour, drapeau « r » a été ignorée si évidemment pas la racine du problème.

Il semble qu'il y ait un reported bug in PHP concernant file_get_contents renvoyant une chaîne vide pour un POST HTTP.De la description de bug:

file_get_contents('php://input') (et aussi file, fopen+fread) ne retour des données POST, lorsque le formulaire submited avec enctype = "multipart/form-data".

Lorsque soumis le même formulaire sans enctype spécifié (donc "application/x-www-form-urlencoded" est utilisé) tout fonctionne bien.

Il ressemble à une autre solution consiste à changer la forme spécifiée enctype loin de multipart/form-data, ce qui est évidemment pas idéal pour un téléchargement d'image - de la W3 FORM specification:

Le type de contenu " application/x-www-form-urlencoded "est inefficace pour l'envoi de grandes quantités de données binaires ou de texte contenant des caractères non-ASCII. Le type de contenu "multipart/form-data" doit être utilisé pour soumettre des formulaires contenant des fichiers, des données non-ASCII et des données binaires.

De plus Modifier

Ce bug semble avoir été résolu dans votre version de PHP. Avez-vous vérifié pour vous assurer que le tampon en cours de lecture ne commence pas avec un chariot retour chariot/newline? Il y a un problème quelque peu similaire au vôtre qui a été discuté on Sitepoint.

Essayez d'exécuter strlen sur l'entrée et de voir quelle est la longueur.

+0

J'ai mis à jour le code de la question en conséquence, mais s'il vous plaît voir mon commentaire sur 'Réponse de dirtslide. Les réponses sont toujours vides – flungabunga

+0

Réponse mise à jour maintenant, acclame - semble être un bug PHP dans les opérations de fichiers sur une requête POST et php: // entrée – ConroyP

+0

Ceci est un bouclé! :) Ce bug est ancien, et j'ai confirmé qu'il est corrigé en changeant la méthode de requête en POST, et ça marche bien. Mon problème est _only_ avec la méthode PUT. – flungabunga

2

Apache HTTPD refuse les demandes PUT par défaut. Vous pouvez consulter mod_put:
http://perso.ec-lyon.fr/lyonel.vincent/apache/mod_put.html

et ajouter à httpd.conf:

 
<Location /upload/dir> 
    EnablePut On 
    AuthType Basic 
    AuthName "Web publishing" 
    AuthUserFile /www/etc/passwd 
    AuthGroupFile /www/etc/group 
    <Limit PUT> 
    require valid-user 
    </Limit> 
</Location> 
+0

Il s'avère qu'une configuration de serveur a fait l'affaire, et un PUT désactivé peut avoir fait partie du changement. Merci beaucoup à tous pour votre aide. – flungabunga

Questions connexes