使用断点分片续传上传文件报“resume upload failed",如何解决

注:源码中的bucket,accesskey和secratkey参数均为正确值。
源码如下:

char* CQiniu_testDlg::GetUploadToken(const char* bucket, const char* accesskey, const char* secretkey)
{
    Qiniu_Mac mac;
    mac.accessKey = accesskey;
    mac.secretKey = secretkey;

    Qiniu_RS_PutPolicy putPolicy;
    Qiniu_Zero(putPolicy);

    putPolicy.scope = bucket;
    return Qiniu_RS_PutPolicy_Token(&putPolicy, &mac);
}

bool CQiniu_testDlg::RSUploadScreenShot(const char* bucket, const char* uptoken, const char* key, const char* filename)
{
    Qiniu_Io_PutRet putRet;
    Qiniu_Zero(putRet);

    Qiniu_Rio_PutExtra putExtra;
    Qiniu_Zero(putExtra);
    putExtra.bucket = bucket;

    Qiniu_Client client;
    Qiniu_Client_InitNoAuth(&client, 1024);

    bool bRet = false;

    Qiniu_Error err = Qiniu_Rio_PutFile(&client, &putRet, uptoken, key, filename, &putExtra);
    if(err.code == 200)
    {
        OutputDebugStringA("上传截图成功");
        bRet = true;
    }
    else
    {
        char szErr[512] = {0};
        sprintf(szErr, "上传截图失败!错误号:%d,描述:%s", err.code, err.message);
        OutputDebugStringA(szErr);
    }

    Qiniu_Client_Cleanup(&client);

    return bRet;
}

DWORD CQiniu_testDlg::ThreadUpdateImage(LPVOID lpParam)
{
    CQiniu_testDlg* pDlg = (CQiniu_testDlg*)lpParam;

    char* uptoken = pDlg->GetUploadToken("bucket", "ak", "sk");
    if(pDlg->RSUploadScreenShot("bucket", uptoken, "demo", "d:\\demo.bmp"))
    {
        char* pszKey = new char[10];
        memset(pszKey, 0, 10);
        strcpy(pszKey, "demo");
        pDlg->PostMessage(WM_UPLOAD_SCREENSHOT_RESULT, (WPARAM)pszKey, (LPARAM)0);
    }
    Qiniu_Free(uptoken);

    return 0;
}
阅读 4k
2 个回答

你的char* uptoken = pDlg->GetUploadToken("bucket", "ak", "sk");是否设置正确,另外能否提供一下上传请求中的扩展字段X-Reqid

bucket、accessKey、secratKey这些参数值肯定是正确的,调用Qiniu_Io_PutFile函数都可以成功上传。X-Reqid是在哪里设置,不是很清楚。还有就是Qiniu_Rio_PutExtra参数有哪些必填值,如何赋值在SDK文档里面也没说清楚,怀疑就是这个参数值不正确造成的(Qiniu_Rio_PutFile和Qiniu_Io_PutFile的差异就只有它)
以下是SDK中提供的测试代码:
static void clientIoPutFile(const char* uptoken)
{
Qiniu_Error err;
Qiniu_Client client;
Qiniu_Rio_PutExtra extra;
Qiniu_Rio_PutRet putRet;

Qiniu_Client_InitNoAuth(&client, 1024);

Qiniu_Zero(extra);
extra.bucket = bucket;

err = Qiniu_Rio_PutFile(&client, &putRet, uptoken, key, __FILE__, &extra);
CU_ASSERT(err.code == 200);

Qiniu_Log_Info("Qiniu_Rio_PutFile: %E", err);

printf("\n%s\n", Qiniu_Buffer_CStr(&client.respHeader));
printf("hash: %s\n", putRet.hash);

Qiniu_Client_Cleanup(&client);

}

static void notify(void* self, int blkIdx, int blkSize, Qiniu_Rio_BlkputRet* ret)
{
Qiniu_Log_Info("nodify: %d, off: %d", blkIdx, ret->offset);
}

static void notifyErr(void* self, int blkIdx, int blkSize, Qiniu_Error err)
{
Qiniu_Log_Warn("nodify: %d, err: %E", blkIdx, err);
}
完全看不出跟我自己写的有什么不同,请赐教。

logo
七牛云问答
子站问答
访问
宣传栏