Невозможно загрузить более одного файла на Google Диск через API REST - PullRequest
0 голосов
/ 07 января 2019

Моя программа отслеживает изменения в указанных каталогах и выдает абсолютный путь для каждого вновь обнаруженного файла в очередь. Когда мой интерфейс Google Drive готов к следующему файлу, он отправляет сигнал в очередь, который затем возвращает путь к файлу для загрузки в интерфейс. Моя проблема в том, что если несколько файлов будут обнаружены до того, как первый из них завершит загрузку, моя программа попытается загрузить следующий файл в очередь, но QNetWorkReply никогда не выдаст сообщение Finished (). Если я подожду, пока загрузится первый файл, переместу файл, чтобы он был обнаружен, тогда второй файл будет загружен правильно.

Я полагаю, что это как-то связано с изменением области действия в googleDriveInterface :: uploadFile, прежде чем он сможет завершить загрузку, но я не уверен, как это исправить.

//connections made in main.cpp

//GOOGLE DRIVE INTERFACE MEMBER FUNCTIONS    

void 
googleDriveInterface::slotUploadFileToDrive(const QString &filePath){
QFileInfo file(filePath);
if (file.isDir() || file.size() > 52428800) {
    qDebug() << "unable to upload: " << filePath << "either >50mb or a directory";
    emit readyForNextUpload(); //get next file to upload
}
else {
    uploadFile(filePath);
}
}

void
googleDriveInterface::uploadFile(const QString &filePath){
    //code to initialize request
    networkReply = networkManager->post(request, multiPart);
    QObject::connect(networkReply, SIGNAL(finished()), this, SLOT(slotUploadResult()), Qt::DirectConnection);
}

void 
googleDriveInterface::slotUploadResult() {
    int statusCode = networkReply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); //we need to convert to int so we can use it with switch/case

    switch (statusCode) {
    case 200: //nothing to do, file succesfully uploaded
        qDebug() << "file succuessfully uploaded to Google Drive";
        emit readyForNextUpload(); //let program now we are ready for next file 
        break;  
//rest of error handling
}


//QUEUE MEMBER FUNCTIONS
void
googleFileUploadQueue::slotShouldSendNextFile() {

    fileQueue.dequeue(); //file at front of queue has been taken care of
    if (!fileQueue.isEmpty()) {
        emit nextFileToUpload(fileQueue.head());
    }
}

void
googleFileUploadQueue::slotAddFileToQueue(const QString &filePath) {
    fileQueue.enqueue(filePath);
    if (fileQueue.size() == 1) { //queue was previously empty and we can send file for upload right away
        emit nextFileToUpload(filePath);
    }
}
...