libCurl 库sftp上传和下载

这篇博客详细介绍了如何使用libCurl库进行SFTP文件的上传和下载操作。在上传过程中,通过设置CURLOPT_READFUNCTION回调函数读取本地文件,并利用CURLOPT_UPLOAD选项进行上传。下载部分,自定义了写入回调函数my_fwrite,将远程文件内容写入本地文件。整个过程涉及到libCurl的初始化、设置URL、回调函数等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上传:

size_t DownloadFtp::read_callback(void *ptr, size_t size, size_t nmemb, void *stream)
{
curl_off_t nread;
/* in real-world cases, this would probably get this data differently
as this fread() stuff is exactly what the library already would do
by default internally */ 
size_t retcode = fread(ptr, size, nmemb, (FILE*)(stream));
nread = (curl_off_t)retcode;
// fprintf(stderr, "*** We read %" CURL_FORMAT_CURL_OFF_T
// " bytes from file\n", nread);
return retcode;
}



bool DownloadFtp::UpLoad(FILETYPE filetype,const QString& filepath,const QString& filename)
{
FILE* pSendFile = ::fopen(filepath.toStdString().c_str(), "rb");
if(NULL == pSendFile)
{
//fprintf(stderr, "Open file failed at %s:%d\n", __FILE__, __LINE__);
LOGGER_ERROR(m_loggerPtr, "Open file "+filepath+" failed ");
return -1;
}
::fseek(pSendFile, 0L, SEEK_END);
size_t iFileSize = ::ftell(pSendFile);
::fseek(pSendFile, 0L, SEEK_SET);
QString fullpath =""; 
m_pCurlhandle = curl_easy_init();
if (NULL == m_pCurlhandle)
{
LOGGER_ERROR(m_loggerPtr, "Curl handle could not create!");
return false;
}
curl_easy_setopt(m_pCurlhandle, CURLOPT_USERPWD, m_userpwd.c_str());


curl_easy_setopt(m_pCurlhandle, CURLOPT_URL, fullpath.toStdString().c_str());
curl_easy_setopt(m_pCurlhandle, CURLOPT_READDATA, pSendFile);
curl_easy_setopt(m_pCurlhandle, CURLOPT_READFUNCTION, read_callback);
curl_easy_setopt(m_pCurlhandle, CURLOPT_FTP_CREATE_MISSING_DIRS, 0);
curl_easy_setopt(m_pCurlhandle, CURLOPT_UPLOAD, 1L);
curl_easy_setopt(m_pCurlhandle, CURLOPT_INFILESIZE, iFileSize);
//qDebug()<<fullpath;
CURLcode r1es = curl_easy_perform(m_pCurlhandle);
if (CURLE_OK!= r1es)
{
LOGGER_ERROR(m_loggerPtr, curl_easy_strerror(r1es));
return false;
}
fclose(pSendFile);
return true;
}

下载:



size_t AchieveModel::my_fwrite(void *buffer, size_t size, size_t nmemb, void *stream)
{
struct FtpFile *out=(struct FtpFile *)stream;
if(out && !out->stream) {
/* open file for writing */ 
out->stream=fopen(out->filename.c_str(), "wb");
if(!out->stream)
return -1; /* failure, can't open file to write */ 
}


out->fileSize += size * nmemb;
return fwrite(buffer, size, nmemb, out->stream);
}


size_t AchieveModel::write_response(void

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值