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
相关产品推荐
相关产品推荐

