visual studio配置C++连接Ftp上传文件

1:参考Visual Studio构建libcurl库及正确包含_visual studio如何安装libcurl库-CSDN博客配置C++库文件

2:源代码

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
#include "../curl/curl.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#pragma comment(lib,"libcurl.lib")

class FTPs
{
public:
    static int ftpUpload(std::string remoteFtpPath, std::string localFilePath,long timeout); //FTP上传函数
private:
    static size_t readFunc(void* ptr, size_t size, size_t nmemb, void* stream); //FTP读取函数
};

//******************************************************************************
//*  Name        :   FTP::readFunc
//*  Author      :   cqnews
//*  Version     :   V1.0.0
//*  Data        :   2024.06.01
//*  Describe    :   FTP读取函数
//******************************************************************************/
size_t FTPs::readFunc(void* ptr, size_t size, size_t nmemb, void* stream)
{
    size_t n;
    FILE* f = (FILE*)stream;
    if (ferror(f))
    {
        return CURL_READFUNC_ABORT;
    }
 
    n = fread(ptr, size, nmemb, f) * size;
    return n;
}

//******************************************************************************
//*  Name         :   FTP::ftpUpload
//*  Author       :   cqnews
//*  Version      :   V1.0.0
//*  Data         :   2024.06.01
//*  Describe     :   FTP上传函数
//
//
//*  remoteFtpPath:  需要上传的ftp服务端地址和文件名
//*  localFilePath:  本地需要上传的文件完整路径
//*  timeout      :  上传超时时间 0:disable
//*  return       :  0:成功 -1:失败
//******************************************************************************/
int FTPs::ftpUpload(std::string remoteFtpPath, std::string localFilePath,long timeout)
{
    CURL* curl = NULL;
    try
    {
        curl_global_init(CURL_GLOBAL_ALL);
        struct stat file_info;
        curl_off_t fsize;
        if (stat(localFilePath.c_str(), &file_info))    /* 获得上传文件的大小 */
        {
            printf("FTP file could n't open '%s': %s.\n", localFilePath, strerror(errno));
            return -1;
        }
        fsize = (curl_off_t)file_info.st_size;
 
        FILE* fd;
        fd = fopen(localFilePath.c_str(), "rb");
        if (fd == NULL)
        {
            printf("FTP fopen file failed.\n");
            return -1;
        }
        curl = curl_easy_init();
        if (curl == NULL)
        {
            printf("FTP curl_easy_init create curl failed.");
            return -1;
        }
        remoteFtpPath.append(localFilePath);
        curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);               //使能上传功能
        curl_easy_setopt(curl, CURLOPT_URL, remoteFtpPath);        //设置特定目标
 
        curl_easy_setopt(curl, CURLOPT_USERNAME, "ftpuser_app");
        curl_easy_setopt(curl, CURLOPT_PASSWORD, "12345678");
        curl_easy_setopt(curl, CURLOPT_READFUNCTION, FTPs::readFunc);   //使用curl提供的Read功能
        curl_easy_setopt(curl, CURLOPT_READDATA, fd);             //将参数fd传递给回调函数

        curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);              //调试信息打印        
        curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, fsize);    /*设置要上传的文件的大小(可选) */
 
        if (timeout)
        {
            curl_easy_setopt(curl, CURLOPT_FTP_RESPONSE_TIMEOUT, timeout);
        }
 
        CURLcode r = curl_easy_perform(curl);
        fclose(fd);
 
        if (r != CURLE_OK)
        {
            printf("FTP upload event %s.\n", curl_easy_strerror(r));
            return -1;
        }
    }
    catch (...)
    {
 
    }
 
    if (curl)
    {
        curl_easy_cleanup(curl);
    }
    curl_global_cleanup();
    return 0;
}

  • 21
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值