文章中有使用到libcurl相关文件,请自行到官网下载编译后导入使用:下面示例仅供参考

#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
#include <wininet.h>
#include "curl/curl.h"
#include "resource.h"
#include <sys/stat.h>
#include <fcntl.h>
#include "HttpClient.h"
#include <string>
#pragma comment(lib, "Wininet.lib")#define MAXBLOCKSIZE 1024
//第一种方法:使用Internet系列函数下载
void download1(const char *url, const char* file)
{HINTERNET hSession = InternetOpen("RookIE/1.0", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);if (hSession != NULL){HINTERNET handle2 = InternetOpenUrl(hSession, url, NULL, 0, INTERNET_FLAG_DONT_CACHE, 0);if (handle2 != NULL){printf("%s\n", url);byte Temp[MAXBLOCKSIZE];ULONG Number = 1;FILE *stream;if ((stream = fopen(file, "wb")) != NULL){while (Number > 0){InternetReadFile(handle2, Temp, MAXBLOCKSIZE - 1, &Number);fwrite(Temp, sizeof(char), Number, stream);}fclose(stream);}InternetCloseHandle(handle2);handle2 = NULL;}InternetCloseHandle(hSession);hSession = NULL;}
}//第二种方法使用libcurl下载
size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream) {size_t written = fwrite(ptr, size, nmemb, stream);return written;
}//进度条
int my_progress_func(char *progress_data,double total,double cur,double ultotal,double ulnow)
{printf("%s (%.2lf%% -- cur=%.2lf)\n", progress_data, cur*100.0 / total, cur);return 0;
}int download2(const char* url, const char outfilename[FILENAME_MAX]) {CURL *curl;FILE *fp;CURLcode res;char *progress_data = "* ";res = curl_global_init(CURL_GLOBAL_ALL);//初始化libcurlif (CURLE_OK != res){curl_global_cleanup();return -1;}curl = curl_easy_init();//得到 easy interface型指针if (curl) {fopen_s(&fp, outfilename, "wb");curl_easy_setopt(curl, CURLOPT_URL, url);/*  调用curl_easy_setopt()设置传输选项 */curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);/*  根据curl_easy_setopt()设置的传输选项,实现回调函数以完成用户特定任务  */curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);curl_easy_setopt(curl, CURLOPT_NOPROGRESS, FALSE);//开启进度回调功能curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, my_progress_func);//设置进度回调函数 curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, progress_data);//设置进度回调函数参数curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, true);res = curl_easy_perform(curl);        // 调用curl_easy_perform()函数完成传输任务  fclose(fp);if (res != CURLE_OK) {fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));curl_easy_cleanup(curl);return -1;}curl_easy_cleanup(curl);                                     // 调用curl_easy_cleanup()释放内存   }curl_global_cleanup();return 0;
}int _tmain(int argc, _TCHAR* argv[])
{download1("http://image.baidu.com/search/down?tn=download&word=download&ie=utf8&fr=detail&url=http%3A%2F%2Fpic49.nipic.com%2Ffile%2F20140927%2F19617624_230415502002_2.jpg&thumburl=http%3A%2F%2Fimg4.imgtn.bdimg.com%2Fit%2Fu%3D2611079001%2C3896435225%26fm%3D26%26gp%3D0.jpg", "C:\\download1.jpg");download2("http://image.baidu.com/search/down?tn=download&word=download&ie=utf8&fr=detail&url=http%3A%2F%2Fpic49.nipic.com%2Ffile%2F20140927%2F19617624_230415502002_2.jpg&thumburl=http%3A%2F%2Fimg4.imgtn.bdimg.com%2Fit%2Fu%3D2611079001%2C3896435225%26fm%3D26%26gp%3D0.jpg", "C:\\download2.jpg");while (1);return 0;
}

vc下文件下载的两种方法相关推荐

  1. 【Markdown】 实现上角标和下角标的两种方法(详细讲解!!!)

    作者:MiTu_-_ 本帖内容著作权归作者所有,转载请务必保留本文链接 Markdown实现上下角标的两种方法 第一种 使用Markdown自带的代码格式: 下标: ~ (内容) ~ 例:H2O H~ ...

  2. python目录下的文件夹_Python列出当前文件夹下文件的两种方法

    使用Python做一些自动化操作时,经常与文件夹和文件打交道,这就依赖于OS模块了. OS是Operate System的缩写,是Python标准库中一个用于访问操作系统功能的模块,OS模块中的接口可 ...

  3. linux下时间同步的两种方法分享

    为什么80%的码农都做不了架构师?>>>    方法1: 与一个已知的时间服务器同步 ntpdate time.nist.gov 方法2:linux自动同步时间 vi /etc/cr ...

  4. linux系统取消时间同步,linux下时间同步的两种方法分享

    方法1:与一个已知的时间服务器同步 复制代码代码如下: ntpdate time.nist.gov 其中 time.nist.gov 是一个时间服务器. 删除本地时间并设置时区为上海 复制代码代码如下 ...

  5. 添加下划线的两种方法

    1.text-decorate:underline 2.border-bottom 仅仅只是添加下划线就用1了,要给下划线加样式就用2了. 转载于:https://www.cnblogs.com/si ...

  6. linux怎么同步系统时间同步,linux下时间同步的两种方法分享

    方法1:与一个已知的时间服务器同步 ntpdate time.nist.gov 其中 time.nist.gov 是一个时间服务器. 删除本地时间并设置时区为上海 rm -rf /etc/localt ...

  7. excel文件下载处理两种方法

    excel.js文件 export async function commonExportData(res) {//转换成二进制对象const type ="application/x-do ...

  8. AIX更改逻辑卷属性的两种方法(smit和命令行)

    起因:mklv 时忘记指定-t 参数导致TYPE默认为RAW(应该是raw), p550a:/dev#lslv data40_disk LOGICAL VOLUME:     data40_disk ...

  9. centos下两种方法安装git

    centos 5 64位下两种方法安装git 这里来给大家介绍下编译安装和yum安装git.   系统:centos 5.5 64位   需要的软件包:git-latest.tar.gz epel-r ...

最新文章

  1. 一流科技完成5000万人民币A轮融资,高瓴创投独家领投
  2. 用于目标检测的半自动视频标注
  3. c#书写规范之---注释
  4. 三菱触摸屏通讯错误_三菱触摸屏常见问题及故障汇总
  5. .NET Core IdentityServer4实战 第Ⅳ章-集成密码登陆模式
  6. leetcode 867. 转置矩阵
  7. Shell字符串比较(等于、不等于、大于、小于、起始字符、结尾字符)
  8. iQOO Z5内置5000mAh大电池:超长续航安全感爆棚
  9. 基于JAVA+Servlet+JSP+MYSQL的学生选课系统
  10. 为什么现在的很多酒店都不收押金,只收房费了?
  11. c语言spi测试代码,C语言程序SPI
  12. 剑指offer面试题48. 最长不含重复字符的子字符串(滑动窗口)
  13. 再看网路层分组的转发
  14. java pptx转图_Java 将PPT转换为图片格式
  15. flash动画有几种文件格式
  16. SQLyog:Error Code : 1583 Incorrect parameters in the call to native function ‘concat‘
  17. 简师网:考上教编才知道,小学教师和中学教师有这些差别!
  18. 408计算机网络04-HTTP 长连接短连接使用场景是什么
  19. STM32通过TB6612FNG模块驱动电机
  20. 流体动力学—迹线和流线

热门文章

  1. 揭秘RLHF;可商用开源LLM列表;领域编译器的前世今生
  2. Tigress学习系列【2】(ImplicitFlow)
  3. UltraEdit 给代码注释添加快捷键
  4. 数值计算 - 常用函数值计算方法
  5. JavaScript 启用全屏显示/退出全屏模式
  6. 医学检验专业职业生涯
  7. Centos各个版本下载地址
  8. Atomic 原子类
  9. i.MX6ULL终结者Putty软件的安装教程
  10. perform指标分析_ABAQUS与PERFORM-3D在弹塑性时程分析中的应用及对比研究