Я нашел код для конкретного случая загрузки изображения. Кодирование некрасиво, но работает. Я хотел бы перенести функцию в проект, в котором guzzlehttp уже используется для другой загрузки (XML). Я передал кодировку. При загрузке я получаю сообщение об ошибке: «Файл изображения неисправен или имеет неподдерживаемый формат». с сайта.
Но я могу загрузить то же самое изображение через графический интерфейс и со старым решением, как я уже сказал, оно работает.
Я попытался выяснить, в какой степени guzzlehttp составлял содержание по-разному, но безуспешно.
Я не могу дальше ...
$content='' . //
'------WebKitFormBoundaryszHt4ozS9SzbbiRC' . CRLF . //
'Content-Disposition: form-data; name="sid"' . CRLF . //
CRLF . //
$sid . CRLF . //
'------WebKitFormBoundaryszHt4ozS9SzbbiRC' . CRLF . //
'Content-Disposition: form-data; name="PhonebookId"' . CRLF . //
CRLF . //
'255' . CRLF . //
'------WebKitFormBoundaryszHt4ozS9SzbbiRC' . CRLF . //
'Content-Disposition: form-data; name="PhonebookType"' . CRLF . //
CRLF . //
'1' . CRLF . //
'------WebKitFormBoundaryszHt4ozS9SzbbiRC' . CRLF . //
'Content-Disposition: form-data; name="PhonebookEntryId"' . CRLF . //
CRLF . //
$phone . CRLF . //
'------WebKitFormBoundaryszHt4ozS9SzbbiRC' . CRLF . //
'Content-Disposition: form-data; name="PhonebookPictureFile"; filename="wetter.jpg"' . CRLF . //
'Content-Type: image/jpeg' . CRLF . //
CRLF . //
file_get_contents('./test.jpg') . //
CRLF . //
'------WebKitFormBoundaryszHt4ozS9SzbbiRC' . CRLF . //
'Content-Disposition: form-data; name="apply"' . CRLF . //
CRLF . //
CRLF . //
'------WebKitFormBoundaryszHt4ozS9SzbbiRC--' . CRLF;
$len=strlen($content);
$header="" . //
"Host: $addr\n" . //
"Connection: keep-alive\n" . //
"Cache-Control: max-age=0\n" . //
"Accept: text/html\n" . //
"User-Agent: Mozilla/5.0\n" . //
"Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryszHt4ozS9SzbbiRC\n" . //
"Content-Length: $len\n" . //
"\n";
$context=array(
'http' => array(
'method' => 'POST',
'header' => $header,
'content' => $content
)
);
$url="http://$addr/cgi-bin/firmwarecfg";
$ret=file_get_contents($url,false,stream_context_create($context));
}
моя попытка передать это ...:
function uploadBackgroundImage(array $config)
{
$options = $config['fritzbox'];
$fritz = new Api($options['url']);
$fritz->setAuth($options['user'], $options['password']);
$fritz->mergeClientOptions($options['http'] ?? []);
$fritz->login();
$formfields = [
'PhonebookId' => '255',
'PhonebookType' => '1',
'PhonebookEntryId' => '613',
];
$filefields = [
'PhonebookPictureFile' => [
'type' => 'image/jpeg',
'filename' => 'updatebg.jpg',
'content' => file_get_contents('./test.jpg'),
]
];
$result = $fritz->postFile($formfields, $filefields);
if (strpos($result, 'Das Bild wurde erfolgreich hinzugefügt') === false) {
throw new \Exception('Upload failed');
}
}
... вызывает данную функцию:
public function postFile(array $formFields, array $fileFields): string
{
$multipart = [];
// sid must be first parameter
$formFields = array_merge(['sid' => $this->sid], $formFields);
foreach ($formFields as $key => $val) {
$multipart[] = [
'name' => $key,
'contents' => $val,
];
}
foreach ($fileFields as $name => $file) {
$multipart[] = [
'name' => $name,
'filename' => $file['filename'],
'contents' => $file['content'],
'headers' => [
'Content-Type' => $file['type'],
],
];
}
$url = $this->url . '/cgi-bin/firmwarecfg';
$resp = $this->getClient()->request('POST', $url, [
'multipart' => $multipart,
]);
return (string)$resp->getBody();
}