上傳流程
在七牛雲存儲中,整個上傳流程大致分爲以下幾步:
-
業務服務器頒發上傳憑證給客戶端(終端用戶)
-
客戶端憑藉上傳憑證上傳文件到七牛
-
在七牛獲得完整數據後,發起一個 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