2017-02-24 11 views
1

QOAuth2AuthorizationCodeFlowを使用してgoogleのoauth2で認証します。承認は成功し、GETリクエスト(たとえば、YouTubeチャンネルからの動画のリストの取得)を使用して成功します。 QNetworkAccessManagerpostメソッドのオーバーロードの束をユーザに提供しながら、 は、しかし: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()も使用して、基盤となるネットワークマネージャにアクセスしようとしましたが、GETという202応答コードが返されます。また、認証されたURLであるQOAuth2AuthorizationCodeFlow::createAuthenticatedUrl()を使用する場合、レスポンスコードは200ですが、応答内容は空です(readAll()は空のバッファを返します)。 POSTでも動作しません。

QTを使用して2日目、私はいくつかの概念を誤解する可能性があります。助けてくれてありがとう&アイデア。

+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); 
関連する問題