【发布时间】:2018-07-31 13:05:08
【问题描述】:
我正在编写一个 golang 脚本来将图像发送到 Google AutoML API 的预测引擎。
它使用下面的代码接受大多数文件,但某些 .jpeg 或 .jpeg 会返回错误 500,说明文件无效。大多数情况下它都有效,但我无法找出例外情况。它们是完全有效的 jpg。
我正在使用 EncodeToString 对有效负载进行编码。
除此之外,我尝试对其进行解码,将其保存为 PNG,但似乎没有任何效果。它不喜欢某些图像。
我想知道我的方法是否有错误?任何帮助将非常感激。谢谢
PS 文件保存到文件系统并上传到 S3 就好了。当它去谷歌时,它只是对字符串的编码失败。
imgFile, err := os.Open(filename)
if err != nil {
fmt.Println(err)
}
img, fname, err := image.Decode(imgFile)
if err != nil {
fmt.Println(fname)
}
buf := new(bytes.Buffer)
err = jpeg.Encode(buf, img, nil)
// Encode as base64.
imgBase64Str := base64.StdEncoding.EncodeToString(buf.Bytes())
defer imgFile.Close()
payload := fmt.Sprintf(`{"payload": {"image": {"imageBytes": "%v"},}}`, imgBase64Str)
// send as a byte
pay := bytes.NewBuffer([]byte(payload))
req, err := http.NewRequest(http.MethodPost, URL.String(), pay)
【问题讨论】:
-
尝试使用
"<html><body><img src=\"data:image/png;base64," + imgBase64Str + "\" /></body></html>"在浏览器上查看图像作为响应。 -
谢谢,我只是把你的脚本放在前端,图像渲染完美,就像 S3 上传一样。但是,当它在有效负载中发布到 API 时,它仍然会死掉,而且我在图像中看不到它失败的模式
-
在创建有效负载时可能有问题。可以尝试直接发布图片。
-
我认为你是写的,它是有效载荷的创建。它只接受带有 base64 图像的 JSON 格式。我只是尝试更改有效负载引号,但仍然是同样的问题:
payload := fmt.Sprintf("{'payload': {'image': {'imageBytes': '%v'},}}", imgBase64Str) -
可能是payload json
{"payload": {"image": {"imageBytes": "%v"}}}中多了一个逗号。去掉逗号,然后尝试发布payload