QT 通过POST方法,上传文件到服务器

直接上代码:

第一种方法:

QUrl url;
url.setUrl(makeFullUrl(m_opt.submitdebateresult.url));
#if QT_VERSION >= 0x050000
QUrlQuery q;
addSessionIdQueryItem(&q);
q.addQueryItem(m_opt.submitdebateresult.query.mediaId, param.mediaId());
q.addQueryItem(m_opt.submitdebateresult.query.exerciseId, param.exerciseId());
url.setQuery(q);
#else
addSessionIdQueryItem(&url);
url.addQueryItem(m_opt.submitdebateresult.query.mediaId, param.mediaId());
url.addQueryItem(m_opt.submitdebateresult.query.exerciseId, param.exerciseId());
#endif
QNetworkRequest request;
request.setUrl(url);

      //这里两个分支分别代码QT5及以主和QT4.8 的的url加参数的方法。

request.setHeader(QNetworkRequest::ContentTypeHeader, QLatin1String("application/octet-stream"));

// 上面这句,是代码以二进制流的方式post数据。

<span style="font-size:14px;background-color: rgb(255, 255, 255);"><strong>      QFile file(filePath);  // 这里是你自己的文件路径
      file.open(QIODevice::ReadOnly);
      int file_len = file.size();
      QDataStream in(&file);
      m_buf = new char[file_len];
      in.readRawData( m_buf, file_len);
      file.close();</strong></span>

QByteArray dataArray = QByteArray(m_buf, fileLength);
m_netReply = m_networkAccessManager->post(request , dataArray);

connect(m_netReply, SIGNAL(uploadProgress ( qint64 ,qint64 )), this, SLOT( slotUploadProgress(qint64 ,qint64)));
connect(m_netReply, SIGNAL(finished()), this, SLOT(slotUploadFinished()));


第二种方法:

比第一种简单,但效率没第一种高,只写主要代码。

QFile file(filePath);
file.open(QIODevice::ReadOnly);
data = file.readAll();
file.close();

m_netReply = m_networkAccessManager->post (request, "file="+data.toBase64 ()+"");

       // 这里是把文件转成base64的,好处是,防止文件传的过程因为符号,空格的原因,导致文件数据失真。
connect(m_netReply, SIGNAL(uploadProgress ( qint64 ,qint64 )), this, SLOT( slotUploadProgress(qint64 ,qint64)));
connect(m_netReply, SIGNAL(finished()), this, SLOT(slotUploadFinished()));




  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
以下是一个 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` 类进行构建。如果请求成功,函数会打印一条提示信息;否则,会打印错误信息。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小K小Q

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值