Невозможно получить доступ к данным HTTP PUT в коде веб-сервиса.

StackOverflow https://stackoverflow.com/questions/145855

  •  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');

Видеть http://us3.php.net/file_get_contents.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top