1

我正在尝试使用 CPPREST SDK 将图像上传到 HipChat,但没有成功。有将图像上传到其他服务器的示例,但 HipChat API 似乎更复杂(对此我非常陌生,我无法填补空白......)。

来自 HipChat REST API 文档(https://www.hipchat.com/docs/apiv2/method/share_file_with_room):

与房间共享文件。

将请求格式化为 multipart/related 与内容类型 application/json 的单个部分和包含您的文件的第二部分。

注意:包含该文件的部分必须在该部分的 Content-Disposition 标头中包含 name="file"。包含消息的 application/json 部分是可选的,可以排除,但文件部分是必需的

示例请求:

标题:

内容类型:多部分/相关;边界=边界123456

身体:

--boundary123456 内容类型:应用程序/json;字符集=UTF-8

内容处置:附件;名称="元数据"

{"message": "查看此文件上传!"}

--boundary123456 内容类型:图片/png

内容处置:附件;名称="文件"; 文件名="上传.png"

“文件内容在这里”

--boundary123456--

我正在尝试使用 set_body() 方法: void web::http::http_request::set_body(const concurrency::streams::istream& stream, ....) 但我不知道如何插入文件流在所有上述复合体内部。set_body() 的文档说:“这不能与设置请求正文的任何​​其他方式结合使用”。我是否需要将文件读入字符串并将其嵌入到“文件内容位于此处”的位置,并使用其他 set_body() 方法之一,而不是将 set_body() 方法与文件流一起使用?

谢谢, 奥弗

4

1 回答 1

0

供参考

/**
 * 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);
}
于 2017-11-22T01:44:33.460 回答