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为上传成功,其余为失败。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
文件到阿里云OSS可以通过以下步骤实现: 1. 引入aliyun-java-sdk-oss依赖 ``` <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-java-sdk-oss</artifactId> <version>3.10.0</version> </dependency> ``` 2. 创建OSSClient对象 ``` String endpoint = "http://oss-cn-hangzhou.aliyuncs.com"; String accessKeyId = "yourAccessKeyId"; String accessKeySecret = "yourAccessKeySecret"; String bucketName = "yourBucketName"; OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); ``` 3. 上文件 ``` String objectName = "yourObjectName"; // 上OSS后的文件名,可以包含路径 File file = new File("yourLocalFile"); // 要上文件路径 ossClient.putObject(bucketName, objectName, file); ``` 4. 关闭OSSClient对象 ``` ossClient.shutdown(); ``` 完整的Java代码示例: ``` import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import java.io.File; public class OSSUploader { public static void main(String[] args) { String endpoint = "http://oss-cn-hangzhou.aliyuncs.com"; String accessKeyId = "yourAccessKeyId"; String accessKeySecret = "yourAccessKeySecret"; String bucketName = "yourBucketName"; String objectName = "yourObjectName"; // 上OSS后的文件名,可以包含路径 File file = new File("yourLocalFile"); // 要上文件路径 // 创建OSSClient对象 OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); // 上文件 ossClient.putObject(bucketName, objectName, file); // 关闭OSSClient对象 ossClient.shutdown(); } } ``` 需要注意的是,上文件时可以指定上后的文件名,也可以使用原文件名。同时,上文件的大小不能超过OSS的限制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值