将base64编码的字符串视频保存到磁盘

时间:2017-11-02 02:50:08

标签: video go base64

为了保存通过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在黑暗中关闭,所以感谢您的帮助来解决这个问题。

2 个答案:

答案 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)