Я пробовал несколько часов, чтобы сделать запрос POST, который отправляет файл.
Сначала попробовал простой file_get_contents()
с контекстом потока, похоже, не работает. Я никогда не получаю ответ, пока работает GET на другом URL-адресе.
Я искал в Интернете для HTTP-клиента и нашел Guzzle, который был скачан 400k раз на Packagist; Я решил попробовать эту технологию. Хорошо документировано, но, увы, ошибка при публикации этого проклятого файла.
$request = $client ->post('/files/') ->addPostFields(array('comments' => 'no value')) ->addPostFile('file', 'test.doc') ->setAuth($this->username, $this->password);
Мне потребовалось много часов, чтобы прочитать и прочесать сеть, чтобы узнать, что у меня возникла ошибка «417 Ожидание».
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>417 Expectation Failed</title> </head><body> <h1>Expectation Failed</h1> <p>The expectation given in the Expect request-header field could not be met by this server. The client sent<pre> Expect: 100-Continue, 100-Continue </pre> </p><p>Only the 100-continue expectation is supported.</p> </body></html>
После большего поиска в Интернете я закончил читать заголовок «Ожидание: 100-продолжить», который был автоматически отправлен Guzzle, поэтому я попытался:
$request->removeHeader('expect');
Теперь я получаю плохой запрос:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>400 Bad Request</title> </head><body> <h1>Bad Request</h1> <p>Your browser sent a request that this server could not understand.<br /> Request header field is missing ':' separator.<br /> <pre> zzle/3.7.3 curl/7.15.5 PHP/5.3.27</pre> </p> </body></html>
Распечатайте заголовки запросов, чтобы узнать, что: отсутствует, я получаю:
var_dump($request->__toString()); POST /files/ HTTP/1.1 Host: nunc57.qc.bell.ca User-Agent: Guzzle/3.7.3 curl/7.15.5 PHP/5.3.27 Content-Type: multipart/form-data Authorization: Basic bm92YTpzeW5hcHNl
Теперь я действительно тупой, надеюсь, кто-то уже нашел решение этой проблемы. Я очень устал от всего этого 🙁
Интересно, может ли быть причиной POSTing to /files/
(с завершающей косой чертой). Возможно, это заставляет внутреннее перенаправление и расстраивает Goutte, но не веб-браузер? Я бы попытался настроить вашу страницу так, чтобы вы отправляли POST в /files
или /files/something
.
Если вы можете использовать POST в целевом URL-адресе с помощью веб-браузера, я бы также предложил вам записать заголовки запросов с помощью инструментов браузера и посмотреть, есть ли какие-либо заголовки, которые могут быть добавлены к вашему запросу Guzzle.