将Base64字符串解码并保存为文件。

9
这一直困扰着我,希望有人能够帮忙。由于我对Go语言还很陌生,请勿见怪如果这是一个愚蠢的问题。
我有一个包含base64的结构体,其格式如下:
 type UploadedFile struct {
    PartnerId string
    FileName string
    UploadDateTime string
    FileChecksum string
    FileBase64 string
 }

我想要获取这个base64字符串,解码并保存它,听起来很简单,实际上也是,但是我遇到了困难。
代码如下:
decoder := json.NewDecoder(r.Body)
uploadedFile := models.UploadedFile{}
err := decoder.Decode(&uploadedFile)
dec, _ := base64.StdEncoding.DecodeString(uploadedFile.FileBase64)

我该从哪里开始?我尝试了很多东西,但文件中到处都是错误。

我试图调整别人用于图片的代码,但我总是遭遇失败,因为该文件不是一张图片,它可以是任何类型的文件。

提前感谢您的帮助。


1
你遇到哪些错误,错误来自于哪里?你的例子实际上并没有展示你是如何尝试将解码后的Base64字符串保存到文件中的。你是否尝试打开/创建一个文件并向其中写入内容? - mkopriva
1个回答

25

更新:我忘了提到,如果你使用 f.Write,确保在完成写入操作后调用f.Sync,以确保您已经写入的所有内容实际上被存储了下来。下面的示例展示了更新后的代码。

我不确定您的代码示例是否不完整,因此本回答可能与之无关。但是,为了将解码后的字符串字节保存到文件中,您首先需要打开或创建一个文件,然后将字节写入该文件。类似于这样:

package main

import (
    "encoding/base64"
    "io"
    "os"
)

var b64 = `TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlz
IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2Yg
dGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGlu
dWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRo
ZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4=`

func main() {
    dec, err := base64.StdEncoding.DecodeString(b64)
    if err != nil {
        panic(err)
    }

    f, err := os.Create("myfilename")
    if err != nil {
        panic(err)
    }
    defer f.Close()

    if _, err := f.Write(dec); err != nil {
        panic(err)
    }
    if err := f.Sync(); err != nil {
        panic(err)
    }
}

在这里运行: https://play.golang.org/p/SZVquhZdXC


如果被编码的文件是PDF或.tar.gz格式,我还能使用WriteString吗?我可能完全错过了重点,但我认为WriteString只用于写文本文件? - Paul A.T. Wilson
1
你正在寻找如何将字节写入文件的方法吗?类似这样的吗?https://play.golang.org/p/QfY5leW4O9 如果是这种情况,我会更新我的答案。 - mkopriva
我实际上使用了你的示例,它适用于.gz文件、pdf、图像和一个巨大的二进制文件。因此,看来我在这个问题上只是忽略了显而易见的东西。 - Paul A.T. Wilson
好的,很高兴你解决了它,无论如何我已经更新了答案,现在写入字节而不是字符串是正确的方式,我认为。我不知道为什么我先使用了 io.WriteString :F - mkopriva

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接