代码之家  ›  专栏  ›  技术社区  ›  Gurushant GeneCode

为什么上传到谷歌硬盘时不设置文件名?

  •  0
  • Gurushant GeneCode  · 技术社区  · 6 年前

    我的目标
    我想上传一个sqlite文件到谷歌驱动器。

    虽然我已经能够实现将文件上传到google drive,但是 上载的文件名为“未命名” Performing Multipart Upload 在Qt的帮助下 QHttpMultiPart .

    bool File_Control::Upload_File_Multipart(const QString &FileName, const QByteArray &rawData)
    {
        if(FileName.isEmpty()){
            emit setMessage("Error: File Name can not be empty");
            return false;
        }
    
        if(rawData.size()==0){
            emit setMessage("Error: File size can not be zero");
            return false;
        }
    
        // Prepare MetaDataPart
        QHttpPart MetadataPart;
        MetadataPart.setRawHeader("Content-Type", "application/json; charset=UTF-8");
        QString Body;
        Body = "{\n"
                + tr("\"name\": \"%1\"\n").arg(FileName)
                + tr("}");
        MetadataPart.setBody(Body.toUtf8());
    
        // Prepare MediaPart 
        QHttpPart MediaPart;
        MediaPart.setRawHeader("Content-Type", "application/octet-stream");
        MediaPart.setBody(rawData);
    
        // Now add MetaDataPart and MediaPart together to form multiPart
        QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::RelatedType);
        multiPart->setBoundary("bound1"); 
        multiPart->append(MetadataPart);
        multiPart->append(MediaPart);
    
        // Now Prepare the request
        QUrl url("https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart");
        QNetworkRequest request(url);
        QString AccessTokenBearer = "Bearer " + mAccess_Token; // mAccess_Token holds the access_token for the session
        request.setRawHeader("Content-Type","Content-Type: multipart/related; boundary=bound1");
        request.setRawHeader("Authorization", AccessTokenBearer.toUtf8());
    
        // Get Reply and connect it to set Value
        QNetworkReply *reply = mQNAM.post(request, multiPart); // mQNAM is QNetworkAccessManager
        QObject::connect(reply, SIGNAL(uploadProgress(qint64,qint64)),
                         this, SIGNAL(setValue(qint64,qint64))); // Update in gui
    
        // Set timeout mechanism while waiting for reply finished
        bool stop = false;
        QTimer timer;
        timer.setSingleShot(true);
        QObject::connect(reply, &QNetworkReply::uploadProgress, [&](){
            timer.stop();
            timer.start(TIMEOUT); // Restart timer every time upload progress
        });
        QObject::connect(&timer, &QTimer::timeout, [&](){
            stop = true;
        });
        timer.start(TIMEOUT);
    
        // Wait till the response is completed
        while(!reply->isFinished()){
            QCoreApplication::processEvents();
            if(stop){
                reply->abort();
            }
        }
    
        // Check reply
        if(reply->error() != QNetworkReply::NoError){
            if(reply->error() == QNetworkReply::OperationCanceledError){
                emit setMessage("Error: Timeout");
            }
            else{
                emit setMessage("Error: "+reply->errorString());
            }
            delete reply;
            return false;
        }
        else{
            QByteArray rawData = reply->readAll();
            qDebug()<<"Size of reply "<<rawData.size();
            qDebug()<<"Data "<<rawData;
            delete reply;
            return true;
        }
    }  
    

    编辑1
    Body.utf8 日志->{\n\“name\”:\“db\u 06\u 08\u 2018\u 16\u 18\u 11\u 979.sqlite\”\n}“

    1 回复  |  直到 6 年前
        1
  •  0
  •   Gurushant GeneCode    6 年前

    我终于发现了错误。这不过是准备请求时的一个输入错误

     request.setRawHeader("Content-Type","Content-Type: multipart/related; boundary=bound1");
    

    之后:

     request.setRawHeader("Content-Type","multipart/related; boundary=bound1");  
    

    这就解决了问题。