将 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?