通过http请求返回文件,这时候返回的状态的一些参数可以添加到头部去如下
response.add("File-Path", strURL); // 添加自定义路径头部
再在下面去解析
我这里不是很标准的写法。按理来说应该失败之后响应码也应该放在头里面的
void DownloadFileRequestHandler::handleRequest(HTTPServerRequest& request, HTTPServerResponse& response)
{
Application& app = Application::instance();
//app.logger().information("Request from " + request.clientAddress().toString());
std::string strUrl=request.getURI();
std::string strUrlPath = strUrl.substr(strUrl.find("Path=")+5);
std::string strFileName= strUrl.substr(strUrl.find_last_of("/"));
try
{
std::string strURL;
Poco::URI::decode(strUrlPath, strURL);
Poco::FileInputStream fileStream("./"+strURL);
if (!fileStream) {
response.setStatus(Poco::Net::HTTPResponse::HTTP_NOT_FOUND);
response.send(); // 发送响应
return;
}
response.setStatus(Poco::Net::HTTPResponse::HTTP_OK);
response.setContentType("application/octet-stream");
response.setContentLength(static_cast<int>(fileStream.size())); // 设置文件大小
response.add("File-Path", strURL); // 添加自定义路径头部
//std::cout <<"fileStream.rdbuf()" << fileStream.rdbuf()<<std::endl;
response.send() << fileStream.rdbuf(); // 将文件内容写入响应
fileStream.close(); // 关闭文件输入流
return;
}
catch (const Poco::Exception& ex)
{
Poco::JSON::Object object(Poco::JSON_PRESERVE_KEY_ORDER);
object.set("method", "DownloadFile");
response.setStatus(Poco::Net::HTTPResponse::HTTP_NOT_FOUND);
std::string _strErro = ex.displayText();
std::cout << ex.displayText() << std::endl;
object.set("errcode", "40");
object.set("errmsg", _strErro);
std::ostringstream ostr_stream;
object.stringify(ostr_stream);
std::ostream& out = response.send();
out << ostr_stream.str();
}
}