使用cpp-httplib传输文件时出现问题

时间:2019-01-25 13:31:39

标签: c++ qt curl

在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文件到达时没有问题。

1 个答案:

答案 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
}