C++ QtHttpServer HTTP請求返回(響應)一張圖片
阿新 • • 發佈:2022-02-10
接手一個介面的小專案, 通過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); });