I am trying to do the same in Qt, what already works with curl:
curl -u $USER:$PASSWORD -X POST -H "X-Atlassian-Token: nocheck" -F "[email protected]" -F "comment=File attached via REST API" \\n https://$SERVER/rest/api/content/$PAGEID/child/attachment
When I try to upload using the Qt code below, I get with my qWarning() statements:
Warning: Step: "upload attachment" ((null):0, (null))
Warning: Error: QNetworkReply::UnknownContentError ((null):0, (null))
Guess I don't build the form correctly, any hints?
void ConfluenceAgent::startUploadAttachmentRequest()
{
QString url = "https://" + baseURL + apiURL + "/content" + "/" + pageID + "/child/attachment";
QNetworkRequest request = QNetworkRequest(QUrl(url));
// Basic authentication in header
headerData = QString("Bearer %1").arg(personalAccessToken);
request.setHeader(QNetworkRequest::ContentTypeHeader, "multipart/formdata");
request.setRawHeader("Authorization", headerData.toLocal8Bit());
request.setRawHeader("X-Atlassian-Token", "nocheck");
QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
QHttpPart imagePart;
imagePart.setHeader(
QNetworkRequest::ContentDispositionHeader,
QVariant("form-data; name=\"file\"; filename=\"image.png\""));
imagePart.setHeader(
QNetworkRequest::ContentTypeHeader,
QVariant("image/png"));
QFile *file = new QFile("image.png");
if (!file->open(QIODevice::ReadOnly))
qWarning() << "Problem opening file!";
imagePart.setBodyDevice(file);
multiPart->append(imagePart);
file->setParent(multiPart);
connect(
networkManager, &QNetworkAccessManager::finished,
this, &ConfluenceAgent::attachmentUploaded);
QNetworkReply *reply = networkManager->post(request, multiPart);
multiPart->setParent(reply);
}
bool ConfluenceAgent::wasRequestSuccessful(QNetworkReply *reply, const QString &requestDesc)
{
if (reply->error()) {
QString readAll = reply->readAll();
// Additionally print full error on console
qWarning() << " Step: " << requestDesc;
qWarning() << " Error: " << reply->error();
qWarning() << " Errorstring: " << reply->errorString();
qDebug() << " readAll: " << readAll;
qDebug() << " Request Url: " << reply->url() ;
qDebug() << " Operation: " << reply->operation() ;
qDebug() << "Request headers: ";
QList<QByteArray> reqHeaders = reply->rawHeaderList();
foreach( QByteArray reqName, reqHeaders )
{
QByteArray reqValue = reply->rawHeader( reqName );
qDebug() << " " << reqName << ": " << reqValue;
}
return false;
} else
return true;
}
void ConfluenceAgent::attachmentUploaded(QNetworkReply *reply)
{
networkManager->disconnect();
if (!wasRequestSuccessful(reply, "upload attachment"))
return;
QString r = reply->readAll();
// Show some more debug info
qDebug() << "CA::attachmentUploaded Successful. r=" << r;
QList<QByteArray> reqHeaders = reply->request().rawHeaderList();
foreach( QByteArray reqName, reqHeaders )
{
QByteArray reqValue = reply->request().rawHeader( reqName );
qDebug() << " " << reqName << ": " << reqValue;
}
}