首页 > 其他分享 >结合Poco库的一个httpdown方法

结合Poco库的一个httpdown方法

时间:2024-11-08 16:57:08浏览次数:4  
标签:std cout zip Poco 结合 include httpdown JAVAkaifa

poco库很丰富,

这里列举了生成 guide,httpdownload 的2个方法。

下载的时候,顺便打印了当前下载进度。

 

#include <sstream>
#include <iomanip>
#include <istream>
#include <ostream>
#include <iostream>
#include <fstream>    // ofstream
 


#include <Poco/Path.h>
#include <openssl/bio.h>
#include <openssl/evp.h>
#include <Poco/File.h>
#include <Poco/DirectoryIterator.h>
#include <Poco/Net/HTTPClientSession.h>
#include <Poco/Net/HTTPRequest.h>
#include <Poco/Net/HTTPResponse.h>
#include <Poco/URI.h>
#include <Poco/Path.h>
#include <Poco/UUIDGenerator.h>


std::string genUUID()
{
    Poco::UUIDGenerator generator;
    Poco::UUID uuid = generator.createRandom();
    std::string uuidStr = uuid.toString();

    return uuidStr;
}



// 显示进度条的简单函数
void showProgress(size_t received, size_t total) {
    if (total == 0) return; // 避免除以零错误
 
    int barWidth = 70;
    double progress = (double)received / total;
    int pos = barWidth * progress;
 
    std::cout << "[";
    for (int i = 0; i < barWidth; ++i) {
        if (i < pos) std::cout << "=";
        else if (i == pos) std::cout << ">";
        else std::cout << " ";
    }
    std::cout << "] " << int(progress * 100.0) << " %\r";
    std::cout.flush();
}
 
int httpDownload(const std::string &url, const std::string& dirPath)
{
    try
    {
        printf("url:%s\r\n\r\n", url.c_str());
        printf("dirPath:%s\r\n\r\n", dirPath.c_str());
 
        Poco::URI uri(url);
 
        std::cout << "uri.getPath: " << uri.getPath() << ", getHost: " << uri.getHost() << ", getPort: " << uri.getPort() << std::endl;
 
        Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_GET, uri.getPathAndQuery(), Poco::Net::HTTPMessage::HTTP_1_1);
        // 添加请求头以获取内容长度(如果服务器支持)
        request.add("Range", "bytes=0-");
 
        Poco::Net::HTTPClientSession session(uri.getHost(), uri.getPort());
 
        std::ostream& requestStream = session.sendRequest(request);
        requestStream.flush();
 
        Poco::Net::HTTPResponse response;
        std::istream& responseStream = session.receiveResponse(response);
 
        if (response.getStatus() == Poco::Net::HTTPResponse::HTTP_OK || response.getStatus() == Poco::Net::HTTPResponse::HTTP_PARTIAL_CONTENT) {
            long contentLength = response.getContentLength();
            std::string filename = Poco::Path(uri.getPath()).getFileName();
            Poco::Path fullPath(dirPath, filename);
            std::cout << "fullpath: " << fullPath.toString() << ", contentLength:"<<contentLength << std::endl;
 
            std::ofstream outputFile(fullPath.toString(), std::ios::binary);
            if (!outputFile) {
                return 1;
            }
 
            char buffer[8192]={0};
            size_t totalReceived = 0;
            while (responseStream && !outputFile.fail()) {
                responseStream.read(buffer, sizeof(buffer));
                std::streamsize bytesRead = responseStream.gcount();
                if (bytesRead > 0) {
                    outputFile.write(buffer, bytesRead);
                    totalReceived += bytesRead;
                    showProgress(totalReceived, contentLength);
                }
            }
 
            if (outputFile.fail()) {
                return 1;
            }
 
            std::cout << std::endl; // 换行以结束进度条显示
        } else {
            printf("HTTP request failed with status: %d\r\n", response.getStatus());
            return 1;
        }
 
        responseStream.clear();
        session.reset();
    }
    catch (const Poco::Exception& ex) {
        printf("Poco exception: %s\r\n", ex.displayText().c_str());
        return 1;
    } catch (const std::exception& ex) {
        printf("Standard exception: %s\r\n", ex.what());
        return 1;
    } catch (...) {
        printf("Unknown exception\r\n");
        return 1;
    }
    return 0;
}


std::string getFileNameFromURL(const std::string &url)
{
    Poco::URI uri(url);

    std::string path = uri.getPath();

    Poco::Path pocoPath(path);
    return pocoPath.getFileName();
}


void test(){
    std::string strDownloadUrl = "http://xz.winwin7xz.com/Small/JAVAkaifa.zip";
    std::cout<<"filename:"<<getFileNameFromURL(strDownloadUrl)<<std::endl;

    std::cout<<"====================start download ===================="<<std::endl;
    int iRet = httpDownload(strDownloadUrl, "./Downloads");    
    std::cout<<" download finished, iRet:"<<iRet<<std::endl<<std::endl;
}

void test2(){
    for(int i=0; i<20; ++i){
        std::cout<<"["<<i<<"]: "<< genUUID()<<std::endl;
    }
    std::cout<<std::endl<<std::endl;
}

int main(){
    test2();

    test();
    return 0;
}

 

程序运行情况:

./bin/httpdownload 
[0]: 197c0aaf-c253-477a-a739-0d2e7f3bcf85
[1]: d6ee2b5e-b3a7-4069-bb3c-ca2e2566fbcc
[2]: 83391c46-8c91-4819-b02f-30ad2bd91f26
[3]: e4dc88c5-4a75-466d-aa55-5315a7b74e9c
[4]: 248e71bf-14b6-494d-9dc2-a5df18653b1a
[5]: 86122319-0827-4fb2-83b9-b8c3990d6f29
[6]: 55ad38af-d95c-4317-898c-82abe6ee036e
[7]: 7facb35a-525d-4f81-8e50-28f0bd742c57
[8]: 78bf2d0b-d119-43df-ab14-176cf85b3ae4
[9]: b8721680-d407-40e5-aec3-1b43c3c7c44b
[10]: 2620278b-5b4e-4bc4-8b85-ffd6e1dec86f
[11]: d9260f57-18ec-4661-9afe-4d637dbdb0d8
[12]: c0e198c3-daa4-40e3-8b0c-962119f7d00f
[13]: 3e65a64b-c8bc-4011-bfb1-d371d7abcf6d
[14]: 67b8d056-58e3-4df3-a6a8-eeb6e2cb7762
[15]: f2e750f5-8aef-45f4-a5b1-fb8e12fb8b69
[16]: 9fdea346-105f-48f4-a4c4-538e599bd777
[17]: 6ed7e2cf-92e2-4084-adf9-0b552b1f602f
[18]: 45245547-a7d3-44e4-9981-e96560df0326
[19]: 2fa938df-eafa-4608-97f2-25983b7b8899

filename:JAVAkaifa.zip
====================start download ====================
url:http://xz.winwin7xz.com/Small/JAVAkaifa.zip

dirPath:./Downloads

uri.getPath: /Small/JAVAkaifa.zip, getHost: xz.winwin7xz.com, getPort: 80
fullpath: Downloads/JAVAkaifa.zip, contentLength:146090253
[================================================================>     ] 92 %

 

标签:std,cout,zip,Poco,结合,include,httpdown,JAVAkaifa
From: https://www.cnblogs.com/music-liang/p/18535439

相关文章

  • 一个非常有趣的挑战——物联网与AI结合的超级项目
    想要实现这个物联网与AI结合的超级项目,你需要准备一些硬件和软件环境,可以不同,我只是最近在学这个就以这个举例。以下是一个详细的清单,列出了所需的硬件和软件组件:硬件需求嵌入式设备开发板:例如STM32Nucleo板(如NUCLEO-F103RB)或其他支持Rust的嵌入式开发板。传感器:温......
  • 少儿编程教育的多维度对比:软件类、硬件类与软硬件结合课程的选择
    随着少儿编程教育的不断发展,市场上涌现出多种类型的编程课程,主要分为软件类课程、硬件类课程和软硬件结合类课程。三种课程各有特色,针对不同的编程对象和教学目标。本文将从多个维度深入对比这三类课程的特点、教学目的和学习难点,帮助家长和学生更好地选择适合的编程学习路径......
  • PHP与Vue.js结合,开发现代Web应用的前后端分离
    随着前端技术的迅猛发展,前后端分离已成为现代Web应用开发的重要趋势。在这个架构中,PHP作为后端语言,配合Vue.js这样的前端框架,可以有效提高开发效率和用户体验。PHP与Vue.js的结合,使得开发者能够专注于各自领域的专业技术,形成高效、灵活的开发模式。PHP作为一种成熟的后端开发语言......
  • 15分钟学 Go 第 43 天:前端与Go的结合
    第43天:前端与Go的结合目标:了解Go如何与前端交互,前端使用Vue.js在现代Web开发中,Go语言常用于后端开发,而Vue.js是一个流行的前端框架,用于构建用户界面。结合二者,可以构建高效、可维护的全栈应用。本节内容将详细介绍Go与Vue.js的交互方式,包括基本概念、架构设计、实战代码示......
  • 结合创新,小波变换+注意力机制竟能实现100%分类准确率
    2024深度学习发论文&模型涨点之——小波变换+注意力机制小波变换是一种先进的信号分析技术,它擅长捕捉信号的局部特征,但有时可能会忽略数据中的关键信息。为了克服这一局限,我们引入了注意力机制,这一机制能够强化模型对数据重要部分的关注。通过将小波变换与注意力机制相结合,我......
  • Python学习笔记-断点操作结合异常处理
    在编程中,调试和错误处理是提升代码质量和开发效率的关键环节。调试能帮助识别并修复问题,异常处理则使得程序能在出现错误时有效地管理而不至于崩溃。断点与异常处理的结合应用是高级编程中不可或缺的技巧,能够帮助更高效地定位问题,提高程序的鲁棒性。本文将通过详细的断点和......
  • MES系统和可视化大屏一旦结合了,生产流程就顺畅了
    MES系统与可视化大屏的结合,犹如为生产流程注入了一股强大的动力。可视化大屏将MES系统中的复杂数据以直观、清晰的方式呈现出来。生产线上的各个环节、设备状态、任务进度等信息一目了然。管理者可以实时监控生产过程,及时发现问题并作出调整。员工也能通过大屏了解自己的工......
  • Docker部署Portainer CE结合内网穿透实现容器的可视化管理与远程访问
    文章目录前言1.本地安装Docker2.本地部署PortainerCE3.公网远程访问本地Portainer-CE3.1内网穿透工具安装3.2创建远程连接公网地址4.固定PortainerCE公网地址前言本篇文章介绍如何在Ubuntu中使用docker本地部署PortainerCE可视化管理工具,并......
  • 灵动AI:高效、优质与创意的完美结合
    灵动AI,是人工智能与影像艺术的精彩邂逅。它以先进的算法为画笔,以海量的数据为颜料,绘制出一幅幅令人惊叹的视觉画卷。        灵动AI视频制作客户端:  https://aigc.genceai.comAI视频拥有非凡的创造力。它能够根据用户提供的主题、风格或情感倾向,迅速生......
  • 享元模式及其运用场景:结合工厂模式和单例模式优化内存使用
    介绍享元模式(FlyweightPattern)是一种结构型设计模式,它通过共享对象来减少内存使用,尤其是对于大量相似对象的场景。享元模式通常与工厂模式和单例模式结合使用,从而有效地控制和复用对象的创建。在享元模式中,享元对象的核心思想是将不可变的部分(共享的状态)和可变的部分(外部......