Все,
В рамках написанного мной приложения мне нужен веб-сервис HTTP PUT, который принимает входящие данные изображений, которые будут анализироваться, проверяться и добавляться в локальное хранилище файлов.
Моя проблема возникает после проверки размера, поскольку
$_SERVER['CONTENT_LENGTH']
имеет значение> 0, и это значение идентично размеру тестового файла, поэтому я могу предположить, что все идет хорошо до этого момента но, когда я пытаюсь прочитать данные входящего потока, используя
file_get_contents('php://stdin');
Я получаю пустую строку. Я также пробовал использовать
file_get_contents('php://input');
И это дает мне тот же результат, что и пустая строка.
Любая помощь, предложения или указания будут оценены.
NB: я использую
Привет, Кев, сервис работает на apache 2.0. Текст вопроса обновлен.






r, который у вас есть в качестве второго аргумента, неверен. file_get_contents не использует аргументы a/r/w/a+/r+/w+, которые использует fopen. Вероятно, вы захотите удалить его и просто выполните:
file_get_contents('php://input');
См. http://us3.php.net/file_get_contents.
Хорошая точка зрения! :) Я удалил букву r из кода вопроса, чтобы избежать путаницы. Тем не менее, 'r' фактически игнорируется file_get_contents, поэтому это не решает проблему пустой строки. (подтверждается изменением кода приложения)
file_get_contents не принимает параметр "r" - см. страница руководства PHP:
string file_get_contents ( string $filename [, int $flags...)
Допустимые значения $flag: FILE_USE_INCLUDE_PATH, FILE_TEXT, FILE_BINARY.
Попробуйте удалить флаг "r" и повторите попытку.
Редактировать - вопрос обновлен, флаг "r" игнорировался, так что корень проблемы явно не в этом.
Похоже, есть сообщил об ошибке в PHP относительно file_get_contents, возвращающего пустую строку для HTTP POST. Из описания ошибки:
file_get_contents('php://input')(and alsofile, fopen+fread) does not return POST data, when submited form with enctype = "multipart/form-data".When submited the same form without enctype specified (so default "application/x-www-form-urlencoded" is used) all works OK.
Таким образом, похоже, что обходной путь состоит в том, чтобы изменить указанный enctype формы с multipart/form-data, что, очевидно, не идеально для загрузки изображения - из Спецификация W3 FORM:
The content type "application/x-www-form-urlencoded" is inefficient for sending large quantities of binary data or text containing non-ASCII characters. The content type "multipart/form-data" should be used for submitting forms that contain files, non-ASCII data, and binary data.
Дальнейшее редактирование
Кажется, эта ошибка устранена в вашей версии PHP. Вы проверили, что читаемый буфер не начинается с символа возврата каретки / новой строки? Есть проблема, несколько похожая на вашу, которая обсуждалась на Sitepoint.
Попробуйте запустить strlen на входе и посмотрите, какова длина.
Я соответствующим образом обновил код вопроса, но, пожалуйста, посмотрите мой комментарий к ответу dirtslide. все еще пустые строки
Ответ обновлен, ура - похоже, это ошибка PHP в файловых операциях по запросу POST и php: // input
Это кудрявая! :) Эта ошибка старая, и я подтвердил, что она исправлена путем изменения метода запроса на POST и работает нормально. Моя проблема - Только с методом PUT.
Хм, немного маринованного огурца, хорошо! file_get_contents возвращает false, если поток не найден, поэтому он подключается нормально, но не читает никаких данных. Очень странный! :)
Я попробовал ваше предложение об использовании strlen, но я получаю int(0), когда я возвращаю var_dump. Я собираюсь запросить откат изменения, которое произошло на сервере некоторое время назад, чтобы исключить это из уравнения.
Я считаю, что int(0) сообщает вам, что строка имеет нулевую длину, поэтому может быть, что file_get_contents видит маркер конца потока прямо в начале загруженных данных. Держите нас в курсе после отката, это очень интересная проблема, которая наверняка возникнет у других, которые будут делать аналогичные вещи.
Я предполагаю, что вам нужно изменить httpd.conf, чтобы не отклонять запросы PUT. Вы это проверили?
Apache HTTPD по умолчанию отклоняет запросы PUT. Вы можете проверить mod_put:
http://perso.ec-lyon.fr/lyonel.vincent/apache/mod_put.html
и добавьте это в 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>
Оказалось, что восстановление конфигурации сервера помогло, и отключение PUT могло быть частью изменения. Большое спасибо всем за вашу помощь.
Сценарий работает на IIS или Apache?