实现七牛云Qt SDK文件直传部分

版权声明:本文为博主原创文章,未经博主允许不得转载。 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?

主要是那一堆指针头疼,还有资源问题
最重要的是,我只需要文件直传就能解决问题,其他的暂时用不到

猜你喜欢

转载自blog.csdn.net/qq_32768743/article/details/87307822
今日推荐