使用Stability.ai的SD3.5 API图生图时遇Blob格式错误求助
问题背景
使用Stability.ai的SD3.5模型API,基于PHP开发,文生图功能正常,但图生图时始终报错:
object(stdClass)[2]
public 'errors' =>
array (size=1)
0 => string 'image: input not instance of Blob' (length=33)
public 'id' => string '620816a0b769aeb353780c8f6ff982b7' (length=32)
public 'name' => string 'bad_request' (length=11)
已尝试多种图片读取方式(file_get_contents、fread等)、图片格式(jpg/png)、跨Windows/Linux系统测试,甚至复用文生图返回的图片字符串,均未解决。
核心原因与解决步骤
必须使用
multipart/form-data格式上传
文生图通常用application/json请求,但图生图要求图片以Blob形式通过表单上传,不能用JSON格式传图片字符串。PHP中需用cURL的表单上传能力,不要手动设置Content-Type,让cURL自动生成带boundary的头部。用
CURLFile类封装图片(PHP 5.5+)
不要直接传读取的二进制字符串,必须用CURLFile构造图片参数,示例代码:$apiKey = 'YOUR_STABILITY_API_KEY'; $imagePath = '/path/to/input/image.png'; $prompt = 'your image editing prompt'; $ch = curl_init('https://api.stability.ai/v2beta/stable-image/generate/sd3'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_HTTPHEADER, [ "Authorization: Bearer {$apiKey}" ]); // 构造表单数据,强制使用CURLFile处理图片 $postFields = [ 'mode' => 'image-to-image', // 必须设置为图生图模式 'image' => new CURLFile($imagePath, mime_content_type($imagePath)), 'prompt' => $prompt, // 根据需求添加其他参数如strength、seed等 ]; curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields); $response = curl_exec($ch); if(curl_errno($ch)) { echo 'CURL Error: ' . curl_error($ch); } curl_close($ch); var_dump(json_decode($response));复用文生图返回图片的正确方式
文生图返回的是二进制图片数据,不能直接作为参数传递,需先保存为临时文件,再用CURLFile上传:// 假设$generatedImage是文生图返回的二进制内容 $tempFile = tempnam(sys_get_temp_dir(), 'sd_image'); file_put_contents($tempFile, $generatedImage); // 然后将$tempFile传入CURLFile检查参数完整性
确认mode参数已设置为image-to-image,这是图生图的必填项,未设置会导致API识别错误的请求模式。排查cURL配置
- 检查PHP的cURL扩展是否支持多部分上传:执行
var_dump(curl_version()['features'] & CURL_VERSION_MULTIPART),返回true则正常。 - PHP 5.5~7.0版本需禁用
CURLOPT_SAFE_UPLOAD:curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false);,避免CURLFile被禁用。
- 检查PHP的cURL扩展是否支持多部分上传:执行
内容的提问来源于stack exchange,提问作者Raul Mellado

