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==

https://play.golang.org/p/qZYKDEBhERO

在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
回到顶部