2017-02-24 66 views
1

使用QOAuth2AuthorizationCodeFlow使用谷歌的oauth2进行授权。授权成功以及使用GET请求(例如,获取来自YouTube频道的视频列表)。 不过,虽然QNetworkAccessManager为用户提供了一堆post方法重载:如何使用QNetworkAuth将视频上传到Youtube

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,则返回代码为200,但回复内容为空(readAll()返回空缓冲区)。不适用于POST

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

+0

很高兴有人问这个问题。 – Akiva

+0

只是好奇你是否不介意为此提供完整的代码。作为感谢,我会反过来赠送一些声誉。由于缺少文档,我遇到了一些麻烦。 – Akiva

+1

@Akiva的代码不是那么漂亮,但它确实为我上传了一个视频https://github.com/x4t3a/YoutubeUploader/blob/master/youtube_wrapper.cpp#L98 –

回答

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); 
相关问题