【问题标题】:Send binary file to server using post with Qt使用带有 Qt 的 post 将二进制文件发送到服务器
【发布时间】:2011-02-10 14:03:26
【问题描述】:

在 Qt 中,我需要使用 post 将 sqlite 文件(二进制文件)发送到网站。所以我要做的是打开文件并尝试将它的内容读入一个 QByteArray,我在 QNetworkRequest 的帮助下可以发送到服务器。我可以在文件发送到服务器时处理请求,但文件只是空的。我读错了 sqlite 文件的内容吗? (我知道文件存在)你能看出我的代码有什么问题吗?

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

【问题讨论】:

    标签: qt file post binary


    【解决方案1】:

    您不需要 QDataStream。做吧

    body += file.readAll()
    

    【讨论】:

      【解决方案2】:

      不要使用 QString 来编写正文,而是使用 QByteArray。 线 正文 += 数据; 在大多数情况下不会附加整个文件。

      data 是一个 QByteArray ,当转换为 QString 时,将在第一个 \0 处截断。 您上传的文件将无法使用。

      使用其中一个答案的链接中提供的示例。

      【讨论】:

      • 由于您的答案中解释的原因,接受的答案是错误的。感谢您清理它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-16
      • 1970-01-01
      • 2015-08-05
      • 2015-05-16
      • 1970-01-01
      相关资源
      最近更新 更多