You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用eBay API的UploadSiteHostedPictures返回低质量图片问题

问题解决:eBay UploadSiteHostedPictures接口上传图片分辨率过低

核心问题定位

你的代码存在关键错误:multipart/form-data中图片字段的name设置不符合eBay API要求。eBay规定图片数据对应的字段名必须是PictureData,而你写的是"Uploaded Picture",这导致API无法正确识别并处理你上传的高质量图片,转而使用默认低质量压缩策略,同时触发了不符合JPEG范围的提示。

代码修复步骤

1. 修正MIME图片字段名

将图片部分的curl_mime_name(part, "Uploaded Picture");改为curl_mime_name(part, "PictureData");,这是让API正确解析图片数据的核心修复点。

2. 优化XML请求参数(可选但推荐)

  • 明确添加PictureFormat字段指定为JPEG,避免API自动推断格式时出现偏差
  • 保留PictureSet为Supersize,该参数对应eBay的超高清图片规格

修改后的完整代码

std::vector<unsigned char> readFileToBinary(const std::string& filePath) {
    
    std::ifstream file(filePath, std::ios::binary | std::ios::ate);
    if (!file.is_open()) {
        throw std::runtime_error("Unable to open file: " + filePath);
    }

    std::streamsize fileSize = file.tellg();
    file.seekg(0, std::ios::beg);

    std::vector<unsigned char> buffer(fileSize);
    if (!file.read(reinterpret_cast<char*>(buffer.data()), fileSize)) {
        throw std::runtime_error("Error reading file: " + filePath);
    }
    return buffer;
}

std::string obtainURL(const std::string& imagePath, const std::string& authToken) {
    std::vector<unsigned char> binaryData = readFileToBinary(imagePath);

    // 优化XML参数,明确指定图片格式
    std::string xmlPayload = R"(<?xml version="1.0" encoding="utf-8"?>
<UploadSiteHostedPicturesRequest xmlns="urn:ebay:apis:eBLBaseComponents">
    <RequesterCredentials>
        <eBayAuthToken>)" + authToken + R"(</eBayAuthToken>
    </RequesterCredentials>
    <PictureName>Uploaded Picture</PictureName>
    <PictureSet>Supersize</PictureSet>
    <PictureFormat>JPEG</PictureFormat>
</UploadSiteHostedPicturesRequest>)";

    CURL* curl = curl_easy_init();
    if (!curl) {
        throw std::runtime_error("Failed to initialize cURL");
    }

    struct curl_slist* headers = nullptr;
    headers = curl_slist_append(headers, "X-EBAY-API-CALL-NAME: UploadSiteHostedPictures");
    headers = curl_slist_append(headers, "X-EBAY-API-COMPATIBILITY-LEVEL: 967");
    headers = curl_slist_append(headers, "X-EBAY-API-SITEID: 0");
    headers = curl_slist_append(headers, "Content-Type: multipart/form-data");

    curl_mime* mime = curl_mime_init(curl);
    curl_mimepart* part;

    part = curl_mime_addpart(mime);
    curl_mime_name(part, "XML Payload");
    curl_mime_data(part, xmlPayload.c_str(), CURL_ZERO_TERMINATED);

    part = curl_mime_addpart(mime);
    // 关键修改:字段名改为PictureData
    curl_mime_name(part, "PictureData");
    curl_mime_filename(part, imagePath.c_str());
    curl_mime_type(part, "image/jpeg");
    curl_mime_data(part, reinterpret_cast<const char*>(binaryData.data()), binaryData.size());

    curl_easy_setopt(curl, CURLOPT_URL, "https://api.ebay.com/ws/api.dll");
    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
    curl_easy_setopt(curl, CURLOPT_MIMEPOST, mime);

    std::string response;
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, +[](char* ptr, size_t size, size_t nmemb, std::string* userdata) -> size_t {
        userdata->append(ptr, size * nmemb);
        return size * nmemb;
    });
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);

    CURLcode res = curl_easy_perform(curl);
    if (res != CURLE_OK) {
        throw std::runtime_error("cURL error: " + std::string(curl_easy_strerror(res)));
    }
    std::cout << response << std::endl;

    curl_slist_free_all(headers);
    curl_mime_free(mime);
    curl_easy_cleanup(curl);

    std::regex urlRegex(R"(<FullURL>(.*?)</FullURL>)");
    std::smatch match;
    if (std::regex_search(response, match, urlRegex)) {
        std::string fullURL = match[1].str();
        return "<img src=\"" + fullURL + "\" alt=\"Uploaded Image\" style=\"max-width: 100%; height: auto;\" />";
    } else {
        throw std::runtime_error("Failed to extract image URL from response");
    }   
}

额外验证步骤

  1. 确认上传图片符合eBay官方要求:
    • 格式为JPEG(主图不支持PNG等其他格式)
    • 分辨率至少1600x1600像素
    • 文件大小不超过12MB
    • 色彩空间为sRGB
  2. 调用API后检查响应中的<Ack>字段是否为Success,同时查看警告信息,确认图片处理状态。

内容的提问来源于stack exchange,提问作者Callum Serbetci

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 23:25:54