Загрузка изображения в HipChat с помощью CPPREST SDK

Я безуспешно пытаюсь загрузить изображение в HipChat с помощью CPPREST SDK. Есть примеры для загрузки изображений на другие серверы, но API HipChat кажется более сложным (будучи новичком в этом, я не мог заполнить пробелы...).

Из документации HipChat REST API (https://www.hipchat.com/docs/apiv2/method/share_file_with_room):

Поделитесь файлом с комнатой.

Отформатируйте запрос как составной/связанный с одной частью приложения/json типа контента и второй частью, содержащей ваш файл.

ПРИМЕЧАНИЕ. Часть, содержащая файл, должна содержать name=file в заголовке Content-Disposition части. Часть application/json, содержащая сообщение, является необязательной и может быть исключена, но часть файла обязательна.

Пример запроса:

Заголовки:

Content-Type: multipart/related; граница=граница123456

Тело:

--boundary123456 Content-Type: application/json; кодировка = UTF-8

Content-Disposition: вложение; имя = метаданные

{сообщение: Проверьте загрузку этого файла!}

--boundary123456 Тип содержимого: изображение/png

Content-Disposition: вложение; имя=файл; имя_файла=загрузить.png

содержимое файла идет сюда

--граница123456--

Я пытаюсь использовать метод set_body(): void web::http::http_request::set_body(const concurrency::streams::istream& stream, ....), но не могу понять, как вставить файловый поток внутри всего вышеперечисленного сложного тела. В документации set_body() сказано: это нельзя использовать в сочетании с любыми другими средствами установки тела запроса. Нужно ли мне читать файл в строку и вставлять туда, где указано, что содержимое файла находится здесь, и использовать один из других методов set_body() вместо использования метода set_body() с файловым потоком?

Спасибо, Офер


person Ofer S    schedule 01.03.2017    source источник


Ответы (1)


к вашему сведению

/**
 * Share file with room
 * More info: https://www.hipchat.com/docs/apiv2/method/share_file_with_room
 *
 * @param string $id The id or name of the room
 * @param array $content Parameters be posted for example:
 *                              array(
 *                                'name'                => 'Example name',
 *                                'privacy'             => 'private',
 *                              )
 *
 * @return \Psr\Http\Message\ResponseInterface
 * @throws
 */
public function sharefileWithRoom($id, $file)
{
    $url = $this->baseUrl . "/v2/room/{$id}/share/file";
    $headers = array(
        'Authorization' => $this->auth->getCredential()
    );
    $parts[] = [
        'headers' => [
            'Content-Type' => $file['file_type'] ?: 'application/octet-stream',
        ],
        'name' => 'file',
        'contents' => stream_for($file['content']),
        'filename' => $file['file_name'] ?: 'untitled',
    ];
    if (! empty($file['message'])) {
        $parts[] = [
            'headers' => [
                'Content-Type' => 'application/json',
            ],
            'name' => 'metadata',
            'contents' => json_encode(['message' => $file['message']]),
        ];
    }
    return $response =  $this->postMultipartRelated($url, [
            'headers' => $headers,
            'multipart' => $parts,
        ]);
}
/**
 * Make a multipart/related request.
 * Unfortunately Guzzle doesn't support multipart/related requests out of the box.
 *
 * @param $url
 * @param $options
 * @return \Psr\Http\Message\ResponseInterface
 */
protected function postMultipartRelated($url, $options)
{
    $headers = isset($options['headers']) ? $options['headers'] : [];
    $body = new MultipartStream($options['multipart']);
    $version = isset($options['version']) ? $options['version'] : '1.1';
    $request = new Request('POST', $url, $headers, $body, $version);
    $changeContentType['set_headers']['Content-Type'] = 'multipart/related; boundary='.$request->getBody()->getBoundary();
    $request = modify_request($request, $changeContentType);
    $client = new HttpClient;
    return $client->send($request);
}
person hoangthienan    schedule 22.11.2017