版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_32768743/article/details/87307822
七牛云SDK,本质上跑的是http协议,按照http的方式来做就可以了。
但是Qt对Http的支持,虽然有,但相较于其他的语言或框架来说还是比较复杂的。
首先看文档
https://developer.qiniu.com/kodo/api/1312/upload
重点
比较坑的是
没有具体写明,从其他地方发现这个的值是
http://up.qiniu.com
上传需要token,token需要手动构造,看文档
https://developer.qiniu.com/kodo/manual/1208/upload-token
比较麻烦的是HMAC-SHA1签名,Qt没有直接提供,但是可以在这里找到
https://wiki.qt.io/HMAC-SHA1
注意到这一句,Qt的这个实现恰好是这么做的
构造token需要上传策略,看文档
https://developer.qiniu.com/kodo/manual/1206/put-policy
简单点,就只需要两个参数
接下来是神坑,这些参数必须按照顺序来构造json,不然token不对,所以5555555
搞定这些后,就只差发http post请求了,注意:要发表单
Qt提供了QHttpMultiPart类可以使用
上传成功
部分参考代码
QHttpPart buildPart(QString key, QByteArray value){
QHttpPart part;
part.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(QString("form-data; name=\"%1\"").arg(key)));
part.setBody(value);
return part;
}
QHttpMultiPart* getBody(QString resourceKey, QString token, QByteArray fileData)
{
QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
multiPart->append(buildPart("key", resourceKey.toLatin1()));
multiPart->append(buildPart("token", token.toLatin1()));
QHttpPart filePart;
filePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(QString("form-data; name=\"file\"; filename=\"file1.png\"")));
filePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant(QString("application/octet-stream")));
filePart.setRawHeader(QString("Content-Transfer-Encoding").toLatin1(), QString("binary").toLatin1());
filePart.setBody(fileData);
multiPart->append(filePart);
return multiPart;
}
为啥不直接用七牛云提供的c/c++ sdk?
主要是那一堆指针头疼,还有资源问题
最重要的是,我只需要文件直传就能解决问题,其他的暂时用不到