如何使用 QNetworkAuth 将视频上传到 Youtube
How to upload video to Youtube with QNetworkAuth
使用 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 ¶meters = QVariantMap());
使用 QHttpMultiPart
和 QHttpPart::setBodyDevice()
可以很容易地附加文件。但我不确定如何使用 QVariantMap
进行 video/file 上传。
此外,尝试使用:QOAuth2AuthorizationCodeFlow::networkAccessManager()
访问底层网络管理器,但它给出了带有 GET
的 202 响应代码。并且,如果使用经过身份验证的 url、QOAuth2AuthorizationCodeFlow::createAuthenticatedUrl()
,响应代码为 200,但响应内容为空(readAll() returns 空缓冲区)。也不适用于 POST
。
第2天用QT,所以可能理解错了一些概念。感谢您的帮助和想法。
能够解决它。但是,也许有正确的解决方案。
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);
使用 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 ¶meters = QVariantMap());
使用 QHttpMultiPart
和 QHttpPart::setBodyDevice()
可以很容易地附加文件。但我不确定如何使用 QVariantMap
进行 video/file 上传。
此外,尝试使用:QOAuth2AuthorizationCodeFlow::networkAccessManager()
访问底层网络管理器,但它给出了带有 GET
的 202 响应代码。并且,如果使用经过身份验证的 url、QOAuth2AuthorizationCodeFlow::createAuthenticatedUrl()
,响应代码为 200,但响应内容为空(readAll() returns 空缓冲区)。也不适用于 POST
。
第2天用QT,所以可能理解错了一些概念。感谢您的帮助和想法。
能够解决它。但是,也许有正确的解决方案。
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);