使用 NetworkManager 上传文件不起作用

2024-02-08

因此,我尝试使用 Qt Network Mangager 将一个简单的文本文件上传到我正在服务的 php 脚本中。但这不起作用。我尝试了使用 QHttpMultiPart 和在请求中设置原始数据标头的示例,但没有任何效果。

这是我的 Qt 代码:

#include <QCoreApplication>

#include <QNetworkReply>
#include <QNetworkRequest>
#include <QDebug>
#include <QEventLoop>
#include <QObject>
#include <QVariantMap>
#include <QJsonDocument>
#include <QFile>
#include <QHttpMultiPart>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QString address = "http://localhost/api_test/";
    //address = "https://dashboard.viewmind.ai/dashboard/api_test/welcome.php";

    QUrl api_url = QUrl(address);

    QVariantMap postDatamap;
    postDatamap.insert("Name","Ariel Ñoño");
    postDatamap.insert("Age",37);

    QJsonDocument json = QJsonDocument::fromVariant(postDatamap);

    qDebug() << "Sending the request";
    QNetworkAccessManager *networkManager = new QNetworkAccessManager();
    QNetworkRequest request(api_url);


    QString bound = "<<<<<boundary>>>>>";
    request.setRawHeader(QString("Content-Type").toUtf8(),QString("multipart/form-postData; boundary=" + bound).toUtf8());


    //QByteArray postData;
    QByteArray postData(QString("--" + bound + "\r\n").toUtf8());
    postData.append("Content-Disposition: form-postData; name=\"action\"\r\n\r\n");
    postData.append("welcome.php\r\n");
    postData.append(QString("--" + bound + "\r\n").toUtf8());
    postData.append("Content-Disposition: form-postData; name=\"uploaded\"; filename=\"");
    postData.append("test.json");
    postData.append("\"\r\n");
    postData.append("Content-Type: text/xml\r\n\r\n"); //postData type

    QFile file("test.json");
        if (!file.open(QIODevice::ReadOnly)){
            qDebug() << "QFile Error: File not found!";
            delete networkManager;
            return 0;
        } else { qDebug() << "File found, proceed as planned"; }

    postData.append(file.readAll());
    postData.append("\r\n");
    postData.append(QString("--" + bound + "\r\n").toUtf8());

    request.setRawHeader(QString("Content-Length").toUtf8(), QString::number(postData.length()).toUtf8());


    //request.setHeader(QNetworkRequest::ContentTypeHeader,"application/json; charset=utf-8");
    //request.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-postData; name=\"text\""));
    //qDebug() << QString(json.toJson());

    //QHttpMultiPart multipart(QHttpMultiPart::FormDataType);
    //QHttpPart textPart;

//    QFile file("test.json");
//    if (!file.open(QIODevice::ReadOnly)){
//        qDebug() << "Could not open file for reading";
//        delete networkManager;
//        return 0;
//    }
    //textPart.setBodyDevice(&file);
    //multipart.append(textPart);
    //file.setParent(&multipart);

    //QNetworkReply *reply = networkManager->post(request,json.toJson());
    //QNetworkReply *reply = networkManager->post(request,file.readAll());
    //QNetworkReply *reply = networkManager->post(request,&multipart);
    QNetworkReply *reply = networkManager->post(request,postData);
    //file.setParent(reply);
    //multipart.setParent(reply);

    // Using the loop to wait for the reply to finish.
    QEventLoop loop;
    QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
    loop.exec();

    qDebug() << "Reply is finished";

    //file.close();

    if (reply->error() != QNetworkReply::NoError){
        qDebug() << "The following error ocurred";
        qDebug() << reply->errorString();
        return 0;
    }

    QString postData_returned = QString::fromUtf8(reply->readAll());

    qDebug() << "DATA RETURNED";
    qDebug() << postData_returned;

    return 0;
}

我的 php 代码如下所示

<?php
header("Access-Control-Allow-Origin: *");  // Anyone can access
header("Content-Type: application/json; charset=UTF-8"); // Will return json data. 

error_log("FILES iS");
vardump_toerror($_FILES);

?>

据我了解, $_FILES 超级全局应该填充文件信息。我错了吗?但打印出来显示它是空的。


我不是 PHP 专家,但我发现没有必要使用内容类型 application/json,因为 multipart(提交表单)不是该协议的一部分。另一方面,我找不到参考资料vardump_toerror功能所以我改变var_dump所以我的测试 php 是:

<?php
  var_dump($_FILES);
?>

In a 上一个问题 https://stackoverflow.com/questions/55129643/pyqt5-and-django-how-to-upload-image-using-http-request-multipart-form/55132547#55132547对于 PyQt5,我为 django 实现了类似的逻辑,该逻辑也适用于本例,因此我将展示翻译。

#include <QCoreApplication>
#include <QFile>
#include <QHttpMultiPart>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QTextCodec>

QHttpMultiPart *buildMultpart(const QVariantMap & data, const QMap<QString, QString> filenames){

    QHttpMultiPart *multipart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
    QVariantMap::const_iterator i_data = data.constBegin();
    while (i_data != data.constEnd()) {
        QHttpPart postpart;
        postpart.setHeader(QNetworkRequest::ContentDispositionHeader, QString("form-data; name=\"%1\"").arg(i_data.key()));
        postpart.setBody(i_data.value().toByteArray());
        multipart->append(postpart);
        ++i_data;
    }
    QMap<QString, QString>::const_iterator i_filenames = filenames.constBegin();
    while (i_filenames != filenames.constEnd()) {

        QFile *file = new QFile(i_filenames.value());
        if(!file->open(QIODevice::ReadOnly)){
            delete  file;
            continue;
        }
        QHttpPart postpart;
        postpart.setHeader(QNetworkRequest::ContentDispositionHeader,
                           QString("form-data; name=\"%1\"; filename=\"%2\"")
                           .arg(i_filenames.key(), file->fileName()));
        postpart.setBodyDevice(file);
        multipart->append(postpart);
        file->setParent(multipart);
        ++i_filenames;
    }
    return multipart;
}


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QUrl url("http://localhost:4000/upload.php");
    QNetworkAccessManager manager;
    QMap<QString, QString> filenames;
    filenames["fileToUpload"] = "/path/of/data.txt";
    QHttpMultiPart *multipart = buildMultpart({}, filenames);
    QNetworkRequest request(url);
    QNetworkReply *reply = manager.post(request, multipart);
    multipart->setParent(reply);
    QObject::connect(reply, &QNetworkReply::finished, QCoreApplication::quit);
    a.exec();
    if(reply->error() == QNetworkReply::NoError){
        qDebug() << reply->readAll();
    }
    else{
        qDebug() << reply->error() << reply->errorString();
    }
    delete reply;

    return 0;
}

Output:

"array(1) {\n  [\"fileToUpload\"]=>\n  array(5) {\n    [\"name\"]=>\n    string(8) \"data.txt\"\n    [\"type\"]=>\n    string(0) \"\"\n    [\"tmp_name\"]=>\n    string(14) \"/tmp/phpVmOAhO\"\n    [\"error\"]=>\n    int(0)\n    [\"size\"]=>\n    int(6)\n  }\n}\n"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 NetworkManager 上传文件不起作用 的相关文章

  • 我无法访问 XAMPP phpMyAdmin;它说:错误 MySQL 说:文档无法连接:无效设置

    完整错误消息 Error MySQL said Documentation Cannot connect invalid settings Connection for controluser as defined in your conf
  • 如何在代码输出中显示 PHP 错误?

    当通过浏览器执行PHP页面时 我们只会得到输出 但不会得到代码中的错误 如何查看后端代码发生的错误 我在代码中使用以下内容进行错误报告 error reporting E ALL E ALL ini set display errors 1
  • Shift+Enter 按钮用于提交表单

    我想使用 Shift Enter 按钮提交表单 而不是简单地按 Enter 按钮 请帮助我 如果您仍然想这样做 尽管这会带来可用性问题 form keydown function e if e keyCode 13 e shiftKey W
  • 将 bcrypt 密码哈希从 PHP 迁移到 Python - ValueError:无效的 hashed_pa​​ssword salt

    我有一个 PHP7 应用程序 它可以像这样对用户密码进行哈希处理 hash password hash password PASSWORD BCRYPT 例如 如果我通过test1234为此 我有 2y 10 aazE9OUKZlOQiM6
  • file_get_contents 获取 php 内容!我需要 html 中的源代码

    我正在尝试使用 file get contents 获取 php 文件的 html 内容 但我无法管理它 无论我做什么 它都需要 php 内容 所以我希望您理解并可以帮助我 脚本的代码
  • PHP 联系表单未提交

    您好 我之前曾成功使用过这个非常简单的 php 联系脚本 但当我尝试在新的 HTML 页面上实现它时 表单不会提交 任何人都可以看到任何明显的错误吗 任何帮助将非常感激 这是表单的 html div div
  • 奇怪的 500 内部服务器错误(firebug、php、display_errors、ajax)

    在一页上我正在进行多个 AJAX 调用 所有调用均成功返回响应 但最后一个调用 与其他 ajax 调用无关 返回 500 内部服务器错误作为响应代码 如 firebug 所示 但是 尽管存在错误代码 该 AJAX 调用仍会返回正确的内容 令
  • 如何从 PHP 访问表单的“名称”变量

    我正在尝试创建一个 BMI 计算器 这应该允许人们使用公制或英制测量单位 我意识到我可以使用隐藏标签来解决我的问题 但这之前曾困扰过我 所以我想我会问 我可以使用 POST variableName 查找提交的变量名字段值 但是 我不知道或
  • 在 WordPress 中调用自定义 php 模板中的函数

    我想调用我在 WordPress 中编写的另一个 php 类中的函数 但是我对语法感到困惑 例如要获取页面上的标题 您只需调用 get header 等等 但是我如何调用特定类中的函数 例如 在index php中 我想调用一个名为this
  • 从数值中获取颜色值

    我需要一个项目从值中获取颜色 我解释说 我有日期 每个数据必须用颜色表示 红色代表最大值 蓝色代表最小值 绿色代表中间值 一种热图 所以 我需要一个返回正确颜色的函数 我尝试过这样的事情 function datatocolor min m
  • 如何在使用 echo 时将字符串与函数调用连接起来?

    我想在我的 echo ed html 字符串中使用两个函数调用返回的值 li a href the permalink the title a li 以下工作正常 echo li a href echo the title echo a l
  • 什么会导致 PHP 变量被服务器重写?

    我的公司给了我一个虚拟机来安装网络软件 但我遇到了一个相当奇怪的问题 如果 PHP 变量与特定模式匹配 服务器就会覆盖 重写 它们 什么可以像这样重写 PHP 变量 以下是一个完整的独立脚本
  • Wordpress 编辑器中的“application/gas-events-abn”对象是什么?

    我正在使用 Wordpress 创建博客 我注意到当我多次保存帖子时 代码中会出现一个奇怪的元素 在帖子底部创建一个大的空白区域 代码如下所示 post content nbsp 每次我编辑帖子时 我都必须将其删除 Joomla 有时也会发
  • Preg_split 用逗号,忽略括号,PHP

    我必须分割一个字符串 并且我想避免用括号内的逗号分割它 那么我该如何实现呢 Example string string1 sString1 sString2 ssString1 ssString2 string2 string3 resul
  • 如何在 Yii 框架中从数据库中获取所有表名和列名

    我正在开发一个模块 我想在其中执行动态相关下拉表和列名称功能 前任 获取所有表名称并将其显示在下拉字段中 选择特定表后 我想在下拉字段中再次显示其所有列名称 问题是 1 如何从数据库中获取所有表名 2 如何从表中获取所有列名 我尝试了一些文
  • Php mod_rewrite 无法正常工作

    我有一个带有以下链接结构的 php 页面 http localhost wisper businesspage php profile creativeartbd 所以我尝试将此链接转换为以下样式 http localhost wisper
  • 以编程方式添加数字签名外观?

    我正在以编程方式对我的 PDF 文件进行签名 并且我想将签名外观添加到 PDF 我需要哪些对象才能实现此目的 我知道我必须Annotations BBox and XObject但我真的不知道按什么顺序以及是否需要其他东西 调试此类内容以找
  • 使用 Laravel Intervention 库缓存动态图像不起作用

    我目前正在使用 Laravel 5 并利用干预图像集成 http image intervention io http image intervention io 我动态地使用它 因此图像具有如下 URL http example org
  • JSON 编码和大引号

    我在 PHP 5 的本机实现中遇到了一个有趣的行为json encode 显然 当将对象序列化为 json 字符串时 编码器将清空包含 卷曲 引号的字符串的任何属性 这种类型可能会在启用自动转换的情况下从 MS Word 文档中复制粘贴 这
  • 使用 Ajax 和 PHP 上传图像

    我想将图像上传到我的服务器 并控制 HTML 代码中的 PHP 回显 为此 我想使用 jQuery Ajax 但我不知道如何使用 Ajax 将图像发送到 PHP 这是一个大学项目 所以我不能使用任何类型的插件 我的实际代码 HTML

随机推荐

  • 将纬度和经度转换为十进制值

    我的 GPS 信息以以下形式呈现 北纬 36 57 9 西经 110 4 21 我可以使用Chris Veness 的 javascript 函数 http www movable type co uk scripts latlong ht
  • Golang,goroutines:恐慌:运行时错误:无效的内存地址

    我对 golang 相当陌生 并试图理解主要原理并使用通道编写基于 gouroutines 的代码 在我使用的其他语言中没有这样的工具 我想知道是否会出现诸如恐慌之类的错误 我的代码 package main import fmt impo
  • jQuery getJSON 不适用于已删除的抽搐频道

    我正在尝试制作一个抽搐频道列表 显示谁在线 离线 并显示该人已删除该帐户的消息 问题是 如果人员帐户不再存在 即使请求返回带有几个属性的 JSON 文件 getJSON 方法内部也不会起作用 代码笔 http codepen io Zach
  • 使用 C# 测量 TCP 上的数据传输速率

    我想测量当前的下载速度 我正在通过 TCP 发送巨大的文件 我怎样才能捕获每秒的传输速率 如果我使用 IPv4InterfaceStatistics 或类似方法 我将捕获设备传输速率 而不是捕获文件传输速率 捕获设备传输速率的问题在于 它捕
  • 自连接查询

    考虑下表 mysql gt select from phone numbers number type person id 17182225465 home 1 19172225465 cell 1 12129876543 home 2 1
  • android中ListView无法点击?

    我使用联系人同步制作了一个应用程序 我列出了以下联系信息 包括照片 姓名和电话号码 我成功地在自定义中列出了所有这些内容ListView 但我无法点击ListView 看起来像是被锁定了 无法点击 但我对另一项活动做了同样的程序 使用自定义
  • 在 LINQ 中对集合的集合进行交集

    我有一个要相交的列表列表 List
  • Hibernate JPA ManyToOne 复合键

    我正在尝试设置我的实体以允许 pks 我的数据库由两个字段组成 Dealer detail id pk user detail id pk 两者都根据相应表中的 id 进行连接 到目前为止我已经尝试过但没有成功 Embeddable pub
  • Git Pull 请求没有更改,但 git diff 显示更改

    我的分支机构有问题 介绍 我的项目有 3 个分支 Dev Main 和 Staging On Dev分支我们添加新功能 Main我们修复错误的分支Staging我们部署用于测试 当 Bug PullRequest 完成时Main分支 我们发
  • 使用 VSTS 和 Azure 时正确管理应用程序设置

    如果使用 VSTS 和 Azure 有两种不同的方法来管理应用程序设置 请记住 这只是用于持续部署的工具的示例 您可以覆盖 VSTS 中 CD 管道中的 JSON 文件 旧系统中的 Web 配置 也可以覆盖 Azure 应用程序设置 部分中
  • ElasticSearch——根据字段值提高相关性

    需要在 ElasticSearch 中找到一种方法来根据字段的特定值提高文档的相关性 具体来说 我的所有文档中有一个特殊字段 该字段值越高 包含该字段的文档就越相关 无论搜索如何 考虑以下文档结构 all enabled true prop
  • 如何在 React-Native (JavaScript) 中显示文本更多/更少

    我正在开发反应本机应用程序 在其中 我们展示了一些描述Text 可能是行数 因此 如果数据超过 3 行 如果扩展 我必须显示更多和更少
  • 如何将 (mxn) 维的 Numpy 数组展开为单个向量

    我只想知道是否有将 numpy 数组展开为单个向量的捷径 例如 将以下 Matlab 代码转换为 python Matlab方式 A 零 10 10 A unroll A 预先感谢 这是你的想法吗 编辑 正如 Patrick 指出的 将 A
  • 有没有办法显示密码执行计划?

    我看到过一个话题 了解 Neo4j Cypher Profile 关键字和执行计划 https stackoverflow com questions 17760627 understanding neo4j cypher profile
  • 是否可以在 p:columns 标签内使用 p:cellEditor?

    我有一个 primefaces 数据表 可以动态获取其列 我希望它的单元格可以使用 primefaces cellEditor 进行编辑 如图所示here http www primefaces org showcase ui datata
  • Android - 全局变量?

    我需要在我的应用程序中存储一些数据 我知道我可以这样做 class public class MyApplication extends Application private String someVariable public Stri
  • 包含动态按钮的旋转框架布局

    我有一个 Framelayout 它在运行时添加四个图像视图 并且在中心它包含主图像 用户可以使用该主图像执行不同的操作 但我面临旋转布局视图的问题 目前正在触摸旋转按钮我正在这样做 public void setRotateListene
  • 如何使用通用视图在视图中设置模型的字段?

    我有一个模型 它有一个作者ForeignKey 像这样 class Appointment models Model author models ForeignKey User 我想要author为当前登录用户创建约会时自动设置的字段 换句
  • 跨源资源共享 (CORS) 是否区分 HTTP 和 HTTPS?

    我有两个网站 https www domain only uses https com 和 www domain uses both http and https com 现在我在前者到后者的页面中发出2个ajax GET请求 一个是 ht
  • 使用 NetworkManager 上传文件不起作用

    因此 我尝试使用 Qt Network Mangager 将一个简单的文本文件上传到我正在服务的 php 脚本中 但这不起作用 我尝试了使用 QHttpMultiPart 和在请求中设置原始数据标头的示例 但没有任何效果 这是我的 Qt 代