为了保存通过json上传的视频,我想出了这个功能:
func SaveBase64VidToDisk(vidString string) (interface{}, error) {
vidExt := strings.ToLower(strings.Split(strings.Split(vidString, ";")[0], "/")[1])
vidData := strings.Split(vidString, ";base64,")[1]
vidReader := base64.NewDecoder(base64.StdEncoding, strings.NewReader(vidData))
fmt.Println("vidEXT is:", videExt)
dir, err := os.Getwd()
if err != nil {
log.Fatal(err)
}
destDir := "/media/videos/"
path := dir + destDir
vidFileName := getRandomFileName("randomstr") + "." + vidExt
vidFile, err := os.Create(path + vidFileName)
if err != nil {
fmt.Println(err)
return nil, err
}
defer vidFile.Close()
if _, err := vidFile.Write(vidData); err != nil {
fmt.Println("error saving video")
panic(err)
return nil, nil
}
return vidFileName, nil
}
func getRandomFileName(prefix string) string {
rand.Seed(time.Now().UTC().UnixNano())
l := len(prefix)
result := make([]byte, l)
for i := 0; i < l; i++ {
result[i] = CHARS[rand.Intn(len(CHARS))]
}
return string(result)
}
但是这会产生错误:
shared/saveimage.go:117: cannot use vidData (type string) as type []byte in argument to vidFile.Write
诚然,我不知道应该使用哪种解码器来保存数据,因此SaveBase64VidToDisk
在黑暗中关闭,所以感谢您的帮助来解决这个问题。
答案 0 :(得分:2)
这不起作用,因为vidData
是包含base64编码视频的字符串。你想要的是从vidReader
读取数据,并保存它。它是一个io.Reader,因此您可以使用Read函数从中读取数据。
或者,使用base64包中的Decode String函数将其直接读入[]byte
。
data, _ := base64.StdEncoding.DecodeString(vidData)
vidFile.Write(data)
答案 1 :(得分:0)
你可能只是做
vidFile.Write([]byte(vidData))
编辑:哦,我明白了,我认为你真的想保存视频base64encoded。听起来像你想要做的:
data := []byte{}
base64.StdEncoding.Decode(data, vidData)
vidFile.Write(data)