Невозможно получить доступ к данным HTTP PUT в коде веб-сервиса.
-
02-07-2019 - |
Вопрос
Все,
В рамках приложения, которое я пишу, мне нужен веб-сервис HTTP PUT, который принимает входящие данные изображения, которые будут анализироваться, проверяться и добавляться в локальное хранилище файлов.
Моя проблема возникает после проверки размера, поскольку
$_SERVER['CONTENT_LENGTH']
имеет значение > 0, и это значение идентично размеру тестового файла, поэтому я могу предположить, что до этого момента все идет хорошо но когда я пытаюсь прочитать данные входящего потока, используя
file_get_contents('php://stdin');
Я получаю пустую строку.Я также пробовал использовать
file_get_contents('php://input');
И это дает мне тот же результат, что и пустая строка.
Любая помощь, предложения или указания будут оценены по достоинству.
Примечание:я использую
- PHP 5.2.6
- Апач 2.0
Решение
Я думаю, вам нужно изменить 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>
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')
(а такжеfile, fopen+fread
) не возвращает данные, когда вносятся форма с ectype = "Multipart/Form-Data".При подаче одной и той же формы без указанного Enctype (так что используется приложение по умолчанию/x-www-form-urlencode ») все работает ОК.
Таким образом, похоже, что обходным путем является изменение указанного типа шифрования формы с multipart/form-data
, что явно не идеально подходит для загрузки изображений – из Спецификация формы W3:
Тип контента «application/x-www-form-urlencoded» неэффективен для отправки больших объемов двоичных данных или текста, содержащего символы, отличные от ASCII.Тип контента «multipart/form-data» следует использовать для отправки форм, содержащих файлы, данные, отличные от ASCII, и двоичные данные.
Дальнейшее редактирование
Кажется, эта ошибка устранена в вашей версии PHP.Проверили ли вы, что считываемый буфер не начинается с символа возврата каретки/новой строки?Обсуждалась проблема, похожая на вашу на Сайтпойнте.
Попробуйте запустить strlen
на входе и посмотреть, какова длина.
А r
у вас есть второй аргумент, который неверен. file_get_contents
не использует a/r/w/a+/r+/w+
аргументы, которые fopen
использует.Вероятно, вы захотите удалить его и просто сделать:
file_get_contents('php://input');