2017-02-24 147 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); 
相關問題