Загрузка изображения не удалась с многочастным запросом guzzlehttp - PullRequest
0 голосов
/ 03 апреля 2019

Я нашел код для конкретного случая загрузки изображения. Кодирование некрасиво, но работает. Я хотел бы перенести функцию в проект, в котором 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();
    }
...