POST из PHP в другой (Java) веб-сервис и получение результата (изображения) - PullRequest
0 голосов
/ 09 февраля 2012

Это шаги:

  • Форма POST (ввод файла / изображения) из браузера отправляется на сервер PHP.
  • Затем сервер PHP использует fsockopen для Java (Служба REST GlassFish / Jersey), отправляющая изображение в виде контента для более продвинутой работы с изображениями и возвращающая полученное изображение обратно на сервер PHP (или возвращая только URI для изображения).
  • Затем PHP-сервер возвращает результат (img src = ..) пользователю в HTML-документе.

Получение изображения и всех его атрибутов на первом шаге работает отлично, но мне нужна помощь в настройкеправильно поднять заголовки в POST-запросе от PHP к веб-службе.

Текущий код:

$fp = fsockopen("domain..", 80, $errno, $errstr, 30);
$contentlength = $_FILES["photo_file"]["size"];
$imageref = $_FILES["photo_file"]["tmp_name"];

$out = "POST /Uri to resource .. HTTP/1.1\r\n";
$out .= "Host: http://... \r\n";
$out .= "Connection: Keep-Alive\r\n";
$out .= "Content-type: multipart/mixed\r\n";
$out .= "Content-length: $contentlength\r\n\r\n";
$out .= "$imageref";

fwrite($fp, $out);
$theOutput;
while (!feof($fp))
{
  $theOutput .= fgets($fp, 128);
}
echo $theOutput;
fclose($fp);

Который повторяет браузеру: «HTTP / 1.1 400 Bad Request Content-Type:text / html Content-Length: 717 ".

Поэтому мне нужны лучше сформированные заголовки, чтобы добраться до веб-метода REST.И если я должен достичь этого, кто-нибудь знает, какие параметры использовать в веб-методе Джерси для доступа к изображению?Для стандартных форм HTML это:

@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response getFullImage(@FormDataParam("photo_file") InputStream imageIS {..ImageIO.read(imageIS)..}

Буду рад предложениям по улучшению архитектуры и для достижения этой цели в HTML.

Cheers

1 Ответ

1 голос
/ 09 февраля 2012

Возможно, у вас проблема с плохо написанным запросом, и вы должны использовать cURL на первом месте (в php), базовый пример использования (с записью в файл) из справочной страницы :

$ch = curl_init("http://www.example.com/");
$fp = fopen("example_homepage.txt", "w");

curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);

curl_exec($ch);
curl_close($ch);
fclose($fp);

Другой пример настройки данных поста из curl_setopt() page :

$data = array('name' => 'Foo', 'file' => '@/home/user/test.png');

curl_setopt($ch, CURLOPT_URL, 'http://localhost/upload.php');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

И обработка кодов состояния HTTP через curl_getinfo():

if(curl_getinfo($c, CURLINFO_HTTP_CODE) === 200){
    ...
}

Вы также можете установить заголовки http вручную:

curl_setopt($cURL,CURLOPT_HTTPHEADER,array (
        "Content-Type: text/xml; charset=utf-8",
        "Expect: 100-continue"
    ));
...