我的目标:要使用Google Drive v3 rest api从Google Drive下载sqlite文件
我正在研究一个项目,该项目涉及下载存储在Google驱动器中的sqlite文件。到目前为止,我已经成功地授权并获得了访问令牌。我也很幸运获得所有存储在google驱动器中的文件名(sqlite文件)及其各自的文件ID。现在,我想使用文件ID下载文件。我遵循了documentation,并发送了带有文件ID的请求。但是我得到的只是
{
"kind": "drive#file",
"id": "1AmaXWbtmkvihy1g9yoYSSCssgL4fVh6t",
"name": "_db.sqlite",
"mimeType": "application/octet-stream"
}
这是我的代码:
bool File_Control::Download_File(const QString &FileName)
{
// Get FileID
QString FileID = m_Map.value(FileName, QString());
if(FileID.isEmpty()){
emit setMessage("Fatal Error: FileID is missing for FileName");
return false;
}
qDebug()<<"File ID "<<FileID;
// Now Prepare the request
QUrl url(tr("https://www.googleapis.com/drive/v3/files/%1").arg(FileID));
QUrlQuery query;
query.addQueryItem("alt","media");
url.setQuery(query.query());
QNetworkRequest request(url);
QString headerData = "Bearer " + m_Settings->get_Google_Drive_Settings
(Google_Drive::AccessTokenEnum);
request.setRawHeader("Authorization", headerData.toLocal8Bit());
QNetworkReply *reply = m_Account->get_Request(request);
// Now wait for the response
QTime t1 = QTime::currentTime().addMSecs(TIMEOUT);
while((t1>QTime::currentTime()) && (!reply->isFinished())){
QCoreApplication::processEvents();
}
if(reply->isFinished())
{
if(reply->error() != QNetworkReply::NoError){
emit setMessage("Error: "+reply->errorString());
delete reply;
return false;
}
else{
QByteArray array = reply->readAll();
qDebug()<<array<<reply->error();
delete reply;
return true;
}
}
else{
emit setMessage("Error: Timeout");
delete reply;
return false;
}
}
我想念什么吗?
编辑1:
m_Map -> QMap,用于存储(来自驱动器文件的)文件名作为键,文件ID作为值存储。
m_Settings ->帮助对象,该对象有助于获取存储在Windows注册表中的access_token
Google_Drive ->辅助枚举类型。
m_Account ->用于授权Google帐户的对象。该对象包含我的QNetworkManager,所以我创建了一个名为get_Request的函数来获取我的“获取请求”
答案 0 :(得分:2)
最初,我没有将alt
设置为media
,所以这首先解释了我得到的响应。然后,按代码中所示设置值。
问题是,我试图在调试控制台中查看 QByteArray 的内容。由于数组包含二进制数据,因此Qt没有显示任何字符,我认为Google发送了一个空数据包。
更糟的是,我已阅读此guide并尝试在浏览器中重现它。所以我得到了错误代码400。
最终,我考虑过检查阵列的大小,令我惊讶的是,它与驱动器上原始文件的大小相同。然后,我将数组的内容保存到本地文件中,并检查了SQLite文件,一切正常。