c++使用curl上传中文名称文件失败

问题描述 投票:0回答:0

os=win11

gcc 版本 11.2.0 (GCC)

我想发送文件二进制文件到网络服务器,但只有英文名称的文件才能上传成功 中文名称的文件会显示如下信息

  curl_easy_perform() failed: Failed to open/read local data from file/application

Failed to upload file: C:\test\
int uploadFile(const std::wstring& filepath, const std::wstring& filename) {

     std::wifstream file(filepath.c_str(), std::ios::binary);
     if (!file) {
         std::wcerr << "Failed to open file: " << filepath << std::endl;
         return -1;
     }

    CURL* curl = curl_easy_init();
    if (!curl) {
        std::cerr << "Failed to initialize curl" << std::endl;
        return -1;
    }

    struct curl_httppost* post = NULL;
    struct curl_httppost* last = NULL;

    std::string filenameEncoded = curl_easy_escape(curl, std::string(filename.begin(), filename.end()).c_str(), filename.length());

    curl_formadd(&post, &last, CURLFORM_COPYNAME, "file", CURLFORM_FILE, std::string(filepath.begin(), filepath.end()).c_str(), CURLFORM_FILENAME, filenameEncoded.c_str(), CURLFORM_END);
    
    curl_easy_setopt(curl, CURLOPT_URL, UPLOAD_URL.c_str());
    curl_easy_setopt(curl, CURLOPT_POST, 1L);
    curl_easy_setopt(curl, CURLOPT_HTTPPOST, post);

    CURLcode res = curl_easy_perform(curl);
    curl_easy_cleanup(curl);

    if (res != CURLE_OK) {
        std::cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << std::endl;
        return -1;
    }

    return 0;
}

我该如何解决,谢谢...

我像这样更改代码

curl_formadd(&post, &last, CURLFORM_COPYNAME, "file", CURLFORM_FILE, filepath.c_str(), CURLFORM_FILENAME, filenameEncoded.c_str(), CURLFORM_END);

所有中文名称或英文名称的文件,显示以下信息

  curl_easy_perform() failed: Failed to open/read local data from file/application

  Failed to upload file: C:\test\a.pdf

我像这样更改代码

curl_formadd(&post, &last, CURLFORM_COPYNAME, "file", CURLFORM_FILE, filepath, CURLFORM_FILENAME, filenameEncoded.c_str(), CURLFORM_END);

所有中文名称或英文名称的文件,显示以下信息

  curl_easy_perform() failed: Failed to open/read local data from file/application

  Failed to upload file: C:\test\a.pdf

我像这样更改代码

std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
std::string filenameEncoded = curl_easy_escape(curl, converter.to_bytes(filename).c_str(), converter.to_bytes(filename).length());
curl_formadd(&post, &last, CURLFORM_COPYNAME, "file", CURLFORM_FILE, converter.to_bytes(filepath).c_str(), CURLFORM_FILENAME, filenameEncoded.c_str(), CURLFORM_END);

只有中文名称的文件才会显示以下信息

  curl_easy_perform() failed: Failed to open/read local data from file/application
  Failed to upload file: C:\test\
c++ curl
© www.soinside.com 2019 - 2024. All rights reserved.