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

VBA调用DALL-E 2 API编辑图片报错求助:'image'为必填属性

解决DALL-E 2图片编辑API调用问题(VBA环境)

问题背景

我不是专业开发者,但熟悉VBA,正在用PowerPoint结合OpenAI API优化工作流。之前调用文本对话、图片生成、Vision API都正常,但调用DALL-E 2的图片编辑API(端点/v1/images/edits)时遇到问题:

  • 最初用application/json作为Content-Type,API提示必须使用multipart/form-data
  • 切换到multipart/form-data后,又收到错误:'image'是必填属性

错误详情

发送的JSON内容

{ "model":"dall-e-2", "image":"image/png;base64,[base64 data here]", "mask":"image/png;base64,[base64 data here]", "prompt":"[prompt text here]", "n":1, "size":"1024x1024" }

API错误响应

{ "error": { "code": null, "message": "'image' is a required property", "param": null, "type": "invalid_request_error" } }

相关VBA代码片段

data = "{""model"":""dall-e-2"",""image"":""data:image/png;base64," & base64String & """,""n":1,""size":""1024x1024""}"

问题原因

DALL-E 2的图片编辑API明确要求用multipart/form-data格式提交请求,而非JSON。之前的错误是因为你仍在按JSON结构拼接数据,但multipart/form-data需要将每个参数(image、mask、prompt等)作为独立的表单字段提交,不能把base64编码的图片嵌入JSON字符串中。

修复方案

核心要点

  1. 放弃JSON格式,改用multipart/form-data表单提交
  2. 每个参数作为独立表单字段:
    • model:值为dall-e-2
    • image:提交原始二进制图片数据(不是base64),需指定Content-Type: image/png
    • mask(可选):提交原始二进制掩码图片数据,尺寸需和原图一致
    • prompt:提交编辑提示文本
    • n、size等参数按需添加为表单字段

VBA代码示例

Sub CallDALLEEditsAPI()
    Dim http As Object
    Dim boundary As String
    Dim postData As String
    Dim imagePath As String
    Dim maskPath As String
    Dim promptText As String
    Dim apiKey As String
    
    ' 配置参数
    apiKey = "你的OpenAI API密钥"
    imagePath = "C:\path\to\your\image.png" ' 替换为你的原始图片路径
    maskPath = "C:\path\to\your\mask.png" ' 替换为掩码图片路径(可选)
    promptText = "你的编辑提示文本" ' 替换为实际提示
    
    ' 创建HTTP请求对象
    Set http = CreateObject("MSXML2.XMLHTTP.6.0")
    
    ' 生成随机边界字符串(用于分隔表单字段)
    boundary = "----OpenAIFormBoundary" & Replace(CStr(Now), ":", "")
    
    ' 构建multipart/form-data请求体
    postData = "--" & boundary & vbCrLf
    ' 添加model字段
    postData = postData & "Content-Disposition: form-data; name=""model""" & vbCrLf & vbCrLf
    postData = postData & "dall-e-2" & vbCrLf
    
    ' 添加image字段(二进制文件)
    postData = postData & "--" & boundary & vbCrLf
    postData = postData & "Content-Disposition: form-data; name=""image""; filename=""image.png""" & vbCrLf
    postData = postData & "Content-Type: image/png" & vbCrLf & vbCrLf
    postData = postData & ReadBinaryFile(imagePath) & vbCrLf
    
    ' 可选:添加mask字段
    If maskPath <> "" Then
        postData = postData & "--" & boundary & vbCrLf
        postData = postData & "Content-Disposition: form-data; name=""mask""; filename=""mask.png""" & vbCrLf
        postData = postData & "Content-Type: image/png" & vbCrLf & vbCrLf
        postData = postData & ReadBinaryFile(maskPath) & vbCrLf
    End If
    
    ' 添加prompt字段
    postData = postData & "--" & boundary & vbCrLf
    postData = postData & "Content-Disposition: form-data; name=""prompt""" & vbCrLf & vbCrLf
    postData = postData & promptText & vbCrLf
    
    ' 添加n和size字段
    postData = postData & "--" & boundary & vbCrLf
    postData = postData & "Content-Disposition: form-data; name=""n""" & vbCrLf & vbCrLf
    postData = postData & "1" & vbCrLf
    
    postData = postData & "--" & boundary & vbCrLf
    postData = postData & "Content-Disposition: form-data; name=""size""" & vbCrLf & vbCrLf
    postData = postData & "1024x1024" & vbCrLf
    
    ' 结束表单边界
    postData = postData & "--" & boundary & "--" & vbCrLf
    
    ' 发送请求
    http.Open "POST", "https://api.openai.com/v1/images/edits", False
    http.setRequestHeader "Authorization", "Bearer " & apiKey
    http.setRequestHeader "Content-Type", "multipart/form-data; boundary=" & boundary
    http.send postData
    
    ' 处理响应
    If http.Status = 200 Then
        MsgBox "请求成功:" & http.responseText
    Else
        MsgBox "请求失败,状态码:" & http.Status & vbCrLf & "响应内容:" & http.responseText
    End If
    
    Set http = Nothing
End Sub

' 辅助函数:读取二进制文件内容
Function ReadBinaryFile(filePath As String) As String
    Dim fso As Object
    Dim ts As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    ' 以二进制模式读取文件
    Set ts = fso.OpenTextFile(filePath, 1, False, -1)
    ReadBinaryFile = ts.ReadAll
    ts.Close
    Set ts = Nothing
    Set fso = Nothing
End Function

注意事项

  • 确保MSXML2.XMLHTTP.6.0组件可用,若报错可替换为WinHttp.WinHttpRequest.5.1
  • 图片必须是PNG格式,文件大小不超过4MB,且为1:1正方形比例
  • 掩码图片尺寸需与原始图片完全一致,透明区域代表需要编辑的部分
  • API密钥请勿硬编码在公开代码中,建议通过安全方式存储和读取

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 21:54:58