如何使用v3 rest api从google驱动器下载文件?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用v3 rest api从google驱动器下载文件?相关的知识,希望对你有一定的参考价值。

我的目标:使用google drive v3 rest api从google驱动器下载sqlite文件

我正在处理涉及下载存储在谷歌驱动器中的sqlite文件的项目。到目前为止,我已经成功地授权和获取访问令牌。我也很幸运获得存储在谷歌驱动器中的所有文件名(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的函数来获取我的“获取请求”

答案

最初我没有把alt设置为media,所以这解释了我首先得到的反应。然后我设置了代码中显示的值。

问题是,我试图在调试控制台中看到QByteArray的内容。由于数组包含二进制数据,Qt没有显示任何字符,我认为Google发送了一个空数据包。

更糟糕的是,我已经读过这个guide并试图在我的浏览器中重现它。所以我得到了错误代码400。

最后,我考虑过检查数组的大小,令我惊讶的是它与驱动器上原始文件的大小相同。然后我将数组的内容保存到本地文件并检查SQLite文件,一切正常。

以上是关于如何使用v3 rest api从google驱动器下载文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Google.Apis.YouTube.v3 和 C# 将视频上传到 youtube?

如何在使用Google Drive API V3与他人共享时设置文件的功能?

使用 REST api 从 Google Drive 下载图片

有人可以为 Google Drive REST API v3 提供最新的 Android 指南吗?

Javascript - Google Drive v3 API和功能

如何将文件重命名为 google drive rest api?改造2