Qt上传文件到阿里云OSS

简介:将本地文件通过http上传到阿里云oss。包含token获取、表单提交、policy获取、文件上传等。

以下介绍为客户端。

一、Token获取

//构建请求对象
    QNetworkRequest request;
    /*****************************ssl设置*********************************/
//    QSslConfiguration sslConfiguration = request.sslConfiguration();
//    sslConfiguration.setPeerVerifyMode(QSslSocket::VerifyNone);
//    sslConfiguration.setProtocol(QSsl::TlsV1SslV3);
//    request.setSslConfiguration(sslConfiguration);
    /*****************************ssl设置*********************************/
    QUrl url(m_strGetTokenUrl);
    request.setUrl(url);
    //设置请求头
    //已知头类型参见文档QNetworkRequest::KnownHeaders
    request.setHeader(QNetworkRequest::ContentTypeHeader,"application/json");
    //自定义类型
    //request.setRawHeader("token",ui->editPostData->toPlainText().toUtf8());
    QString strUser = OrganizetionRegisterInfo(currentRegisterUserInfo);
    //发送请求
    QNetworkReply *reply = manager->post(request, strUser.toUtf8());

二、policy获取

//构建请求对象
    QNetworkRequest request;
    /*****************************ssl设置*********************************/
//    QSslConfiguration sslConfiguration = request.sslConfiguration();
//    sslConfiguration.setPeerVerifyMode(QSslSocket::VerifyNone);
//    sslConfiguration.setProtocol(QSsl::TlsV1SslV3);
//    request.setSslConfiguration(sslConfiguration);
    /*****************************ssl设置*********************************/
    request.setUrl(QUrl(strTempUrl));
    //设置请求头
    request.setRawHeader("token", m_strToken.toUtf8());
    //发送请求
    QNetworkReply *reply = manager->get(request);

三、上传文件

QHttpMultiPart* multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);

//请求信息
    QByteArray bound = "--------------------------477689690541148254420986";
    multiPart->setBoundary(bound);

{
        //地址
        QHttpPart hostDataPart;
        //hostDataPart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("text/plain"));
        hostDataPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"" + QString("host") + "\""));
        hostDataPart.setBody(m_Policy.host.toUtf8());
        multiPart->append(hostDataPart);

        //目录
        QHttpPart dirDataPart;
        //dirDataPart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("text/plain"));
        dirDataPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"" + QString("dir") + "\""));
        dirDataPart.setBody(m_Policy.dir.toUtf8());
        multiPart->append(dirDataPart);

        //文件Key
        QHttpPart keyDataPart;
        keyDataPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"" + QString("key") + "\""));
        keyDataPart.setBody(m_Policy.key.toUtf8());
        multiPart->append(keyDataPart);

        //身份
        QHttpPart ossaccessKeyIdDataPart;
        ossaccessKeyIdDataPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"" + QString("ossaccessKeyId") + "\""));
        ossaccessKeyIdDataPart.setBody(m_Policy.accessid.toUtf8());
        multiPart->append(ossaccessKeyIdDataPart);

        //签名
        QHttpPart signatureDataPart;
        signatureDataPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"" + QString("signature") + "\""));
        signatureDataPart.setBody(m_Policy.signature.toUtf8());
        multiPart->append(signatureDataPart);

        //加密串
        QHttpPart policyDataPart;
        //policyDataPart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("text/plain"));
        policyDataPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"" + QString("policy") + "\""));
        policyDataPart.setBody(m_Policy.policy.toUtf8());
        multiPart->append(policyDataPart);
    }

    QHttpPart txtPart;
    txtPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"" + QString("file") + "\""));  //这一步很关键,需要符合阿里云OSS上传表单规则,当时也是用postman测试,用wireshark抓报文发现的。
    txtPart.setBodyDevice(&m_uploadFile);
    multiPart->append(txtPart);
    //构建请求对象
    QNetworkRequest request;
    /*****************************ssl设置*********************************/
//    QSslConfiguration sslConfiguration = request.sslConfiguration();
//    sslConfiguration.setPeerVerifyMode(QSslSocket::VerifyNone);
//    sslConfiguration.setProtocol(QSsl::TlsV1SslV3);
//    request.setSslConfiguration(sslConfiguration);
    /*****************************ssl设置*********************************/

    request.setHeader(QNetworkRequest::ContentTypeHeader, "multipart/form-data; boundary="+ multiPart->boundary());
    //发送请求
    request.setUrl(QUrl(m_OssfileuploadInterUrl));
    uploadFileReply = manager->post(request, multiPart);
    multiPart->setParent(uploadFileReply);

上传结果看服务器返回的值:如果是200或者204为上传成功,其余为失败。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值