Golang如何从Base64字符串获取PDF文件并转换为multipart.File
Golang如何从Base64字符串获取PDF文件并转换为multipart.File 如何从 base64 字符串获取文件,并将其转换为用于新请求的 multipart 文件?
3 回复
“net/textproto”
我从一个API接收到一个base64字符串。解码后,我得到了一个PDF的字节数据。现在我想将这个PDF作为multipart.file转发出去,例如转发到AWS或其他地方。
我已经完成了到字节数据这一步,只是不知道如何用它创建一个请求对象以便发送出去。
更多关于Golang如何从Base64字符串获取PDF文件并转换为multipart.File的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
如果你想构建一个包含使用Base64编码的PDF字节数据的multipart表单部分,可以尝试以下方法。
package main
import (
"encoding/base64"
"fmt"
"log"
"mime/multipart"
"net/textproto"
"strings"
)
func main() {
// 一个最小的PDF,参见 https://stackoverflow.com/a/17280876。
pdf := []byte(`%PDF-1.0
1 0 obj<</Type/Catalog/Pages 2 0 R>>endobj 2 0 obj<</Type/Pages/Kids[3 0 R]/Count 1>>endobj 3 0 obj<</Type/Page/MediaBox[0 0 3 3]>>endobj
xref
0 4
0000000000 65535 f
0000000010 00000 n
0000000053 00000 n
0000000102 00000 n
trailer<</Size 4/Root 1 0 R>>
startxref
149
%EOF`)
// 使用Base64编码。
enc := base64.StdEncoding.EncodeToString(pdf)
// 一个用于收集创建的多部分表单的io.Writer。
w := strings.Builder{}
// 包装io.Writer的multipart.Writer。
mw := multipart.NewWriter(&w)
// 为PDF创建一个表单字段。
h := make(textproto.MIMEHeader)
h.Add("Content-Disposition", `form-data; name="pdf"; filename="minimal.pdf"`)
h.Add("Content-Type", "application/pdf")
fw, err := mw.CreatePart(h)
if err != nil {
log.Panic("failed to create form field")
}
// 将Base64字节写入表单字段。
fw.Write([]byte(enc))
// 显示结果。
fmt.Println(w.String())
}
输出:
--971201acb7febe720f35118b6abf6bdb78754b23b92f42cba8d1e79b1b2a
Content-Disposition: form-data; name="pdf"; filename="minimal.pdf"
Content-Type: application/pdf
JVBERi0xLjAKMSAwIG9iajw8L1R5cGUvQ2F0YWxvZy9QYWdlcyAyIDAgUj4+ZW5kb2JqIDIgMCBvYmo8PC9UeXBlL1BhZ2VzL0tpZHNbMyAwIFJdL0NvdW50IDE+PmVuZG9iaiAzIDAgb2JqPDwvVHlwZS9QYWdlL01lZGlhQm94WzAgMCAzIDNdPj5lbmRvYmoKeHJlZgowIDQKMDAwMDAwMDAwMCA2NTUzNSBmCjAwMDAwMDAwMTAgMDAwMDAgbgowMDAwMDAwMDUzIDAwMDAwIG4KMDAwMDAwMDEwMiAwMDAwMCBuCnRyYWlsZXI8PC9TaXplIDQvUm9vdCAxIDAgUj4+CnN0YXJ0eHJlZgoxNDkKJUVPRg==
在Go中,从Base64字符串获取PDF文件并转换为multipart.File可以通过以下步骤实现:
package main
import (
"bytes"
"encoding/base64"
"fmt"
"io"
"mime/multipart"
"net/http"
"strings"
)
func createMultipartFileFromBase64(base64Str, filename string) (multipart.File, *multipart.FileHeader, error) {
// 解码Base64字符串
data, err := base64.StdEncoding.DecodeString(base64Str)
if err != nil {
return nil, nil, fmt.Errorf("base64解码失败: %v", err)
}
// 创建multipart写入器
body := &bytes.Buffer{}
writer := multipart.NewWriter(body)
// 创建文件部分
part, err := writer.CreateFormFile("file", filename)
if err != nil {
return nil, nil, fmt.Errorf("创建表单文件失败: %v", err)
}
// 写入PDF数据
_, err = io.Copy(part, bytes.NewReader(data))
if err != nil {
return nil, nil, fmt.Errorf("写入文件数据失败: %v", err)
}
writer.Close()
// 创建multipart读取器
reader := multipart.NewReader(body, writer.Boundary())
// 读取表单
form, err := reader.ReadForm(32 << 20) // 32MB限制
if err != nil {
return nil, nil, fmt.Errorf("读取表单失败: %v", err)
}
// 获取文件
files := form.File["file"]
if len(files) == 0 {
return nil, nil, fmt.Errorf("未找到文件")
}
fileHeader := files[0]
file, err := fileHeader.Open()
if err != nil {
return nil, nil, fmt.Errorf("打开文件失败: %v", err)
}
return file, fileHeader, nil
}
// 使用示例
func main() {
// 示例Base64字符串(这里用简化的示例)
base64PDF := "JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0ZpbHRlci9GbGF0ZURlY29kZT4+CnN0cmVhbQp4nF2T3W6jMBCG7zyFH7uXkICd2F4JISGkSq3Ui9pDpR5iJwZWIzYGO6V5+9nJbqtKfklz/Jv5ZjKT7Kv9rq1dMv1uG3UwzrS1rYy5XJvKGOPOrU6mSdLU1Yf+5mF5OuskS5L2cL0Ys9815yJbLpMk+2Yu5tY5s9p9J8mHcW3TnM3D7vM+WSU/7NkYY9M8Xz3M9lB9G2OSVf+72Xf9mMZcO+2M7qoqmWbJ9rB7NfowDvq6e+6eJNl8vTz2QbU6Gq27waZqjNFaJ0mWr4vVEPQw6HQIehj0ZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDWgY9rGXQw1oGPaxl0MNaBj2sZdDDW

