上传流程
在七牛云存储中,整个上传流程大致分为以下几步:
-
业务服务器颁发上传凭证给客户端(终端用户)
-
客户端凭借上传凭证上传文件到七牛
-
在七牛获得完整数据后,发起一个 HTTP 请求回调到业务服务器
-
业务服务器保存相关信息,并返回一些信息给七牛
-
七牛原封不动地将这些信息转发给客户端(终端用户)
注意:回调到业务服务器的过程是可选的,它取决于业务服务器颁发的上传凭证。如果没有回调,七牛会返回一些标准的信息(例如文件的 hash)给客户端。
如果上传不回调给服务器,以上流程简化为:
-
业务服务器生成上传凭证
-
凭借上传凭证上传文件到七牛
-
后续工作,例如保存一些相关信息
代码
Qiniu_Io_PutFile 用于普通上传,Qiniu_Rio_PutFile 断点续上传,如果服务器的token有回调,则Qiniu_Rio_PutRet的key为空,如果服务器的token没有回调,则key不为空,是上传地址的标识,然后文件的地址格式大概是 http://qiniu.服务器地址/key,这样可以访问到上传的文件。
Qiniu_Global_Init(-1); /* 全局初始化函数,整个进程只需要调用一次 */
// 参数:文件路径,服务器提供的token,及用于返回key的引用
int upload(QString localFilePath,QString token,QString& key)
{
Qiniu_Client* client = new Qiniu_Client;
if(client)
{
/* HTTP客户端初始化。HTTP客户端是线程不安全的,不要在多个线程间共用 */
Qiniu_Client_InitNoAuth(client, 1024);
}
Qiniu_Error err;
Qiniu_Rio_PutExtra extra;
Qiniu_Zero(extra);
Qiniu_Rio_PutRet putRet;
err = Qiniu_Rio_PutFile(m_Client,
&putRet,
qPrintable(token),
NULL,
qPrintable(localFilePath),
&extra);
// Qiniu_Io_PutRet putRet;
// err = Qiniu_Io_PutFile(m_Client,
// &putRet,
// qPrintable(token),
// NULL,
// qPrintable(localFilePath),
// NULL);
qInfo("hash and key %s %s",putRet.hash,putRet.key);
if(err.code != 200)
{
qInfo("qiniu upload fail:[%d]%s",err.code,err.message);
if(err.code==0) return -1;
return err.code;
}
else
{
if(putRet.key != "")
{
key = putRet.key;
}
}
return 0;
}
上传地址错误
如果提示上传地址出错,比如 incorrect region, please use up-z2.qiniup.com。
需要在conf.c文件更更换默认的地址(可能还需要更新sdk),此地址是对应服务器的所选择的七牛的存储服务器,例如:
//默认华东机房
const char *QINIU_UP_HOST = "http://upload-z2.qiniu.com";
const char *QINIU_IOVIP_HOST = "http://iovip-z2.qbox.me";
代码参考:
https://github.com/fengxieye/Qt-item/blob/master/GCUpload/GCQiniuUpload.cpp