Как загрузить файл с google drive с помощью v3 rest api? - PullRequest
0 голосов
/ 12 сентября 2018

Моя цель: Чтобы загрузить файл sqlite с Google Drive с помощью Google Drive v3 rest api

Я работаю над проектом, который предусматривает загрузку файла sqlite, который хранится на диске Google. До сих пор я успешно авторизировал и получал токен доступа. Мне также повезло получить все имена файлов (файлы sqlite), хранящиеся на диске Google, с соответствующим идентификатором файла. Теперь я хочу скачать файл, используя идентификатор файла. Я следовал документации и отправляю запрос с идентификатором файла. Но все, что я получаю, это

{
 "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, в котором имена файлов (файлов с диска) хранятся в качестве ключа, а идентификатор файла - в качестве значения.
m_Settings -> Вспомогательный объект, который помогает в получении access_token, который хранится в реестре Windows
Google_Drive -> Тип перечисления помощника.
m_Account -> Объект, который помогает в авторизации аккаунта Google. Этот объект содержит мой QNetworkManager, поэтому я создал функцию get_Request для получения моего «запроса get»

1 Ответ

0 голосов
/ 12 сентября 2018

Изначально я не устанавливал alt в media, так что это объясняет ответ, который я получил в первую очередь. Затем я установил значение, как показано в коде.

Проблема заключалась в том, что я пытался увидеть содержимое QByteArray в консоли отладки. Поскольку массив содержит двоичные данные, Qt не отображал никаких символов, и я подумал, что Google отправил пустой пакет.

Чтобы усугубить ситуацию, я прочитал это руководство и попытался воспроизвести его в своем браузере. Итак, я получил код ошибки 400.

В конце концов, я подумал о проверке размера массива, и, к моему удивлению, он совпадал с размером исходного файла на диске. Затем я сохранил содержимое массива в локальный файл и проверил файл SQLite, и все было в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...