通过QHttpMultiPart发送文件会冻结



我想发送"big"文件(~100MB)到我的RestAPI,但我遇到了QHttpMultiPart的问题。

我用来将本地文件从客户端发送到服务器的代码非常简单:

// Create multi-part
QHttpMultiPart* multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);

// Open file
QFile* file = new QFile(myFilePath);
file->setParent(multiPart);
// -- snip: Check if opening the file was success full --

// Create file part
QHttpPart filePart;
filePart.setHeader(QNetworkRequest::ContentTypeHeader,
QVariant("multipart/form-data"));
filePart.setHeader(QNetworkRequest::ContentDispositionHeader,
QVariant("form-data; name="file"; filename="" +
file->fileName() + """));
filePart.setBodyDevice(file);   // <--- Set the file as body device

// Add file part
multiPart->append(filePart);

// Setup request
QNetworkRequest testRequest { myApiUrl };
testRequest.setHeader(QNetworkRequest::ContentTypeHeader,
"multipart/form-data");
testRequest.setHeader(QNetworkRequest::ContentDispositionHeader,
QVariant("form-data; name="file"; filename="" +
myFileName + """));
// -- snip: Some SSL configuration --
// Send request
auto reply = m_networkAccessManager.post(testRequest, multiPart);
m_testReply.reset(reply);

上面的代码对于非常小的文件(带有一些单词作为内容的.txt文件)工作得很好,但是如果文件变大(例如带有202KB的pdf文件)就会失败。我看到过这样的stackoverflow对话:用POST上传大文件会冻结系统(参见解决方案),从我看到的情况来看,我并没有做什么真正不同的事情,但我的应用程序仍然冻结。

我的RestAPI正在等待一个"multipart/…"类型的流,它接收并处理这个小文件很好。对于更大的文件,它会在等待块到达时阻塞,并且永远不会继续。

我已经连接了一些插槽到QNetworkReply的信号,以获得关于我的请求进度的通知:

connect(m_testReply.get(), &QNetworkReply::uploadProgress,
[](qint64 bytesSent, qint64 bytesTotal)
{
qDebug() << QString::number(bytesSent) + " of " +
QString::number(bytesTotal) + " uploaded";
});
connect(m_testReply.get(), &QNetworkReply::finished,
[]()
{
qDebug() << "Upload finished!";
});

它似乎总是在发送第一个块后停止,所以我的输出是:"16381" of "201324" uploaded。我怀疑小文件上传成功,只是因为只有一个块要上传。

谢谢你的帮助。

我找到问题了。

我已经调用:file->open(QIODevice::ReadOnly | QIODevice::Text),而我正在阅读的文件不是文本,只需通过打开文件:file->open(QIODevice::ReadOnly)修复它。

最新更新