使用Qt c++上传Facebook照片错误

Facebook photo upload error using Qt c++

本文关键字:照片 错误 Facebook 上传 Qt c++ 使用      更新时间:2023-10-16

我试图上传一张图片到Facebook,但它总是返回一个错误:"{"error":{"message":"(#324) Requires upload file","type":"OAuthException","code":324,"fbtrace_id":"Fsi2f/H6ggp"}}" 。我正在使用Qt 4.8,并在我的代码中设置如下所述的多部分请求。

QFile file(m_fileName);
QFileInfo fileInfo(m_fileName); // to get info on the file
bool open = file.open(QIODevice::ReadOnly);
if(open){
    // start the upload
    QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
    QHttpPart privacyPart;
    privacyPart.setHeader(QNetworkRequest::ContentTypeHeader, "text/plain; charset=UTF-8");
    privacyPart.setHeader(QNetworkRequest::ContentDispositionHeader, "form-data; name="privacy"");
    privacyPart.setBody("{"value":"FRIENDS_OF_FRIENDS"}");
    QHttpPart filePart;
    filePart.setHeader(QNetworkRequest::ContentTypeHeader, "image/png");
    filePart.setHeader(QNetworkRequest::ContentDispositionHeader, "form-data; name="source"; filename = "" + fileInfo.fileName() + """);
    filePart.setRawHeader("Content-Transfer-Encoding", "binary");
    filePart.setBody(file.readAll());
    multiPart->append(privacyPart);
    multiPart->append(filePart);

    QNetworkRequest request(url);
    request.setRawHeader("Authorization", "OAuth " + accessToken.toUtf8());
    QNetworkReply* reply = m_networkAccessManager->post(request, multiPart);
    multiPart->setParent(reply); // delete multipart with reply
    // connect signals
    connect(reply, SIGNAL(uploadProgress(qint64,qint64)), this, SLOT(uploadProgress(qint64,qint64)));
    connect(reply, SIGNAL(finished()), this, SLOT(replyFinished()));
}
else{
    qDebug() << "Unable to open file" << fileName();
    qDebug() << file.errorString();
}

我设法解决了手动写入数据的问题。下面的代码工作完美,不确定我做错了什么与QHttpMultiPart。我希望有人能指点我一下。

// start the upload
QString boundary("----eidevelop1010101010");
QString contentType("multipart/form-data; boundary="+boundary);
QByteArray data;
data += QString("--"+boundary + "rn").toUtf8();
data += QString("Content-Disposition: form-data; name="source";filename="+fileInfo.fileName()+"rn").toUtf8();
data += QString("Content-Type: image/jpegrnrn").toUtf8();
data += file.readAll();
data += "rn";
data += QString("--" + boundary + "rn").toUtf8();
data += QString("--" + boundary + "rn").toUtf8();
QNetworkRequest request(url);
request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant(contentType));
request.setHeader(QNetworkRequest::ContentLengthHeader, QVariant(QString::number(data.size())));
QNetworkReply* reply = m_networkAccessManager->post(request, data);
// connect signals
connect(reply, SIGNAL(uploadProgress(qint64,qint64)), this, SLOT(uploadProgress(qint64,qint64)));
connect(reply, SIGNAL(finished()), this, SLOT(replyFinished()));