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

Все,

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

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

$_SERVER['CONTENT_LENGTH']

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

file_get_contents('php://stdin');

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

file_get_contents('php://input');

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

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

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

  • PHP 5.2.6
  • Apache 2.0

Сценарий работает на IIS или Apache?

Kev 28.09.2008 20:20

Привет, Кев, сервис работает на apache 2.0. Текст вопроса обновлен.

flungabunga 29.09.2008 00:32
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
2
1 450
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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, поэтому это не решает проблему пустой строки. (подтверждается изменением кода приложения)

flungabunga 28.09.2008 17:57

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 also file, 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. все еще пустые строки

flungabunga 28.09.2008 18:03

Ответ обновлен, ура - похоже, это ошибка PHP в файловых операциях по запросу POST и php: // input

ConroyP 28.09.2008 18:10

Это кудрявая! :) Эта ошибка старая, и я подтвердил, что она исправлена ​​путем изменения метода запроса на POST и работает нормально. Моя проблема - Только с методом PUT.

flungabunga 28.09.2008 18:13

Хм, немного маринованного огурца, хорошо! file_get_contents возвращает false, если поток не найден, поэтому он подключается нормально, но не читает никаких данных. Очень странный! :)

ConroyP 28.09.2008 18:16

Я попробовал ваше предложение об использовании strlen, но я получаю int(0), когда я возвращаю var_dump. Я собираюсь запросить откат изменения, которое произошло на сервере некоторое время назад, чтобы исключить это из уравнения.

flungabunga 29.09.2008 00:49

Я считаю, что int(0) сообщает вам, что строка имеет нулевую длину, поэтому может быть, что file_get_contents видит маркер конца потока прямо в начале загруженных данных. Держите нас в курсе после отката, это очень интересная проблема, которая наверняка возникнет у других, которые будут делать аналогичные вещи.

ConroyP 29.09.2008 00:59
Ответ принят как подходящий

Я предполагаю, что вам нужно изменить 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 могло быть частью изменения. Большое спасибо всем за вашу помощь.

flungabunga 07.10.2008 14:54

Другие вопросы по теме