libCurl上传下载代码一个好用的
来源:互联网 发布:网络机顶盒怎么用wifi 编辑:程序博客网 时间:2024/05/17 21:43
[cpp] view plaincopyprint?
- #include
- #include
- #include
- #include
- size_t getcontentlengthfunc(void *ptr, size_t size, size_t nmemb, void *stream)
- {
- int r;
- long len = 0;
- //r = _snscanf(ptr, size * nmemb, "Content-Length: %ld\n", &len);
- r = sscanf((const char*)ptr, "Content-Length: %ld\n", &len);
- if (r)
- *((long *) stream) = len;
- return size * nmemb;
- }
- size_t discardfunc(void *ptr, size_t size, size_t nmemb, void *stream)
- {
- return size * nmemb;
- }
- //write data to upload
- size_t writefunc(void *ptr, size_t size, size_t nmemb, void *stream)
- {
- return fwrite(ptr, size, nmemb, (FILE*)stream);
- }
- size_t readfunc(void *ptr, size_t size, size_t nmemb, void *stream)
- {
- FILE *f = (FILE*)stream;
- size_t n;
- if (ferror(f))
- return CURL_READFUNC_ABORT;
- n = fread(ptr, size, nmemb, f) * size;
- return n;
- }
- int upload(CURL *curlhandle, const char * remotepath, const char * localpath, long timeout, long tries)
- {
- FILE *f;
- long uploaded_len = 0;
- CURLcode r = CURLE_GOT_NOTHING;
- int c;
- f = fopen(localpath, "rb");
- if (f == NULL) {
- perror(NULL);
- return 0;
- }
- curl_easy_setopt(curlhandle, CURLOPT_UPLOAD, 1L);
- curl_easy_setopt(curlhandle, CURLOPT_URL, remotepath);
- curl_easy_setopt(curlhandle, CURLOPT_USERPWD, "spider:spider");
- if (timeout)
- curl_easy_setopt(curlhandle, CURLOPT_FTP_RESPONSE_TIMEOUT, timeout);
- curl_easy_setopt(curlhandle, CURLOPT_HEADERFUNCTION, getcontentlengthfunc);
- curl_easy_setopt(curlhandle, CURLOPT_HEADERDATA, &uploaded_len);
- curl_easy_setopt(curlhandle, CURLOPT_WRITEFUNCTION, discardfunc);
- curl_easy_setopt(curlhandle, CURLOPT_READFUNCTION, readfunc);
- curl_easy_setopt(curlhandle, CURLOPT_READDATA, f);
- curl_easy_setopt(curlhandle, CURLOPT_FTPPORT, "-");
- curl_easy_setopt(curlhandle, CURLOPT_FTP_CREATE_MISSING_DIRS, 1L);
- curl_easy_setopt(curlhandle, CURLOPT_VERBOSE, 1L);
- for (c = 0; (r != CURLE_OK) && (c < tries); c++) {
- if (c) {
- curl_easy_setopt(curlhandle, CURLOPT_NOBODY, 1L);
- curl_easy_setopt(curlhandle, CURLOPT_HEADER, 1L);
- r = curl_easy_perform(curlhandle);
- if (r != CURLE_OK)
- continue;
- curl_easy_setopt(curlhandle, CURLOPT_NOBODY, 0L);
- curl_easy_setopt(curlhandle, CURLOPT_HEADER, 0L);
- fseek(f, uploaded_len, SEEK_SET);
- curl_easy_setopt(curlhandle, CURLOPT_APPEND, 1L);
- }
- else {
- curl_easy_setopt(curlhandle, CURLOPT_APPEND, 0L);
- }
- r = curl_easy_perform(curlhandle);
- }
- fclose(f);
- if (r == CURLE_OK)
- return 1;
- else {
- fprintf(stderr, "%s\n", curl_easy_strerror(r));
- return 0;
- }
- }
- // 下载
- int download(CURL *curlhandle, const char * remotepath, const char * localpath, long timeout, long tries)
- {
- FILE *f;
- curl_off_t local_file_len = -1 ;
- long filesize =0 ;
- CURLcode r = CURLE_GOT_NOTHING;
- struct stat file_info;
- int use_resume = 0;
- //获取本地文件大小信息
- if(stat(localpath, &file_info) == 0)
- {
- local_file_len = file_info.st_size;
- use_resume = 1;
- }
- //追加方式打开文件,实现断点续传
- f = fopen(localpath, "ab+");
- if (f == NULL) {
- perror(NULL);
- return 0;
- }
- curl_easy_setopt(curlhandle, CURLOPT_URL, remotepath);
- curl_easy_setopt(curlhandle, CURLOPT_USERPWD, "spider:spider");
- //连接超时设置
- curl_easy_setopt(curlhandle, CURLOPT_CONNECTTIMEOUT, timeout);
- //设置头处理函数
- curl_easy_setopt(curlhandle, CURLOPT_HEADERFUNCTION, getcontentlengthfunc);
- curl_easy_setopt(curlhandle, CURLOPT_HEADERDATA, &filesize);
- // 设置断点续传
- curl_easy_setopt(curlhandle, CURLOPT_RESUME_FROM_LARGE, use_resume?local_file_len:0);
- curl_easy_setopt(curlhandle, CURLOPT_WRITEFUNCTION, writefunc);
- curl_easy_setopt(curlhandle, CURLOPT_WRITEDATA, f);
- curl_easy_setopt(curlhandle, CURLOPT_NOPROGRESS, 1L);
- curl_easy_setopt(curlhandle, CURLOPT_VERBOSE, 1L);
- r = curl_easy_perform(curlhandle);
- fclose(f);
- if (r == CURLE_OK)
- return 1;
- else {
- fprintf(stderr, "%s\n", curl_easy_strerror(r));
- return 0;
- }
- }
- int main(int c, char **argv)
- {
- CURL *curlhandle = NULL;
- CURL *curldwn = NULL;
- curl_global_init(CURL_GLOBAL_ALL);
- curlhandle = curl_easy_init();
- curldwn = curl_easy_init();
- upload(curlhandle, "ftp://192.168.0.185/a/success", "D:/abc.jpg", 1, 3);
- download(curldwn, "ftp://192.168.0.185/a/success", "D:/abc1.jpg", 1, 3);
- curl_easy_cleanup(curlhandle);
- curl_easy_cleanup(curldwn);
- curl_global_cleanup();
- return 0;
- }
0 0
- libCurl上传下载代码一个好用的
- libcurl 库的ftp上传下载代码
- 好用的上传下载插件。
- Libcurl的初步实现tfp上传下载功能
- libcurl官方实例代码(HTTP,FTP,上传下载等等)
- 一个更好用的http库 -- libcurl,送上简单示例代码
- ucrl,libcurl 实现上传下载
- libcurl库的使用支持http、https、ftp上传下载
- 一个用servlet写的上传下载
- libcurl 使用的一个错误
- 一个好用的中文编码过滤器的代码
- 介绍一个好东西:RELO, 代码分析用的
- LIBCURL实现FTP上传下载功能
- 一个好的代码自动生成工具
- 一个好的校内网代码站
- 一个比较好的代码注释方法
- 好的代码只有一个return
- 推荐一个好的代码下载网站
- 程序出错时自动生成dump文件
- iOS同一种页面布局加载不同的页面数据的数据刷新
- SaaS营销网站剖析:SaaS主页,你给用户的第一印象
- 第三方软件要使用QQ邮箱进行发邮件相关设置
- android编码时的细节进行优化内存
- libCurl上传下载代码一个好用的
- 银期转账 非法银期代理关系
- Android 之回调的简单用法
- unity默认资源的文件夹
- 小白进阶之寻找最大子数组问题
- libcurl 库的ftp上传下载代码
- 欢迎使用CSDN-markdown编辑器
- javaweb 利用POI生成excel报表 相关代码
- AttributedString创建富文本