mycsdn12306 2023-05-16 11:36 采纳率: 100%
浏览 43
已结题

使用libcurl库上传sftp服务器,上传.txt文件成功,但大小变成1k了

使用libcurl库上传sftp服务器,上传.txt文件成功,且sftp收到的.txt文件大小正常。上传.xlsx文件时也提示成功,sftp上也有收到文件,但文件大小变成1k了,不是实际大小,excel不能打开。(上传.rar文件也变成1k大小),不知道这是为什么,代码如下,请帮忙查看一下。

size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream) //回调函数
{
    curl_off_t nread;
    size_t retcode = fread(ptr, size, nmemb, (FILE*)(stream));
    nread = (curl_off_t)retcode;
    return retcode;
}

size_t CTest02Dlg::upload(const char * user,const char * passwd,const char * url, const char * path)
{    
        curl_global_init(CURL_GLOBAL_DEFAULT);
    int nRet(-1);
    CURL *curl;
    CURLcode res;
    //struct curl_slist *headerlist = NULL;
    std::string s1(user);
    std::string s2(passwd);
    std::string s3 = s1;
    s3.append(":");
    s3.append(s2);
    system("ls write_file");
    FILE* pSendFile = fopen(path,"r");
    if(pSendFile == NULL)
    {
        printf("open failed\n");
        return 1;
    }
    printf("------------\n");
    fseek(pSendFile, 0L, SEEK_END);
    printf("------------\n");
    size_t iFileSize = ftell(pSendFile);
    printf("------------\n");
    fseek(pSendFile, 0L, SEEK_SET);
    printf("begin easy_init\n"); 

    curl = curl_easy_init();
    printf("curl_easy_init success\n");
    if(curl) {
        curl_easy_setopt(curl, CURLOPT_URL,url);
        curl_easy_setopt(curl, CURLOPT_USERPWD,s3.c_str()); 
        curl_easy_setopt(curl, CURLOPT_PROTOCOLS, CURLPROTO_SFTP);//
        curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
        curl_easy_setopt(curl, CURLOPT_READDATA, pSendFile);
        curl_easy_setopt(curl, CURLOPT_FTP_CREATE_MISSING_DIRS, 0);
        curl_easy_setopt(curl, CURLOPT_UPLOAD, 1);
        curl_easy_setopt(curl, CURLOPT_INFILESIZE, iFileSize);

        printf("curl_easy_setopt success");
        res = curl_easy_perform(curl);
        curl_easy_cleanup(curl);
        if(CURLE_OK != res) 
        {
            nRet = 2;
            fprintf(stdout, "curl told us %d\n", res);
        }
        else
        {
            nRet = 0;
        }
    }
    fclose(pSendFile);
        curl_global_cleanup();
    return nRet;
}

void CTest02Dlg::OnBnClickedButton2()
{
    // TODO: 在此添加控件通知处理程序代码
    int nRet = upload("sftpuser","123","sftp://192.168.2.15:22/test/(2023-05-1608_48_00).xlsx","D:\test\(2023-05-1608_48_00).xlsx");
}
  • 写回答

3条回答 默认 最新

  • Treabhar 2023-05-16 11:45
    关注

    来自NewBing和LP的编写:
    你的代码看起来是正确的,但是有一些可能的原因会导致你的问题,要进一步进行排查。这里有一些可能的问题:

    1. 文件打开方式:你打开待上传文件时使用的是 "r" 模式,这个模式是用于读取文本文件的。但是 .xlsx 和 .rar 文件是二进制文件,你应该用 "rb" 模式打开文件。试修改你的代码,用 "rb" 模式打开文件:

      FILE* pSendFile = fopen(path,"rb");
      
    2. libcurl版本问题:你的libcurl库版本可能存在问题,有可能是版本过旧或者与你的程序存在不兼容的问题。你可以尝试更新到最新版本的libcurl库,或者尝试使用其他版本的libcurl库看看问题是否仍然存在。

    3. 服务器问题:服务器可能存在某些问题,导致无法正确处理上传的文件。你可以尝试更换服务器,或者联系服务器的管理员,看看是否存在可以解决的问题。

    4. 文件权限问题:在上传文件前,检查你是否有足够的权限来读取这些文件。如果没有,那么可能会导致文件大小不正确的问题。

    这些都是可能导致你问题的原因,你可以尝试根据这些信息进行进一步的排查。如果问题仍然存在,那么可能需要进行更深入的调查。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 5月24日
  • 已采纳回答 5月16日
  • 创建了问题 5月16日

悬赏问题

  • ¥15 远程访问linux主机超时
  • ¥15 odoo17存货管理优势于中国国内该行业传统ERP或MES的详细解读和举例
  • ¥15 CPU卡指令整合指令数据都在图片上
  • ¥15 火车票关联12306问题
  • ¥15 odoo17处理受托加工产品
  • ¥15 如何用MATLAB编码图三的积分
  • ¥15 圆孔衍射光强随孔径变化
  • ¥15 MacBook pro m3max上用vscode运行c语言没有反应
  • ¥15 ESP-PROG配置错误,ALL ONES
  • ¥15 结构功能耦合指标计算