使用C++和libcurl下载指定的文件

使用C++语言,利用libcurl库,下载指定的https中的文件:比如https://www.xxxx.com/xxx/yyy/zzz.pdf

#include <iostream>
#include <fstream>
#include <curl/curl.h>// 写入数据的回调函数
size_t WriteData(void* ptr, size_t size, size_t nmemb, std::ofstream* stream)
{stream->write(static_cast<char*>(ptr), size * nmemb);return size * nmemb;
}// 分段下载函数
bool DownloadSegment(const std::string& url, std::ofstream& output, long start, long end)
{CURL* curl;CURLcode res;curl = curl_easy_init();if (curl) {// 设置URLcurl_easy_setopt(curl, CURLOPT_URL, url.c_str());// 设置Range头std::string range = std::to_string(start) + "-" + std::to_string(end);curl_easy_setopt(curl, CURLOPT_RANGE, range.c_str());// 设置写入数据的回调函数curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteData);curl_easy_setopt(curl, CURLOPT_WRITEDATA, &output);// 设置SSL选项curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L); // 验证服务器的SSL证书curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 2L); // 验证证书上的主机名// 执行请求res = curl_easy_perform(curl);// 清理curl_easy_cleanup(curl);if (res != CURLE_OK) {std::cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << std::endl;return false;}return true;}return false;
}// 获取文件大小
long GetFileSize(const std::string& url)
{CURL* curl;CURLcode res;double file_size = 0.0;curl = curl_easy_init();if (curl) {curl_easy_setopt(curl, CURLOPT_URL, url.c_str());curl_easy_setopt(curl, CURLOPT_NOBODY, 1L); // 不下载内容curl_easy_setopt(curl, CURLOPT_HEADER, 1L); // 只获取头部信息// 设置SSL选项curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L); // 验证服务器的SSL证书curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 2L); // 验证证书上的主机名res = curl_easy_perform(curl);if (res == CURLE_OK) {res = curl_easy_getinfo(curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &file_size);if ((res == CURLE_OK) && (file_size > 0.0)) {curl_easy_cleanup(curl);return static_cast<long>(file_size);}} else {std::cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << std::endl;}curl_easy_cleanup(curl);}return -1;
}int main() {std::string url = "https://img.linux.net.cn/lfs/LFS-BOOK-7.7-systemd.pdf"; // 替换为实际URLstd::string output_filename = "/home/licks/https_download/LFS-BOOK-7.7-systemd.pdf";long segment_size = 1024 * 1024; // 1MB// 获取文件大小long file_size = GetFileSize(url);if (file_size == -1) {std::cerr << "Failed to get file size." << std::endl;return 1;}std::cout << "File size: " << file_size << " bytes" << std::endl;// 打开输出文件std::ofstream output(output_filename, std::ios::binary);if (!output.is_open()) {std::cerr << "Failed to open output file." << std::endl;return 1;}// 分段下载for (long start = 0; start < file_size; start += segment_size) {long end = start + segment_size - 1;if (end >= file_size) {end = file_size - 1;}std::cout << "Downloading segment: " << start << "-" << end << std::endl;if (!DownloadSegment(url, output, start, end)) {std::cerr << "Failed to download segment." << std::endl;output.close();return 1;}}// 关闭输出文件output.close();std::cout << "Download complete." << std::endl;return 0;
}

使用的是CMake作为代码工程管理手段:

cmake_minimum_required(VERSION 3.0)
project(download_https)set(CMAKE_CXX_STANDARD 11)add_executable(download_https main.cpp)
target_link_libraries(download_https curl)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/46414.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt类 | QObject类详解

文章目录 一、QObject类介绍二、Properties&#xff08;属性&#xff09;三、Public Functions&#xff08;公共函数&#xff09;四、Public Slots&#xff08;公共槽函数&#xff09;五、Signals&#xff08;信号&#xff09;六、Static Public Members&#xff08;静态公共成…

react Ant Design 动态表头添加操作列

模拟后端返回的表头、列表数据 注意&#xff1a;我们要在表头数据中添加一个 render 函数&#xff0c;里面就是你操作列的内容&#xff0c;value是你数据列表每行的对象 &#xff0c;item 是你表头的对象 页面中去处理这个两个数组 dataList.forEach((item, index) > {item.…

End-to-End Object Detection with Transformers【方法详细解读】

摘要 我们提出了一种新的方法,将目标检测视为一个直接的集合预测问题。我们的方法简化了检测流程,有效地消除了许多手工设计的组件,如非极大值抑制程序或锚生成,这些组件显式编码了我们关于任务的先验知识。新框架的主要成分,称为DEtection TRansformer或DETR,是一个基于…

昇思25天学习打卡营第24天 | RNN实现情感分类

概述 情感分类是自然语言处理中的经典任务&#xff0c;是典型的分类问题。本节使用MindSpore实现一个基于RNN网络的情感分类模型&#xff0c;实现如下的效果&#xff1a; 输入: This film is terrible 正确标签: Negative 预测标签: Negative输入: This film is great 正确标…

dmasmtool工具详细用法

DMASMTOOL 是 DMASM 文件系统管理工具&#xff0c;提供了一套类 Linux 文件操作命令&#xff0c;用于管理 ASM 文件&#xff0c;是管理、维护 DMASM 的好帮手。DMASMTOOL 工具使用 DMASMAPI 连接到 DMASMSVR&#xff0c;并调用相应的 DMASMAPI 函数&#xff0c;实现创建、拷贝、…

C1W2.LAB.Visualizing Naive Bayes

理论课&#xff1a;C1W2.Sentiment Analysis with Nave Bayes 文章目录 导入包Calculate the likelihoods for each tweetUsing Confidence Ellipses to interpret Nave Bayes 理论课&#xff1a; C1W2.Sentiment Analysis with Nave Bayes 导入包 在下面的练习中&#xff0…

C++ //练习 15.12 有必要将一个成员函数同时声明成override和final吗?为什么?

C Primer&#xff08;第5版&#xff09; 练习 15.12 练习 15.12 有必要将一个成员函数同时声明成override和final吗&#xff1f;为什么&#xff1f; 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 解释 需要&#xff0c;如果我们需要…

everything搜索不到任何文件-设置

版本&#xff1a; V1.4.1.1024 (x64) 问题&#xff1a;搜索不到任何文件 click:[工具]->[选项]->下图所示 将本地磁盘都选中包含

Python爬虫速成之路(3):下载图片

hello hello~ &#xff0c;这里是绝命Coding——老白~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#xff1a;绝命Coding-CSDN博客 &a…

SpringMVC源码解析(一):web容器启动流程

SpringMVC源码系列文章 SpringMVC源码解析(一)&#xff1a;web容器启动流程 目录 一、SpringMVC全注解配置1、pom文件2、web容器初始化类(代替web.xml)3、SpringMVC配置类(代替springmvc.xml)4、测试Controller 二、SpringServletContainerInitializer1、web容器初始化入口2、…

从本地到全局:基于图的RAG方法进行查询聚焦原理摘要

摘要 使用检索增强生成&#xff08;RAG&#xff09;从外部知识源检索相关信息&#xff0c;使大型语言模型&#xff08;LLMs&#xff09;能够回答有关私有和/或以前未见过的文档集合的问题。然而&#xff0c;当针对整个文本文档库提出全局问题时&#xff0c;例如“数据集中的主…

【css】image 使用 transform:scale 放大后显示不全的问题

css 可以用 transform: scale(1.2) 实现图片放大 1.2 倍显示的功能&#xff0c;在此基础上可以修改 transform-origin 为用户点击的坐标值优化体验。问题在于 origin 位于图片下方时&#xff0c;图片放大后出现滚动条&#xff0c;而滚动条的高度会忽略放大显示的图片的上半部分…

代码随想录算法训练营Day58|101.孤岛的总面积、102.沉没孤岛、103.水流问题、104.建造最大岛屿

孤岛的总面积 101. 孤岛的总面积 (kamacoder.com) 先利用BFS或DFS对边界找岛屿并将其置0&#xff0c;岛屿变成海洋&#xff0c;然后再重新遍历一遍graph&#xff0c;在遍历过程中计算孤岛面积即可&#xff0c;代码如下。 #include <iostream> #include <vector>…

音视频入门基础:H.264专题(13)——FFmpeg源码中通过SPS属性获取视频色彩格式的实现

一、引言 通过FFmpeg命令可以获取到H.264裸流文件的色彩格式&#xff08;又译作色度采样结构、像素格式&#xff09;&#xff1a; 在vlc中也可以获取到色彩格式&#xff08;vlc底层也使用了FFmpeg进行解码&#xff09;&#xff1a; 这个色彩格式就是之前的文章《音视频入门基础…

【精品资料】模块化数据中心解决方案(33页PPT)

引言&#xff1a;模块化数据中心解决方案是一种创新的数据中心设计和部署策略&#xff0c;旨在提高数据中心的灵活性、可扩展性和效率。这种方案通过将数据中心的基础设施、计算、存储和网络资源封装到标准化的模块中&#xff0c;实现了快速部署、易于管理和高效运维的目标 方案…

2024最新Cloudways主机使用教程(含最新Cloudways折扣码)

Cloudways是一家提供云托管服务的公司&#xff0c;可以帮助你轻松管理和运行你的网站。本教程是Cloudways主机注册和使用教程。Cloudways界面简洁&#xff0c;使用方便&#xff0c;不需要复杂的设置&#xff0c;就能快速搭建一个WordPress网站。它的主机功能包括高级缓存和Bree…

DepthAnything(2): 基于ONNXRuntime在ARM(aarch64)平台部署DepthAnything

DepthAnything(1): 先跑一跑Depth Anything_depth anything离线怎么跑-CSDN博客 目录 1. 写在前面 2. 安装推理组件 3. 生成ONNX 4. 准备ONNXRuntime库 5. API介绍 6. 例程 1. 写在前面 DepthAnything是一种能在任何情况下处理任何图像的简单却又强大的深度估计模型。 …

Spring Cloud微服务开发框架

Spring Cloud是基于Spring Boot的微服务开发框架&#xff0c;为构建分布式系统和微服务架构提供了一系列的工具和解决方案。它包含了很多组件&#xff0c;每个组件都有特定的功能&#xff0c;可以解决微服务架构中常见的问题。下面是对Spring Cloud的一些主要组件和功能的详细介…

KingbaseES数据库逻辑备份还原

数据库版本&#xff1a;KingbaseES V008R006C008B0014 简介 介绍2个KingbaseES用于备份还原的工具&#xff1a; sys_dump&#xff1a;逻辑备份sys_restore&#xff1a;逻辑还原 sys_dump 是 KingbaseES 用于逻辑备份的工具&#xff0c;可以将数据备份为不同类型的文件。支持数据…

ARM功耗管理标准接口之SCMI

安全之安全(security)博客目录导读 思考&#xff1a;功耗管理有哪些标准接口&#xff1f;ACPI&PSCI&SCMI&#xff1f; Advanced Configuration and Power Interface Power State Coordination Interface System Control and Management Interface 下图示例说明了实现…