Qt HTTP post文件

用Qt与服务器进行文件交互,开始想的用ftp,由于文件不大,不超过2M,所以互联网的同事建议用HTTP post。下面把Qt post文件的方法记录一下。

bool CImpedianceReport::PostPicture(int report_id, QString fileName)
{
    //设置发送的数据
    bool bRet = false;
    QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);

    //
    QHttpPart utPart;
    utPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(QString("form-data; name=\"record_rcc_id\"")));
    utPart.setBody(QByteArray::number(report_id));

    //
    QHttpPart imagePart;
    imagePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(QString("form-data; name=\"%1\"; filename=\"%2\"")
                                                                            .arg("file1").arg(QFileInfo(fileName).fileName())));
    QFile *file = new QFile(fileName);      //由于是异步,所以记得一定要new
    file->open(QIODevice::ReadOnly);
    imagePart.setBodyDevice(file);          //方便后续内存释放
    file->setParent(multiPart); // we cannot delete the file now, so delete it with the multiPart
    imagePart.setHeader(QNetworkRequest::ContentTypeHeader, "image/png");

    //
    multiPart->append(utPart);
    multiPart->append(imagePart);

    //设置头信息
    QNetworkRequest networkRequest;
    networkRequest.setUrl(QUrl("http://report.cgwzjs.com/index.php/Api/report/uploadfiles"));

    //发送请求
    QEventLoop loop;
    QNetworkAccessManager manager;
    QObject::connect(&manager, SIGNAL(finished(QNetworkReply*)), &loop, SLOT(quit()));

    QNetworkReply *reply = manager.post(networkRequest, multiPart);
    multiPart->setParent(reply); // delete the multiPart with the reply
    loop.exec();

    QByteArray data = reply->readAll();
    qDebug() << QString(data);

    QNetworkReply::NetworkError error = reply->error();
    if(error == QNetworkReply::NoError)
    {
        //{"status":1,"msg":"上传成功","info":{"file_url":{"file1":"/Uploads/image/1/41.png"}}}
        Json::Value root;
        Json::Reader reader;
        if(reader.parse(data.data() ,root))
        {
            if(root["status"].asInt() == 1)
            {
                bRet = true;
            }
        }
    }
    else
    {
            qDebug() << "post file error:" << QString(data);
    }
    reply->deleteLater();
    return bRet;
}
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个 C++ Qt 实现 HTTP POST 请求的示例代码: ```cpp #include <QNetworkAccessManager> #include <QNetworkRequest> #include <QNetworkReply> #include <QUrlQuery> #include <QDebug> void postFileToServer(const QString& filePath, const QUrl& serverUrl) { QNetworkAccessManager* manager = new QNetworkAccessManager(); QNetworkRequest request(serverUrl); // 设置请求头 request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); // 读取文件内容 QFile file(filePath); if (!file.open(QIODevice::ReadOnly)) { qDebug() << "Failed to open file: " << filePath; return; } QByteArray fileData = file.readAll(); file.close(); // 构建请求参数 QUrlQuery params; params.addQueryItem("file_name", QFileInfo(file).fileName()); params.addQueryItem("file_data", QString(fileData.toBase64())); // 发送 POST 请求 QNetworkReply* reply = manager->post(request, params.toString(QUrl::FullyEncoded).toUtf8()); QObject::connect(reply, &QNetworkReply::finished, [reply]() { if (reply->error() == QNetworkReply::NoError) { qDebug() << "File uploaded successfully!"; } else { qDebug() << "Failed to upload file: " << reply->errorString(); } reply->deleteLater(); }); } ``` 该代码使用 Qt 的网络库实现了一个 HTTP POST 请求,将指定文件上传到指定的服务器。其中,`postFileToServer()` 函数接受两个参数,分别是文件路径和服务器 URL。函数内部使用 `QNetworkAccessManager` 类来发送网络请求,其中 POST 请求的参数使用 `QUrlQuery` 类进行构建。如果请求成功,函数会打印一条提示信息;否则,会打印错误信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值