php - QHttpMultiPart 上传多个文件

标签 php c++ qt

我正在尝试通过我的应用程序将多个文件上传 (POST) 到网络服务器。 PHP 结束工作,因为我使用 cURL 上传,但我想通过 Qt 做同样的事情。

我看过这个example , 但我不确定如何将其转换为上传多个文件。

QUrl url(connServer + "/api.php");
QNetworkRequest request(url);

QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);

QString preview_path  = "C:/preview.jpg";
QHttpPart previewPathPart;
previewPathPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"preview_path\""));
previewPathPart.setBody(preview_path.toLatin1()); /* <-------------- I'm stumped here */
multiPart->append(previewPathPart);

for (int i=0;i<list.size();i++) {
    qDebug(list[i].toStdString().c_str());
    continue;

    QString filename = list[i];

    QHttpPart previewFilePart;
    previewFilePart.setHeader(QNetworkRequest::ContentTypeHeader,    QVariant("image/jpeg"));
    previewFilePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"preview_file\"; filename=\""+ filename + "\""));
    QFile *file = new QFile(preview_path);

    file->open(QIODevice::ReadOnly);
    previewFilePart.setBodyDevice(file);
    file->setParent(multiPart); // we cannot delete the file now, so delete it with the multiPart

    multiPart->append(previewFilePart);
}

QNetworkAccessManager *networkManager = new QNetworkAccessManager(this);
QNetworkReply* reply = networkManager->post(request, multiPart);
multiPart->setParent(reply); // delete the multiPart with the reply

connect(reply, SIGNAL(finished()), this, SLOT  (uploadReply()));
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT  (uploadError(QNetworkReply::NetworkError)));
connect(reply, SIGNAL(uploadProgress(qint64, qint64)), this, SLOT  (uploadProgress(qint64, qint64)));

QHttpMultiPart 的哪些部分应该设置一次,哪些部分应该为每个文件设置多次?

最佳答案

上面的代码很接近,但我只需要弄清楚哪些代码指定了一次性变量,哪些代码指定了文件。此代码适用于上传多个文件。但是……一次只能上传20个文件。不确定这是 Qt 的限制还是其他什么。我的等效 Perl/cURL 程序可以毫无问题地将数百个文件上传到同一个 PHP 页面。

QUrl url(connServer + "/api.php");
QNetworkRequest request(url);

QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);

QHttpPart loginPart;
/* username */
loginPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"u\""));
loginPart.setBody(connUsername.toLatin1());
multiPart->append(loginPart);
/* password */
loginPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"p\""));
loginPart.setBody(connPassword.toLatin1());
multiPart->append(loginPart);
/* action */
loginPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"action\""));
loginPart.setBody("UploadDICOM");
multiPart->append(loginPart);

/* loop through the list of files */
ui->progUpload->setRange(0,100);
for (int i=0;i<list.size();i++) {
    qDebug("UploadFileList [%d] [%s]", i, list[i].toStdString().c_str());
    QFile *file = new QFile(list[i]);
    QHttpPart filePart;
    /* important that the files[] variable have the brackets, for PHP to interpret correctly */
    filePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"files[]\"; filename=\""+ file->fileName() + "\""));

    file->open(QIODevice::ReadOnly);
    filePart.setBodyDevice(file);
    file->setParent(multiPart); // we cannot delete the file now, so delete it with the multiPart
    multiPart->append(filePart);
}

QNetworkAccessManager *networkManager = new QNetworkAccessManager(this);
QNetworkReply* reply = networkManager->post(request, multiPart);
multiPart->setParent(reply); // delete the multiPart with the reply
connect(reply, SIGNAL(finished()), this, SLOT(onGetReply()));
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT  (uploadError(QNetworkReply::NetworkError)));
connect(reply, SIGNAL(uploadProgress(qint64, qint64)), this, SLOT  (uploadProgress(qint64, qint64)));

关于php - QHttpMultiPart 上传多个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23344370/

相关文章:

php - 链接存储在变量中,并且想在php中从中获取参数

php - jqgrid 编辑操作如何将变量发送到服务器?

c++ - C++中如何从内部类访问外部类对象

c++ - 使用 CMake 和 C++ 运行 mysql-connector?

linux - 如何为arm-v7交叉编译qt应用程序

macos - 在 Mac 上使用 QT 5.3 设置应用程序图标时出现问题

php - 文件上传验证

php - Laravel 4 Eloquent 按关系日期分组

C++搜索MAX的 vector ,并从第二个 vector 中获得相同的位置

c++ - 我想使用 Qxt 的跨度 slider 而无需安装它。这可能吗?