百度pcs操作实例c语言版
闲着没事,写了个操作百度pcs的例子,实现了上传,下载,删除等基本功能,百度pcs实现起来比较简单,只有在实现上传的时候遇到点麻烦,upload中file的描述不够明确。
下面是主要代码,使用了cJSON和libcurl。
main.c
#include
#include
#include
#include
#include"trans_inf.h"
#include"cJSON.h"
#defineROOT_DIR"/apps/zztpcs"//这是我应用的目录名,需要改成自己的
#definePCS_DEBUGprintf
characcess_token="xxxx";//accesstoken,我固定了
structpcs_stat
{
intisdir;
longlongsize;
intctime;
intmtime;
};
charcurdir[512]=ROOT_DIR;
intparse_pcs_stat(charmsg,structpcs_statbuf)
{
intret=-1;
inti;
cJSONroot=NULL;
cJSONlist=NULL;
cJSONitem=NULL;
cJSONnode=NULL;
memset(buf,0,sizeof(structpcs_stat));
root=cJSON_Parse(msg);
if(NULL==root)
{
return;
}
node=cJSON_GetObjectItem(root,"request_id");
if(NULL==node)
{
gotoEND;
}
node=cJSON_GetObjectItem(root,"error_msg");
if(node)
{
printf("err:%s\n",node->valuestring);
gotoEND;
}
list=cJSON_GetObjectItem(root,"list");
if(NULL==list)
{
gotoEND;
}
for(i=0;i {
item=cJSON_GetArrayItem(list,i);
if(item)
{
node=cJSON_GetObjectItem(item,"isdir");
if(node)
{
buf->isdir=node->valueint;
}
node=cJSON_GetObjectItem(item,"ctime");
if(node)
{
buf->ctime=node->valueint;
}
node=cJSON_GetObjectItem(item,"mtime");
if(node)
{
buf->mtime=node->valueint;
}
node=cJSON_GetObjectItem(item,"size");
if(node)
{
buf->size=node->valueint;
}
}
}
ret=0;
END:
if(root)
{
cJSON_Delete(root);
}
returnret;
}
intpcs_stat(charpath,structpcs_statbuf)
{
intret=-1;
charcmdbuf[1024];
charmsg=NULL;
sprintf(cmdbuf,"https://pcs.baidu.com/rest/2.0/pcs/file?method=meta&access_token=%s&path=%s",
access_token,
path);
getcmd(cmdbuf,&msg);
{
if(msg)
{
if(parse_pcs_stat(msg,buf)==0)
{
ret=0;
}
free(msg);
msg=NULL;
}
}
returnret;
}
intparse_mkdir(charmsg)
{
intret=-1;
cJSONroot=NULL;
cJSONnode=NULL;
root=cJSON_Parse(msg);
if(NULL==root)
{
return;
}
node=cJSON_GetObjectItem(root,"request_id");
if(NULL==node)
{
gotoEND;
}
node=cJSON_GetObjectItem(root,"error_msg");
if(node)
{
printf("err:%s\n",node->valuestring);
gotoEND;
}
node=cJSON_GetObjectItem(root,"fs_id");
if(NULL==node)
{
gotoEND;
}
ret=0;
END:
if(root)
{
cJSON_Delete(root);
}
returnret;
}
intpcs_mkdir(charpath)
{
intret=-1;
charcmdbuf[1024];
charmsg=NULL;
sprintf(cmdbuf,"https://pcs.baidu.com/rest/2.0/pcs/file?method=mkdir&access_token=%s&path=%s",
access_token,
path);
postcmd(cmdbuf,"a",&msg);
{
if(msg)
{
if(parse_mkdir(msg)==0)
{
ret=0;
}
free(msg);
msg=NULL;
}
}
returnret;
}
intparse_ls(charmsg)
{
intret=-1;
inti;
cJSONroot=NULL;
cJSONlist=NULL;
cJSONitem=NULL;
cJSONnode=NULL;
root=cJSON_Parse(msg);
if(NULL==root)
{
return;
}
node=cJSON_GetObjectItem(root,"request_id");
if(NULL==node)
{
gotoEND;
}
node=cJSON_GetObjectItem(root,"error_msg");
if(node)
{
printf("err:%s\n",node->valuestring);
gotoEND;
}
list=cJSON_GetObjectItem(root,"list");
if(NULL==list)
{
gotoEND;
}
printf("numpathisdirctimemtimesize\n");
for(i=0;i {
item=cJSON_GetArrayItem(list,i);
if(item)
{
printf("%d",i);
node=cJSON_GetObjectItem(item,"path");
if(node)
{
printf("%s",node->valuestring);
}
node=cJSON_GetObjectItem(item,"isdir");
if(node)
{
printf("%d",node->valueint);
}
else
{
printf("");
}
node=cJSON_GetObjectItem(item,"ctime");
if(node)
{
printf("%d",node->valueint);
}
else
{
printf("");
}
node=cJSON_GetObjectItem(item,"mtime");
if(node)
{
printf("%d",node->valueint);
}
else
{
printf("");
}
node=cJSON_GetObjectItem(item,"size");
if(node)
{
printf("%d",node->valueint);
}
printf("\n");
}
}
ret=0;
END:
if(root)
{
cJSON_Delete(root);
}
returnret;
}
intpcs_ls(charpath)
{
intret=-1;
charcmdbuf[1024];
charmsg=NULL;
sprintf(cmdbuf,"https://pcs.baidu.com/rest/2.0/pcs/file?method=list&access_token=%s&path=%s",
access_token,
path);
getcmd(cmdbuf,&msg);
{
if(msg)
{
if(parse_ls(msg)==0)
{
strcpy(curdir,path);
ret=0;
}
free(msg);
msg=NULL;
}
}
returnret;
}
intparse_get(charmsg)
{
intret=-1;
cJSONroot=NULL;
cJSONnode=NULL;
root=cJSON_Parse(msg);
if(NULL==root)
{
return;
}
node=cJSON_GetObjectItem(root,"request_id");
if(NULL==node)
{
gotoEND;
}
node=cJSON_GetObjectItem(root,"error_msg");
if(node)
{
printf("err:%s\n",node->valuestring);
gotoEND;
}
ret=0;
END:
if(root)
{
cJSON_Delete(root);
}
returnret;
}
intpcs_get(charpath,charfile)
{
intret=-1;
charcmdbuf[1024];
charmsg=NULL;
sprintf(cmdbuf,"https://pcs.baidu.com/rest/2.0/pcs/file?method=download&access_token=%s&path=%s",
access_token,
path);
ret=download(cmdbuf,file,&msg);
{
if(msg)
{
parse_get(msg);
free(msg);
msg=NULL;
}
}
returnret;
}
intparse_rm(charmsg)
{
intret=-1;
cJSONroot=NULL;
cJSONnode=NULL;
root=cJSON_Parse(msg);
if(NULL==root)
{
return;
}
node=cJSON_GetObjectItem(root,"request_id");
if(NULL==node)
{
gotoEND;
}
node=cJSON_GetObjectItem(root,"error_msg");
if(node)
{
printf("err:%s\n",node->valuestring);
gotoEND;
}
ret=0;
END:
if(root)
{
cJSON_Delete(root);
}
returnret;
}
intpcs_rm(charpath)
{
intret=-1;
charcmdbuf[1024];
charmsg=NULL;
sprintf(cmdbuf,"https://pcs.baidu.com/rest/2.0/pcs/file?method=delete&access_token=%s&path=%s",
access_token,
path);
postcmd(cmdbuf,"a",&msg);
{
if(msg)
{
if(parse_rm(msg)==0)
{
ret=0;
}
free(msg);
msg=NULL;
}
}
returnret;
}
intparse_put(charmsg)
{
intret=-1;
cJSONroot=NULL;
cJSONnode=NULL;
root=cJSON_Parse(msg);
if(NULL==root)
{
return;
}
node=cJSON_GetObjectItem(root,"request_id");
if(NULL==node)
{
gotoEND;
}
node=cJSON_GetObjectItem(root,"error_msg");
if(node)
{
printf("err:%s\n",node->valuestring);
gotoEND;
}
node=cJSON_GetObjectItem(root,"fs_id");
if(NULL==node)
{
gotoEND;
}
ret=0;
END:
if(root)
{
cJSON_Delete(root);
}
returnret;
}
intpcs_put(charpath,charfile)
{
intret=-1;
charcmdbuf[1024];
charmsg=NULL;
sprintf(cmdbuf,"https://pcs.baidu.com/rest/2.0/pcs/file?method=upload&access_token=%s&path=%s",
access_token,
path);
upload(cmdbuf,file,&msg);
{
if(msg)
{
if(parse_put(msg)==0)
{
ret=0;
}
free(msg);
msg=NULL;
}
}
returnret;
}
intparse_find(charmsg)
{
intret=-1;
inti;
cJSONroot=NULL;
cJSONlist=NULL;
cJSONitem=NULL;
cJSONnode=NULL;
root=cJSON_Parse(msg);
if(NULL==root)
{
return;
}
node=cJSON_GetObjectItem(root,"request_id");
if(NULL==node)
{
gotoEND;
}
node=cJSON_GetObjectItem(root,"error_msg");
if(node)
{
printf("err:%s\n",node->valuestring);
gotoEND;
}
list=cJSON_GetObjectItem(root,"list");
if(NULL==list)
{
gotoEND;
}
printf("num:path,isdir,ctime,mtime,size\n");
for(i=0;i {
item=cJSON_GetArrayItem(list,i);
if(item)
{
printf("%d:",i);
node=cJSON_GetObjectItem(item,"path");
if(node)
{
printf("%s,",node->valuestring);
}
node=cJSON_GetObjectItem(item,"isdir");
if(node)
{
printf("%d,",node->valueint);
}
else
{
printf(",");
}
node=cJSON_GetObjectItem(item,"ctime");
if(node)
{
printf("%d,",node->valueint);
}
else
{
printf(",");
}
node=cJSON_GetObjectItem(item,"mtime");
if(node)
{
printf("%d,",node->valueint);
}
else
{
printf(",");
}
node=cJSON_GetObjectItem(item,"size");
if(node)
{
printf("%d",node->valueint);
}
printf("\n");
}
}
ret=0;
END:
if(root)
{
cJSON_Delete(root);
}
returnret;
}
intpcs_find(charpath,charkey)
{
intret=-1;
charcmdbuf[1024];
charmsg=NULL;
sprintf(cmdbuf,"https://pcs.baidu.com/rest/2.0/pcs/file?method=search&access_token=%s&path=%s&re=1&wd=%s",
access_token,
path,
key);
getcmd(cmdbuf,&msg);
{
if(msg)
{
if(parse_find(msg)==0)
{
ret=0;
}
free(msg);
msg=NULL;
}
}
returnret;
}
chartrim_space(charstr)
{
if(NULL==str)
{
returnNULL;
}
while(isspace(str))
{
str++;
}
returnstr;
}
intparse_opt(charinput,charlargv,intmax)
{
intcount=0;
if(NULL==input||NULL==largv||0==max)
{
return0;
}
do
{
if(input=='''')
{
input=''\0'';
input++;
}
input=trim_space(input);
largv[count]=input;
count++;
if(count==max)
{
returncount;
}
}while((input=strchr(input,'''')));
returncount;
}
voidusage()
{
printf("\n\
lsremotedirpath\n\
mkdirremotedirpath\n\
getremotefilepathlocalfilename\n\
putremotefilepathlocalfilename\n\
rmremotefilepath\n\
findremotedirpathkeyword\n\
exit\n");
}
intmain(intargc,charargv)
{
intret;
structpcs_statbuf;
charinputbuf[1024];
charptr=NULL;
intlargc;
charlargv[10];
trans_init();
ret=pcs_stat(ROOT_DIR,&buf);
if(ret==0&&buf.isdir==0)
{
PCS_DEBUG("notadir\n");
return0;
}
if(ret!=0)
{
if(pcs_mkdir(ROOT_DIR)<0)
{
PCS_DEBUG("createdirfailed\n");
return0;
}
}
if(pcs_ls(ROOT_DIR)<0)
{
PCS_DEBUG("getrootdirinfofailed\n");
return0;
}
while(1)
{
memset(inputbuf,0,sizeof(inputbuf));
fgets(inputbuf,sizeof(inputbuf),stdin);
ptr=strchr(inputbuf,''\n'');
if(ptr)
{
ptr=''\0'';
}
largc=parse_opt(inputbuf,largv,10);
if(largc<=0)
{
continue;
}
elseif(strcmp(largv[0],"exit")==0)
{
break;
}
elseif(strcmp(largv[0],"help")==0)
{
usage();
continue;
}
elseif(strcmp(largv[0],"get")==0)
{
if(largc!=3)
{
PCS_DEBUG("argerr\n");
continue;
}
if(pcs_get(largv[1],largv[2])<0)
{
PCS_DEBUG("getfailed\n");
}
else
{
PCS_DEBUG("\nok\n");
}
}
elseif(strcmp(largv[0],"ls")==0)
{
if(largc==2)
{
if(pcs_ls(largv[1])<0)
{
PCS_DEBUG("lsfailed\n");
}
else
{
PCS_DEBUG("\nok\n");
}
}
elseif(largc==1)
{
if(pcs_ls(curdir)<0)
{
PCS_DEBUG("lsfailed\n");
}
else
{
PCS_DEBUG("\nok\n");
}
}
}
elseif(strcmp(largv[0],"rm")==0)
{
if(largc!=2)
{
PCS_DEBUG("argerr\n");
continue;
}
if(pcs_rm(largv[1])<0)
{
PCS_DEBUG("rmfailed\n");
}
else
{
PCS_DEBUG("\nok\n");
}
}
elseif(strcmp(largv[0],"put")==0)
{
if(largc!=3)
{
PCS_DEBUG("argerr\n");
continue;
}
if(pcs_put(largv[1],largv[2])<0)
{
PCS_DEBUG("putfailed\n");
}
else
{
PCS_DEBUG("\nok\n");
}
}
elseif(strcmp(largv[0],"mkdir")==0)
{
if(largc!=2)
{
PCS_DEBUG("argerr\n");
continue;
}
if(pcs_mkdir(largv[1])<0)
{
PCS_DEBUG("mkdirfailed\n");
}
else
{
PCS_DEBUG("\nok\n");
}
}
elseif(strcmp(largv[0],"find")==0)
{
if(largc==2)
{
if(pcs_find(curdir,largv[1])<0)
{
PCS_DEBUG("findfailed\n");
}
else
{
PCS_DEBUG("\nok\n");
}
}
if(largc==3)
{
if(pcs_find(largv[1],largv[2])<0)
{
PCS_DEBUG("findfailed\n");
}
else
{
PCS_DEBUG("\nok\n");
}
}
}
}
return0;
}
trans_inf.c
#define_GNU_SOURCE
#include
#include
#include
#include
#include
#include
#include
staticsize_treveived_callback(charptr,size_tsize,size_tnmemb,charuserdata)
{
charc;
if(userdata)
{
if(asprintf(&c,"%s%.s",userdata,sizenmemb,ptr)==-1)
{
free(userdata);
return-1;
}
free(userdata);
}
else
{
if(asprintf(&c,"%.s",sizenmemb,ptr)==-1)
{
return-1;
}
}
userdata=c;
returnsizenmemb;
}
voidtrans_init()
{
curl_global_init(CURL_GLOBAL_ALL);
}
intpostcmd(charremote,charpostdata,charreceived_data)
{
CURLcurl;
CURLcoderes;
longcode=0;
curl=curl_easy_init();
if(curl)
{
curl_easy_setopt(curl,CURLOPT_URL,remote);
curl_easy_setopt(curl,CURLOPT_POSTFIELDS,postdata);
//curl_easy_setopt(curl,CURLOPT_VERBOSE,1);
curl_easy_setopt(curl,CURLOPT_WRITEDATA,received_data);
curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,reveived_callback);
res=curl_easy_perform(curl);
if(res!=CURLE_OK)
{
fprintf(stderr,"curl_easy_perform()failed:%s\n",
curl_easy_strerror(res));
}
curl_easy_getinfo(curl,CURLINFO_RESPONSE_CODE,&code);
curl_easy_cleanup(curl);
if(code==200)
{
return0;
}
else
{
return-1;
}
}
return-1;
}
intgetcmd(charremote,charreceived_data)
{
CURLcurl;
CURLcoderes;
longcode=0;
curl=curl_easy_init();
if(curl)
{
curl_easy_setopt(curl,CURLOPT_URL,remote);
//curl_easy_setopt(curl,CURLOPT_VERBOSE,1);
curl_easy_setopt(curl,CURLOPT_WRITEDATA,received_data);
curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,reveived_callback);
res=curl_easy_perform(curl);
if(res!=CURLE_OK)
{
fprintf(stderr,"curl_easy_perform()failed:%s\n",
curl_easy_strerror(res));
}
curl_easy_getinfo(curl,CURLINFO_RESPONSE_CODE,&code);
curl_easy_cleanup(curl);
if(code==200)
{
return0;
}
else
{
return-1;
}
}
return-1;
}
intdownload(charremote,charfile,charreceived_data)
{
CURLcurl;
CURLcoderes;
FILEfp=NULL;
longcode=0;
structstatbuf;
curl=curl_easy_init();
if(curl)
{
fp=fopen(file,"w");
if(fp)
{
curl_easy_setopt(curl,CURLOPT_URL,remote);
//curl_easy_setopt(curl,CURLOPT_VERBOSE,1);
curl_easy_setopt(curl,CURLOPT_NOPROGRESS,0);
curl_easy_setopt(curl,CURLOPT_WRITEDATA,fp);
res=curl_easy_perform(curl);
if(res!=CURLE_OK)
{
fprintf(stderr,"curl_easy_perform()failed:%s\n",
curl_easy_strerror(res));
}
fclose(fp);
curl_easy_getinfo(curl,CURLINFO_RESPONSE_CODE,&code);
}
curl_easy_cleanup(curl);
if(code==200)
{
return0;
}
else
{
if(stat(file,&buf)==0)
{
fp=fopen(file,"r");
if(fp)
{
received_data=malloc(buf.st_size);
if(received_data)
{
if(fread(received_data,1,buf.st_size,fp)==buf.st_size)
{
fclose(fp);
remove(file);
return-1;
}
free(received_data);
received_data=NULL;
}
fclose(fp);
}
remove(file);
}
return-1;
}
}
return-1;
}
intupload(charremote,charfile,charreceived_data)
{
CURLcurl;
CURLcoderes;
structcurl_httppostformpost=NULL;
structcurl_httppostlastptr=NULL;
longcode=0;
curl=curl_easy_init();
if(curl)
{
curl_easy_setopt(curl,CURLOPT_URL,remote);
curl_easy_setopt(curl,CURLOPT_POST,remote);
//curl_easy_setopt(curl,CURLOPT_VERBOSE,1);
curl_easy_setopt(curl,CURLOPT_NOPROGRESS,0);
curl_formadd(&formpost,
&lastptr,
CURLFORM_COPYNAME,"file",
CURLFORM_FILE,file,
CURLFORM_END);
curl_easy_setopt(curl,CURLOPT_HTTPPOST,formpost);
curl_easy_setopt(curl,CURLOPT_WRITEDATA,received_data);
curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,reveived_callback);
res=curl_easy_perform(curl);
if(res!=CURLE_OK)
{
fprintf(stderr,"curl_easy_perform()failed:%s\n",
curl_easy_strerror(res));
}
curl_easy_getinfo(curl,CURLINFO_RESPONSE_CODE,&code);
curl_easy_cleanup(curl);
curl_formfree(formpost);
if(code==200)
{
return0;
}
else
{
return-1;
}
}
return-1;
}
|
|