1. 程式人生 > 其它 >C++ QtHttpServer HTTP請求返回(響應)一張圖片

C++ QtHttpServer HTTP請求返回(響應)一張圖片

接手一個介面的小專案, 通過http請求呼叫傳入一個圖片url,程式下載圖片,處理圖片,通過介面返回一張圖片:

用到了opencv和QtHttpServer。本次介紹http響應一張圖片過程、opencv的Mat和圖片互轉:

http響應一張圖片過程:

此處responder例項是QtHttpServer路由中的 QHttpServerResponder &&responder 引數

1. 設定響應狀態碼(200、 404 、302 、400、500.....)

  例如,響應成功狀態碼(200):

responder.writeStatusLine(QHttpServerResponder::StatusCode::Ok);

2. 設定響應頭

  Accept-Ranges: bytes

  Content-Type:image/png

  Content-Length: 圖片大小

responder.writeHeader("Accept-Ranges", "bytes");
responder.writeHeader("Content-Type", "image/png");
responder.writeHeader("Content-Length", QString::number(*len).toUtf8());

len:響應體資料長度

3. 響應體:

 圖片原始二進位制資料

responder.writeBody(outData, *len);
outData為char* 型別指標,len為資料長度,要和上邊響應頭中Content-Length長度一致,因為瀏覽器要根據Content-Length讀取圖片資料。
例如,返回返回一張本地圖片:
    QHttpServer httpServer;
    httpServer.route("/imgHandler", [](const QHttpServerRequest &request,QHttpServerResponder &&responder){
        responder.writeStatusLine(QHttpServerResponder::StatusCode::Ok);
        responder.writeHeader(
"Accept-Ranges", "bytes"); responder.writeHeader("Content-Type", "image/png");
     //讀取本地檔案 ifstream stream(
"/home/100002.png", ios::out | ios::binary); int len = 0; char *data = NULL; if(stream.is_open()) { stream.seekg(0, std::ios::end); len = stream.tellg(); stream.seekg(0, std::ios::beg); data = new char[len]; stream.read(data, len); }
      //寫響應頭,資料長度,和方法體資料長度一致 responder.writeHeader(
"Content-Length", QString::number(len).toUtf8()); responder.writeBody(data, len); });