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

标签 c++ qt google-oauth qnetworkrequest

使用 QOAuth2AuthorizationCodeFlow 通过 google 的 oauth2 授权。授权成功同时使用GET请求(例如从youtube channel 获取视频列表)。 但是虽然 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());

使用 QHttpMultiPartQHttpPart::setBodyDevice() 可以很容易地附加一个文件。但我不确定如何使用 QVariantMap 进行视频/文件上传。

此外,尝试使用:QOAuth2AuthorizationCodeFlow::networkAccessManager() 来访问底层网络管理器,但它使用 GET 给出了 202 响应代码。并且,如果使用经过身份验证的 url,QOAuth2AuthorizationCodeFlow::createAuthenticatedUrl(),响应代码为 200,但回复内容为空(readAll() 返回空缓冲区)。也不适用于 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);

关于c++ - 如何使用 QNetworkAuth 将视频上传到 Youtube,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42438620/

相关文章:

c++ - libstdc++ 已弃用;移至 libc++ [-Wdeprecated] 但更改会产生编译错误

c++ - 通过 UDP 发送结构而不进行序列化

oauth - Google Oauth 授权重定向 URI 无法接受 URL 最后的/*

c++ - 当我在运行程序之外的任何地方单击时,Qt 所有的绘图都消失了

c# - 谷歌 Oauth 错误 : At least one client secrets (Installed or Web) should be set

google-api - 我想永远使用 Google API 刷新 token

c# - 在 C# 中使用 DLL 导入很困难

C++ SetConsoleCursorPosition (GetStdHandle(STD_OUTPUT_HANDLE), c) 2 个参数

c++ - 通过指针传递对象并修改它不会改变对象的状态

c++ - 什么是 QT 插件?