Go - 将base64字符串保存到文件
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go - 将base64字符串保存到文件相关的知识,希望对你有一定的参考价值。
所以..我有一个base64编码的字符串,我需要解码,检查它的宽度和高度,然后保存到文件。但是..我一直在保存损坏的图像文件。
package server
import (
"encoding/base64"
"errors"
"io"
"os"
"strings"
"image"
_ "image/gif"
_ "image/jpeg"
_ "image/png"
)
var (
ErrBucket = errors.New("Invalid bucket!")
ErrSize = errors.New("Invalid size!")
ErrInvalidImage = errors.New("Invalid image!")
)
func saveImageToDisk(fileNameBase, data, bucket string) (string, error) {
idx := strings.Index(data, ";base64,")
if idx < 0 {
return "", ErrInvalidImage
}
reader := base64.NewDecoder(base64.StdEncoding, strings.NewReader(data[idx+8:]))
imgCfg, fmt, err := image.DecodeConfig(reader)
if err != nil {
return "", err
}
if imgCfg.Width != 750 || imgCfg.Height != 685 {
return "", ErrSize
}
fileName := fileNameBase + "." + fmt
f, err := os.Create(fileName)
if err != nil {
return "", err
}
_, err = io.Copy(f, reader)
f.Close()
return fileName, err
}
它确实保存了一个文件..我正在测试的base64对于在线base64到图像转换器是有效的。有帮助吗?
http://pastebin.com/u18eRv7d这是我正在使用的base64字符串(func中的数据)
答案
这些代码的主要问题是,当你阅读io.Reader时,光标不会回到第一个。你已经在解码图像配置上阅读了io.Reader。因此,当您将其写入文件时,它将在下一个读取,直到EOF(可能不是您的数据)
我不确切知道如何将io.Reader重置为第一个,但我写了一个方法来使其工作:
import (
"encoding/base64"
"errors"
"strings"
"image"
_ "image/gif"
_ "image/jpeg"
_ "image/png"
"io/ioutil"
"bytes"
)
var (
ErrBucket = errors.New("Invalid bucket!")
ErrSize = errors.New("Invalid size!")
ErrInvalidImage = errors.New("Invalid image!")
)
func saveImageToDisk(fileNameBase, data string) (string, error) {
idx := strings.Index(data, ";base64,")
if idx < 0 {
return "", ErrInvalidImage
}
reader := base64.NewDecoder(base64.StdEncoding, strings.NewReader(data[idx+8:]))
buff := bytes.Buffer{}
_, err := buff.ReadFrom(reader)
if err != nil {
return "", err
}
imgCfg, fm, err := image.DecodeConfig(bytes.NewReader(buff.Bytes()))
if err != nil {
return "", err
}
if imgCfg.Width != 750 || imgCfg.Height != 685 {
return "", ErrSize
}
fileName := fileNameBase + "." + fm
ioutil.WriteFile(fileName, buff.Bytes(), 0644)
return fileName, err
}
另一答案
另一个答案对我不起作用,我希望无论图像格式如何,都能将图像保存为文件:
package main
import (
"bytes"
"encoding/base64"
"image/gif"
"image/jpeg"
"image/png"
"log"
"os"
"strings"
_ "github.com/jinzhu/gorm/dialects/postgres"
)
const data = `data:image/gif;base64,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`
func main() {
idx := strings.Index(data, ";base64,")
if idx < 0 {
panic("InvalidImage")
}
ImageType := data[11:idx]
log.Println(ImageType)
unbased, err := base64.StdEncoding.DecodeString(data[idx+8:])
if err != nil {
panic("Cannot decode b64")
}
r := bytes.NewReader(unbased)
switch ImageType {
case "png":
im, err := png.Decode(r)
if err != nil {
panic("Bad png")
}
f, err := os.OpenFile("example.png", os.O_WRONLY|os.O_CREATE, 0777)
if err != nil {
panic("Cannot open file")
}
png.Encode(f, im)
case "jpeg":
im, err := jpeg.Decode(r)
if err != nil {
panic("Bad jpeg")
}
f, err := os.OpenFile("example.jpeg", os.O_WRONLY|os.O_CREATE, 0777)
if err != nil {
panic("Cannot open file")
}
jpeg.Encode(f, im, nil)
case "gif":
im, err := gif.Decode(r)
if err != nil {
panic("Bad gif")
}
f, err := os.OpenFile("example.gif", os.O_WRONLY|os.O_CREATE, 0777)
if err != nil {
panic("Cannot open file")
}
gif.Encode(f, im, nil)
}
}
这支持png,gif和jpeg。
以上是关于Go - 将base64字符串保存到文件的主要内容,如果未能解决你的问题,请参考以下文章
使用 Delphi 2007 将 Base64 字符串作为二进制文件保存到磁盘
如何将base64图像转换为图像并将其保存到文件系统[重复]
在 SQL Server 数据库中保存文件 base64 字符串