2017-03-01 3 views
1

Ich versuche, ein Bild mit CPPREST SDK ohne Erfolg auf HipChat hochladen. Es gibt Beispiele für das Hochladen von Bildern auf andere Server, aber die HipChat-API scheint komplexer zu sein (da ich neu darin bin, konnte ich die Lücken nicht füllen ...).Hochladen eines Bildes auf HipChat mit CPPREST SDK

Von HipChat REST-API-Dokumentation (https://www.hipchat.com/docs/apiv2/method/share_file_with_room):

Teile einer Datei mit dem Raum.

Formatieren Sie die Anforderung als multipart/related mit einem einzelnen Teil der Content-Type-Anwendung/json und einem zweiten Teil, der Ihre Datei enthält.

HINWEIS: Der Teil, der die Datei enthält, muss name = "file" in der Content-Disposition-Kopfzeile des Teils enthalten. Der application/json Teil eine Nachricht enthalten ist optional und kann ausgeschlossen werden, aber eine Datei Teil erforderlich ist

Beispiel Anfrage:

Headers:

Content-Type: multipart/related; boundary = boundary123456

Körper:

--boundary123456 Content-Type: application/json; charset = UTF-8

Inhalt-Disposition: Anhang; name = "Metadaten"

{ "message": "Schauen Sie sich diese Datei laden!"}

--boundary123456 Content-Type: image/png

Content-Disposition: attachment; name = "Datei"; filename = "upload.png"

"Dateiinhalt geht hier"

--boundary123456--

Ich versuche, die set_body() -Methode zu verwenden: Leere web :: http :: http_request :: set_body (const Nebenläufigkeit :: Streams :: istream & Stream, ....) aber ich kann nicht herausfinden, wie Sie den Datei-Stream in alle oben genannten komplexen Körper einfügen. Die Dokumentation von set_body() sagt: "Dies kann nicht in Verbindung mit anderen Mitteln zum Festlegen des Körpers der Anfrage verwendet werden". Muss ich die Datei in eine Zeichenfolge einlesen und dort einbetten, wo "Dateiinhalt wird hier" angezeigt wird, und eine der anderen set_body() -Methoden verwenden, anstatt die set_body() -Methode mit dem Dateistream zu verwenden?

Danke, Ofer

Antwort

0

FYI

/** 
* 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); 
} 
+0

Klasse https://github.com/hoangthienan/go1-hungrybot/blob/master/src/Services/RoomService.php – hoangthienan

Verwandte Themen