简介:将本地文件通过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为上传成功,其余为失败。