No se puede acceder a los datos HTTP PUT en el código del servicio web
-
02-07-2019 - |
Pregunta
Todos,
Como parte de una aplicación que estoy escribiendo, necesito tener un servicio web HTTP PUT que acepte los datos de imágenes entrantes, que se analizarán, validarán y agregarán a un almacén de archivos local.
Mi problema surge después de la validación de tamaño como
$_SERVER['CONTENT_LENGTH'cons
tiene un > 0, y este valor es idéntico al tamaño del archivo de prueba, por lo que puedo asumir que todo va bien hasta este punto pero cuando trato de leer los datos de flujo entrantes utilizando
file_get_contents('php://stdin');
Me sale una cadena vacía. También he intentado usar
file_get_contents('php://input');
Y esto me da el mismo resultado de una cadena vacía.
Cualquier ayuda, sugerencia o dirección será apreciada.
NB: estoy usando
- PHP 5.2.6
- Apache 2.0
Solución
Mi mejor conjetura es que necesita alterar httpd.conf para no denegar solicitudes PUT. ¿Has comprobado eso?
Otros consejos
Apache HTTPD niega las solicitudes PUT por defecto. Podrías revisar mod_put:
http://perso.ec-lyon.fr/lyonel.vincent/ apache / mod_put.html
y agregue esto a 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>
file_get_contents
no toma la " r " parámetro: consulte la página del manual de PHP :
string file_get_contents ( string $filename [, int $flags...)
Los valores válidos de $ flag
son FILE_USE_INCLUDE_PATH, FILE_TEXT, FILE_BINARY
.
Intente eliminar la " r " marcar e intentar nuevamente
Editar : pregunta actualizada, " r " La bandera estaba siendo ignorada, por lo que evidentemente no era la raíz del problema.
Parece que hay un error informado en PHP con respecto a file_get_contents
devolviendo una cadena vacía para un POST HTTP. De la descripción del error:
file_get_contents ('php: // input')
(y tambiénfile, fopen + fread
) no devolver datos POST, cuando se envía el formulario con enctype = " multipart / form-data " ;.Cuando se envía el mismo formulario sin enctype especificado (por defecto " aplicación / x-www-form-urlencoded " se usa) todo funciona bien.
Por lo tanto, parece que una solución alternativa es cambiar el tipo de formulario especificado lejos de multipart / form-data
, lo que obviamente no es ideal para cargar una imagen, desde Especificación W3 FORM :
El tipo de contenido " application / x-www-form-urlencoded " es ineficiente para enviar grandes cantidades de datos binarios o texto que contiene caracteres que no son ASCII. El tipo de contenido " multipart / form-data " debe utilizarse para enviar formularios que contengan archivos, datos que no sean ASCII y datos binarios.
Edición adicional
Este error parece haberse resuelto en su versión de PHP. ¿Ha comprobado para asegurarse de que el búfer que se está leyendo no comienza con un char-return / newline char? Hay un problema similar al suyo que se discutió en Sitepoint .
Intente ejecutar strlen
en la entrada y vea cuál es la longitud .
El r
que tienes como segundo argumento no es correcto. file_get_contents
no usa los argumentos de a / r / w / a + / r + / w +
que usa fopen
. Probablemente quieras eliminarlo y simplemente hazlo:
file_get_contents('php://input');
Consulte http://us3.php.net/file_get_contents .