如何使用QNetworkAuth将视频上传到Youtube

时间:2017-02-24 12:25:22

标签: c++ qt google-oauth google-oauth2 qnetworkrequest

使用QOAuth2AuthorizationCodeFlow授权使用Google的oauth2。授权成功以及使用GET请求(例如,从youtube频道获取视频列表)。 但是QNetworkAccessManager为用户提供了一堆post方法重载:

QNetworkReply * post(const QNetworkRequest &request, QIODevice *data)
QNetworkReply * post(const QNetworkRequest &request, const QByteArray &data)
QNetworkReply * post(const QNetworkRequest &request, QHttpMultiPart *multiPart)

QOAuth2AuthorizationCodeFlow只有:

QNetworkReply *post(const QUrl &url, const QVariantMap &parameters = QVariantMap());

使用QHttpMultiPart和&添加文件很容易。 QHttpPart::setBodyDevice()。但我不确定如何使用QVariantMap进行视频/文件上传。

此外,尝试使用:QOAuth2AuthorizationCodeFlow::networkAccessManager()来访问底层网络管理器,但它提供了202个响应代码GET。并且,如果使用经过身份验证的URL QOAuth2AuthorizationCodeFlow::createAuthenticatedUrl(),则响应代码为200,但回复内容为空(readAll()返回空缓冲区)。也不适用于POST

第二天使用QT,所以我可能会误解一些概念。感谢您的帮助和帮助想法。

1 个答案:

答案 0 :(得分:1)

能够解决它。但是,也许有正确的解决方案。

QOAuth2AuthorizationCodeFlow youtube{};
...
// authorization
...
auto multi_part = new QHttpMultiPart{ QHttpMultiPart::MixedType };
auto video_part = new QHttpPart{};
auto video = new QFile{ video_path };

if (!video->open(QIODevice::ReadOnly)) { return nullptr; }

video_part->setHeader(QNetworkRequest::ContentTypeHeader, QVariant("video/*"));
video_part->setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("Slug"));
video_part->setBodyDevice(video);
multi_part->append(*video_part);

QNetworkRequest req{youtube_videos_insert};
const QString bearer_format = QStringLiteral("Bearer %1");
const QString bearer = bearer_format.arg(youtube.token());
req.setRawHeader("Authorization", bearer.toUtf8());

youtube.networkAccessManager()->post(req, multi_part);