Skip to content

Instantly share code, notes, and snippets.

@zqsd
Last active May 4, 2016 10:01
Show Gist options
  • Save zqsd/5170142 to your computer and use it in GitHub Desktop.
Save zqsd/5170142 to your computer and use it in GitHub Desktop.
Sketchfab API C++/Qt example
/*
Compiling:
qmake -project "QT += core network script"
qmake
make
*/
#include <iostream>
#include <QApplication>
#include <QDebug>
#include <QFile>
#include <QHttpMultiPart>
#include <QProgressDialog>
#include <QUrl>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QScriptEngine>
QHttpPart part_parameter(QString key, QString value) {
QHttpPart part;
part.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"" + key + "\""));
part.setBody(value.toAscii());
return part;
}
int main(int argc, char* argv[])
{
QApplication application(argc, argv);
QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
// upload parameters data
multiPart->append(part_parameter("title", "Uber Glasses"));
multiPart->append(part_parameter("description", "Test of the api with a simple model"));
multiPart->append(part_parameter("tags", "test collada glasses"));
multiPart->append(part_parameter("token", "ff00ff"));
multiPart->append(part_parameter("private", "1"));
multiPart->append(part_parameter("password", "Tr0b4dor&3"));
// upload file data
QHttpPart modelPart;
modelPart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/octet-stream"));
modelPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"fileModel\"; filename=\"./model.dae\""));
QFile *file = new QFile("model.dae");
file->open(QIODevice::ReadOnly);
modelPart.setBodyDevice(file);
file->setParent(multiPart);
multiPart->append(modelPart);
QUrl url("https://api.sketchfab.com/v1/models");
QNetworkRequest request(url);
QNetworkAccessManager manager;
QNetworkReply *reply = manager.post(request, multiPart);
multiPart->setParent(reply);
qDebug() << "Transmitting" << file->size() << "bytes file.";
QObject::connect(reply, SIGNAL(finished()), &application, SLOT(quit()));
int res = application.exec();
// test for network error
QNetworkReply::NetworkError err = reply->error();
if (err != QNetworkReply::NoError) {
qDebug() << reply->errorString();
return 1;
}
// get the api anwser
QByteArray result = reply->readAll();
QScriptValue sc;
QScriptEngine engine;
qDebug() << "Result:" << result;
sc = engine.evaluate("(" + QString(result) + ")");
if (sc.property("success").toString() == "true") {
qDebug() << "Model uploaded with id" << sc.property("result").property("id").toString();
} else {
qDebug() << "Model failed to upload with error" << sc.property("error").toString();
}
return res;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment