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;
}