在linux上,我使用https://github.com/yhirose/cpp-httplib将一个简单的REST服务器设置为一个学生项目。它要做的一件事是接收文件并在本地扫描。我为发布请求实现了一个功能,如下所示:
svr.Post("/scan", [&](const httplib::Request& req, httplib::Response& res){
std::string body = req.body;
qDebug() << "Creating local file...";
QTemporaryFile inputFile;
inputFile.open();
qDebug() << "Writing to local file...";
if(inputFile.write(body.c_str()) != -1){
qDebug() << "Writing finished. Closing local file...";
qDebug() << "Scanning local file...";
QCryptographicHash hash(QCryptographicHash::Algorithm::Sha1);
hash.addData(&inputFile);
qDebug() << "hash: " << QString::fromStdString( hash.result().toHex().toStdString() );
res.set_content(myEngine.scan(inputFile).toJson().toStdString(), "text/plain");
}else{
res.set_content("Failed to write file", "text/plain");
qDebug() << "Failed writing. Closing local file...";
}
inputFile.close();
});
发生的事情是,我用QT创建了一个临时文件,将其打开,使用其write()函数将请求的主体写入文件中。写入后,我将其写为SHA1用于调试目的,然后使用“ myEngine.scan()”函数对其进行扫描。 “ myengine.scan()”函数返回一个包含扫描结果的JsonDocument,我将其转换为作为答复发送的字符串。
现在,'myEngine.scan()'可以按预期工作,它基本上只是检查文件的哈希是否包含在数据库中。
然后我使用curl发送请求:
curl -X POST --data-binary "@music_video.mp4" localhost:1234/scan
当我发送一个简单的文件(例如.sh可运行脚本或.txt文本文件)时,该文件将经过检查,扫描并返回预期值,一切都很好。服务器端的哈希码与客户端端的哈希码相同。
但是,当我通过.mp4媒体文件或.png屏幕截图文件发送邮件时,服务器端的哈希码与客户端端的哈希码不同。服务器端的QTemporaryFile已损坏,与客户端文件不同,因此扫描结果不是预期的结果。
与邮递员尝试过,结果相同。 尝试弄乱,例如使用
curl -X POST --header "Content-Type:text/plain;charset=UTF-8" --data-raw "@screenfetch.png" http://localhost:1234/scan
和其他类似的变体,但结果相同。 .mp4文件和.png文件在服务器端已损坏,而.txt和.sh文件到达时没有问题。
答案 0 :(得分:0)
写入临时文件时,请使用:
inputFile.write(body.c_str())
,它使用QIODevice::write(const char*)
(doc)
将数据从零终止的8位字符字符串写入到 设备。返回实际写入的字节数,或-1 如果发生错误
您可以假定要发布的文件肯定包含至少一个等于0的字节。遇到该文件后将不写入任何内容,并且只能在临时文件中写入原始文件的截短版本。
您应像这样使用QIODevice::write(const char *data, qint64 maxSize)
(doc):
if (inputFile.write(body.c_str(), body.size()) == body.size()) {
// The temporary file has been written
}