配色: 字号:
百度pcs操作实例c语言版
2013-10-18 | 阅:  转:  |  分享 
  
百度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;

}













































献花(0)
+1
(本文系白案编程首藏)