将 base64 图像作为图像发送到 RestApi (MultiPart)

Posted

技术标签:

【中文标题】将 base64 图像作为图像发送到 RestApi (MultiPart)【英文标题】:Send base64 Image to RestApi As A Image (MultiPart) 【发布时间】:2021-08-06 12:46:47 【问题描述】:

假设我有一个 base64 图像 png 或 jpeg 格式,我想将此数据发送到另一个 api。

我的代码是:

data2 := data_base64[strings.IndexByte(data_base64, ',')+1:]
reader2 := base64.NewDecoder(base64.StdEncoding, strings.NewReader(data2))
buff2 := bytes.Buffer
_, err2 := buff2.ReadFrom(reader2)
if err2 != nil 
    fmt.Println(err2.Error())
    fmt.Println("Empyt Buffer")
    return "0"
else
    fmt.Println("No Problem")

url := "blabla.com"
method := "POST"

payload := &bytes.Buffer
writer := multipart.NewWriter(payload)
/*file, errFile1 := os.Open("/Users/xxx/Desktop/test.png")
defer file.Close()*/
part1,
errFile1 := writer.CreateFormFile("image","test.png")
_, errFile1 = io.Copy(part1, reader2)
if errFile1 != nil 
    fmt.Println(errFile1)
    return "0"

err := writer.Close()
if err != nil 
    fmt.Println(err)
    return "0"



client := &http.Client 

req, err := http.NewRequest(method, url, payload)

if err != nil 
    fmt.Println(err)
    return "0"

req.Header.Set("Content-Type", writer.FormDataContentType())
res, err := client.Do(req)
if err != nil 
    fmt.Println(err)
    return "0"

defer res.Body.Close()

但是使用此代码时,我得到了 500 错误响应。 如果我改变这个

_, errFile1 = io.Copy(part1, reader2)

到这里

_, errFile1 = io.Copy(part1, file)

没有问题。 如何发送base64数据来发送api之类的文件?

【问题讨论】:

我认为您的代码变体没有明显问题,应该可以工作。您是否尝试过验证如果您 io.Copy() 将数据从 base64 块解码到本地文件(而不是将其填充到多部分/表单数据中),您会得到一个有效的 PNG 格式的文件?我的意思是,“500 错误响应”不是太多信息,但我可以很容易地想象服务器试图解释应该是 PNG 文件的内容,但失败了。 (顺便说一句,“image”不是很好的 MIME 类型;我会使用“image/png”。) 您好 Kostix,感谢您的支持。图像不是 mime-Type 。它是一个字段名。我这样设置 Content-Type: req.Header.Set("Content-Type", writer.FormDataContentType()) 是的,我得到了一个有效的 PNG 格式。我测试过了。 我认为您通过buff2 := bytes.Buffer 将数据读取到 buff2,但从未使用过数据,并将reader2 留空。尝试将其更改为_, errFile1 = io.Copy(part1, buff2) Leaf,你是对的,但我不能在 io.Copy() 中使用 buff2,因为 buff2 不是阅读器。 “不能使用‘buff2’(缓冲区类型)作为阅读器类型”。但是我删除了 buff2 并且可以工作:) @UmutBayğut _, errFile1 = io.Copy(part1, &buff2) 是正确的。但是除非有其他原因,我觉得还是把buffer去掉比较好。 【参考方案1】:

删除此代码并运行。

buff2 := bytes.Buffer
_, err2 := buff2.ReadFrom(reader2)
if err2 != nil 
    fmt.Println(err2.Error())
    fmt.Println("Empyt Buffer")
    return "0"
else
    fmt.Println("No Problem")

感谢叶波普

【讨论】:

以上是关于将 base64 图像作为图像发送到 RestApi (MultiPart)的主要内容,如果未能解决你的问题,请参考以下文章

使用nodejs客户端库将图像作为base64编码发送到google云视觉API

在将其发送到 Cloudinary 之前进行 Base64 图像压缩

如何使用节点 js 将 base64 数据作为图像上传到 s3?

获取 Base64 编码的图像并使用 ExpressJS 作为图像发送

将fabricjs画布转换为base64图像

通过 ajax 将 base64 图像数据发送到 cfc