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); });

 





 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM