Невозможно получить доступ к данным HTTP PUT в коде веб-сервиса - PullRequest
1 голос
/ 28 сентября 2008

All

Как часть приложения, которое я пишу, мне нужно иметь веб-сервис HTTP PUT, который принимает входящие изображения, которые будут проанализированы, проверены и добавлены в локальное хранилище файлов.

Моя проблема возникает после проверки размера как

$_SERVER['CONTENT_LENGTH']

имеет значение> 0, и это значение идентично размеру тестового файла, поэтому я могу предположить, что все идет хорошо до этой точки , но , когда я пытаюсь прочитать данные входящего потока, используя

file_get_contents('php://stdin');

Я получаю пустую строку. Я также пытался использовать

file_get_contents('php://input');

И это дает мне тот же результат пустой строки.

Любая помощь, предложения или направления будут оценены.

NB: я использую

  • PHP 5.2.6
  • Apache 2.0

Ответы [ 4 ]

2 голосов
/ 04 октября 2008

Apache HTTPD по умолчанию отклоняет запросы PUT. Вы можете проверить mod_put:
http://perso.ec -lyon.fr / lyonel.vincent / апач / 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>
1 голос
/ 30 сентября 2008

Я думаю, вам нужно изменить httpd.conf, чтобы не отклонять запросы PUT. Вы это проверяли?

0 голосов
/ 28 сентября 2008

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) не возвращать данные POST, когда отправленная форма с ENCTYPE = "многочастному / форм-данных". * * +1025

При отправке той же формы без указания энктипа (по умолчанию "application / x-www-form-urlencoded" используется) все работает хорошо.

Похоже, что обходной путь - это изменить указанный тип формы с multipart/form-data, что явно не идеально для загрузки изображения - из спецификации W3 FORM :

Тип содержимого «application / x-www-form-urlencoded» неэффективен для отправки больших объемов двоичных данных или текста, содержащего символы не ASCII. Тип контента "multipart / form-data" должен использоваться для отправки форм, содержащих файлы, данные не ASCII и двоичные данные.

Дальнейшее редактирование

Эта ошибка, похоже, была исправлена ​​в вашей версии PHP. Вы проверили, чтобы убедиться, что считываемый буфер не начинается с символа возврата каретки / перевода строки? Есть проблема, несколько похожая на вашу, которая обсуждалась на Sitepoint .

Попробуйте запустить strlen на входе и посмотрите, какова длина.

0 голосов
/ 28 сентября 2008

Значение r, которое вы получили в качестве второго аргумента, неверно. file_get_contents не использует a/r/w/a+/r+/w+ аргументы, используемые fopen. Вы, вероятно, хотите удалить его и просто выполните:

file_get_contents('php://input');

См. http://us3.php.net/file_get_contents.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...