使用Qt发送二进制文件到服务器的post请求

6

在Qt中,我需要使用post方法将一个sqlite文件(二进制文件)上传到网站。所以我打开文件并尝试将其内容读入QByteArray中,然后使用QNetworkRequest的帮助将其发送到服务器。我可以处理请求,因为文件已经被发送到了服务器,但是文件却是空的。我的代码有什么问题吗?(我知道文件存在)

QByteArray data;
QFile file("database.sqlite");
if (!file.open(QIODevice::ReadWrite))
    return;

QDataStream in(&file);
in.setVersion(QDataStream::Qt_4_6);
in >> data ;

QString boundary;
QByteArray dataToSend; // byte array to be sent in POST

boundary="-----------------------------7d935033608e2";

QString body = "\r\n--" + boundary + "\r\n";
body += "Content-Disposition: form-data; name=\"database\"; filename=\"database.sqlite\"\r\n";
body += "Content-Type: application/octet-stream\r\n\r\n";
body += data;
body += "\r\n--" + boundary + "--\r\n";
dataToSend = body.toAscii();

QNetworkAccessManager *networkAccessManager = new QNetworkAccessManager(this);
QNetworkRequest request(QUrl("http://www.mydomain.com/upload.aspx"));
request.setRawHeader("Content-Type","multipart/form-data; boundary=-----------------------------7d935033608e2");
request.setHeader(QNetworkRequest::ContentLengthHeader,dataToSend.size());
connect(networkAccessManager, SIGNAL(finished(QNetworkReply*)),this, SLOT(sendReportToServerReply(QNetworkReply*)));
QNetworkReply *reply = networkAccessManager->post(request,dataToSend); // perform POST request
2个回答

7
不要使用QString来编写正文,应改用QByteArray。以下代码: body += data; 在大多数情况下不会附加整个文件。
data是一个QByteArray,当转换为QString时,将在第一个\0处被截断。您上传的文件将无法使用。
请使用答案中提供的链接中提供的示例。

1
接受的答案是错误的,原因在你的回答中已经解释了。感谢你澄清了这一点。 - Bret Kuhns

3
您不需要使用QDataStream。只需执行以下操作:
body += file.readAll()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接