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

PHP调用OLX API上传图片失败问题求助

OLX API图片上传成功但图片不显示的问题排查与修复

核心问题分析

API返回{"message":"success"}但图片未显示,本质是请求格式不符合OLX API的要求,尤其是multipart/form-data类型的文件上传处理错误。以下是关键错误点和修复方案:

1. 错误的请求头设置

手动指定Content-Type: multipart/form-data会覆盖cURL自动生成的带boundary的请求头,导致服务器无法正确解析上传的文件。cURL会自动根据POSTFIELDS的内容生成正确的multipart请求头,无需手动设置。

2. 文件上传参数格式错误

无论是最初的stream_context还是后来的cURL,构造的$imageFiles数组格式都不符合PHP cURL处理文件上传的要求:

  • PHP 5.5+ 必须使用CURLFile对象传递文件
  • 不能用JSON格式传递图片内容(OLX图片上传API要求multipart/form-data,不是JSON)

3. 不必要的本地文件存储优化

可以直接用cURL下载图片后,不存本地直接上传,减少IO操作,也避免文件权限问题。

修复后的完整代码示例

if (isset($res2_json['status']) && $res2_json['status'] === 'active') {
    $successCount++;
    echo "Product with SKU " . $product['sku'] . " published successfully.\n";

    $imageUrls = explode(',', $product['images']);
    $uploadUrl = "https://api.olx.ba/listings/{$product_id}/image-upload";
    
    // 准备cURL上传的文件数组
    $postFields = [];
    $tempFiles = []; // 存储临时文件资源,用于后续自动清理

    foreach ($imageUrls as $index => $imageUrl) {
        $imageUrl = trim($imageUrl);
        if (empty($imageUrl)) continue;

        // 用cURL直接下载图片内容
        $ch = curl_init($imageUrl);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $imageContent = curl_exec($ch);
        curl_close($ch);

        if ($imageContent === false) {
            echo "Failed to download image: {$imageUrl}\n";
            continue;
        }

        // 创建临时文件存储图片
        $tempFile = tmpfile();
        fwrite($tempFile, $imageContent);
        $tempFilePath = stream_get_meta_data($tempFile)['uri'];
        $tempFiles[] = $tempFile;

        // 使用CURLFile构造标准的文件上传参数
        $postFields["images[{$index}]"] = new CURLFile(
            $tempFilePath,
            mime_content_type($tempFilePath), // 自动识别图片MIME类型
            basename($imageUrl)
        );
    }

    // 执行图片上传请求
    $ch = curl_init();
    curl_setopt_array($ch, [
        CURLOPT_URL => $uploadUrl,
        CURLOPT_POST => true,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER => [
            "OLX-CLIENT-ID: YOUR_CLIENT_ID", // 替换为实际客户端ID
            "OLX-CLIENT-TOKEN: YOUR_CLIENT_TOKEN" // 替换为实际Token
            // 无需手动设置Content-Type,cURL会自动生成带boundary的正确头
        ],
        CURLOPT_POSTFIELDS => $postFields
    ]);

    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $error = curl_error($ch);
    curl_close($ch);

    // 自动清理临时文件(关闭句柄后系统会删除临时文件)
    foreach ($tempFiles as $tempFile) {
        fclose($tempFile);
    }

    // 输出调试信息
    if ($error) {
        echo "Upload error: {$error}\n";
    } else {
        echo "HTTP Status Code: {$httpCode}\n";
        echo "Response: {$response}\n";
    }
} else {
    $failureCount++;
    echo "Failed to publish product with SKU " . $product['sku'] . ".\n";
}

额外排查点

  • 验证图片规格:确认图片符合OLX要求(如JPG/PNG格式、分辨率、文件大小限制等)
  • 检查API权限:确保Client ID和Token拥有图片上传权限,且$product_id对应的listing存在
  • 查看卖家后台:登录OLX卖家后台,检查该listing的图片是否有审核未通过等状态提示
  • 开启请求日志:添加cURL verbose日志,查看实际发送的请求内容是否正确:
curl_setopt($ch, CURLOPT_VERBOSE, true);
$verboseLog = fopen('php://temp', 'w+');
curl_setopt($ch, CURLOPT_STDERR, $verboseLog);
// 请求执行后读取日志
rewind($verboseLog);
echo "Verbose log:\n" . stream_get_contents($verboseLog);
fclose($verboseLog);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 15:45:03