libcurl使用SFTP上传

​​​​​​由于在arm环境使用。需要交叉编译如下库:

  • zlib
  • openssl
  • libssh2
  • libcurl

编译zlib和openssl网上很多

编译libssh2

--with-zlib 填写交叉编译zlib时的安装路径,否则交叉编译可能失败【错误  recv check failed】

./configure CC=/host/gcc-linaro-6.5.0-2018.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc --host=arm-linux --with-crypto=openssl --with-libssl-prefix=/host/aarch64_install_6.3.1 CXX=/host/gcc-linaro-6.5.0-2018.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++ --with-crypto-prefix=/host/aarch64_install_6.3.1 --with-zlib=/host/aarch64_install_6.3.1

编译libccurl:

--with-libssh2 指定 libssh2的安装路径,这里填写上一步编译libssh时设置的安装路径
./configure --prefix=/host/aarch64_install_6.3.1/  --host=aarch64-linux-gnu CC=/host/cross_compile/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc --enable-shared --with-libssh2=/host/aarch64_install_6.3.1/

使用

网上很多使用fopen上传文件。这里和我们需求不太一样。我们需要把JPG图像的内存buffer数据传到SFTP服务器。

定义结构体,用来标识当前传输数据位置:

struct BUFF{
    uint8_t *data = nullptr;
    size_t length;
    size_t offset = 0;
};

size_t readfunc_ptr(void *ptr, size_t size, size_t nmemb, void *stream)
{


    BUFF* buf = (BUFF*)stream;
    printf("offset:%ld size:%ld,nmemb:%ld\n",buf->offset,size,nmemb);
    auto max_value = size *nmemb;
    size_t cp_size = min(max_value,buf->length-buf->offset);
    //分段发送时,记录以及发送的数据长度,从上次的位置继续发送
    memcpy(ptr,buf->data + buf->offset,cp_size);
    buf->offset+=cp_size;
    return cp_size;
}

bool UpLoad(uint8_t *data, size_t length) {
    CURL *curl;
    CURLcode res;
    string user = "root";
    string passwd;

    BUFF *buf = new BUFF;
    buf->data = data;
    buf->length = length;
    curl = curl_easy_init();
    printf("curl_easy_init success\n");
    if (curl) {
        curl_easy_setopt(curl, CURLOPT_URL, "sftp://192.168.0.11/userdata/x.png");
        curl_easy_setopt(curl, CURLOPT_USERPWD, (user + ":" + passwd).c_str());
        curl_easy_setopt(curl, CURLOPT_READDATA, buf);
        curl_easy_setopt(curl, CURLOPT_READFUNCTION, readfunc_ptr);
        curl_easy_setopt(curl, CURLOPT_FTP_CREATE_MISSING_DIRS, 0);
        curl_easy_setopt(curl, CURLOPT_UPLOAD, 1);
        curl_easy_setopt(curl, CURLOPT_INFILESIZE, length);

        printf("curl_easy_setopt success\n");
        res = curl_easy_perform(curl);

        curl_easy_cleanup(curl);

        if (CURLE_OK != res) {

            fprintf(stdout, "curl told us %d  %s\n",res, curl_easy_strerror(res));
        }
    }
    delete buf;
    curl_global_cleanup();
    return true;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kevin4ch

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值