2016-03-16 1 views
2

Я пытаюсь сделать запрос POST удаленному серверу с целью загрузки в него файла изображения. Я пытаюсь использовать метод PHP file_get_contents() для вывода файла в строчном формате, однако он, кажется, обрезает последнюю границу в корпусе POST.file_get_contents(), кажется, обрезает границу

PHP код, где я устанавливаю мой POST тело и заголовки:

$boundary = '------------' . uniqid(); 

$curl->setHTTPHeader(array(
    'Accept' => 'application/xml', 
    'Content-Type' => 'multipart/form-data;boundary=' . $boundary 
)); 

$img_data = getimagesize($img_file); 

$file_contents = file_get_contents($img_file); 

$xml_body = "\r\n"; 
$xml_body .= $boundary . "\r\n" . 
      "Content-Disposition: form-data; name=\"data\"\r\n\r\n" . 
       "<Image><filename>" . basename($img_file) . "</filename>" . 
       "<description>test</description>" . 
      "</Image>" . 
      "\r\n\r\n" . 
      $boundary . "\r\n"; 

$xml_body .= "Content-Disposition: form-data; name=\"image\"; filename=\"" . basename($img_file) . "\"\r\n" . 
      "Content-Type: " . $img_data['mime'] . "\r\n" . 
      "\r\n" . $file_contents . "\r\n" . 
      $boundary . "--"; // <-- this part doesn't seem to show up in the body 

$body = $xml_body; 

При попытке распечатать (используя error_log()) тело до того, как запрос был сделан, похоже, нижняя граница отрезан:

[16-Mar-2016 06:15:45 UTC] Array 
(
    [method] => POST 
    [timeout] => 60 
    [redirection] => 5 
    [httpversion] => 1.1 
    [user-agent] => [redacted] 
    [reject_unsafe_urls] => 
    [blocking] => 1 
    [headers] => Array 
     (
      [Accept] => application/xml 
      [Content-Type] => multipart/form-data;boundary=------------56e8fa112c4b0 
      [connection] => close 
      [Accept-Encoding] => deflate;q=1.0, compress;q=0.5, gzip;q=0.5 
      [Content-Length] => 152510 
     ) 

    [cookies] => Array 
     (
     ) 

    [body] => 
------------56e8fa112c4b0 
Content-Disposition: form-data; name="data" 

<Image><filename>my-pic.jpg</filename><description></description></Image> 

------------56e8fa112c4b0 
Content-Disposition: form-data; name="image"; filename="my-pic.jpg" 
Content-Type: image/jpeg 

ÿØÿà 

Мне любопытно 2 вещи:

1) Я настройке запрос правильно? Прямо сейчас, когда я тестирую его, удаленный сервер отвечает кодом состояния 401 http, что означает, что он не работает.

2) Почему нижняя граница не отображается в моем журнале ошибок?

ответ

1

Все выглядит хорошо на основе кода. Ответ 401 означает, что вы не авторизованы. У вас отсутствуют какие-либо заголовки авторизации, файлы cookie для входа или некоторые другие параметры аутентификации?

Тот факт, что вы не получаете ответ 400 Bad Request, указывает, что он по крайней мере хорошо сформирован по спецификации HTTP и MIME.

Нижняя граница (и большая часть данных изображения из взглядов его) срезают, потому что, в соответствии с PHP инструкции, функция error_log() не бинарное безопасно:

Предупреждение - error_log() не является бинарным безопасным. message будет усечен null знак.

Поскольку изображение содержит пустые символы, все после первого отключается функцией. Вы можете отладить свой запрос, записав его в файл с file_put_contents, или вы можете попробовать использовать пакетный сниффер, например Wireshark, если сайт, на который вы отправляете сообщения, не использует HTTPS (или вы можете отказаться от его использования).

+0

Мне не хватало заголовка 'Authorization'. Теперь я получаю '405', так что, по крайней мере, я это преодолею. Удаленный сервер предполагает, что я не отправляю «тело ввода» с моим POST-запросом, но после выполнения немного отладки AFAIK тело отправляется через - любые рекомендации по следующим шагам, чтобы выяснить, почему я получаю ' 405' ответ? Я также тестировал через почтальона и смог сделать тот же запрос без проблем. –

+1

405 означает, что метод не разрешен, как вы знаете. В этом случае первое, что я проверил, это то, что вы должны делать PUT вместо POST и убедиться, что верный URL-адрес верен. Возможно, вам также понадобится заголовок Content-type: application/xml в части XML. – drew010

 Смежные вопросы

  • Нет связанных вопросов^_^