How to upload attachment to Confluence using Qt?

69 Views Asked by At

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;
    }
}

0

There are 0 best solutions below