使用 golang 中的 pdf 库读取 http 请求上传的 multipart.file

Read a multipart.file uploaded by http request with pdf library in golang

提问人:carlcaroline 提问时间:10/21/2023 最后编辑:James Zcarlcaroline 更新时间:10/22/2023 访问量:57

问:

我试图直接解析它,但它变成了 pdf 的二进制文件,所以我尝试了这个:将请求中的文件内容复制到放置在同一包中的新文件中并读取它,但它变成了文件是空的。谁能解释一下用于解决这个问题的逻辑?如果您对我可以使用的软件包有任何建议,也请告诉我

func (c *Client) HandleUpload(writer http.ResponseWriter, request *http.Request) {
    ctx, cancel := c.createContextWithTimeout(TimeoutHandleUpload)
    defer cancel()

    f, _, err := request.FormFile("data")
    if err != nil {
        c.httpError(writer, err)
        return
    }
    defer f.Close()

    err = c.ReadFile(f)
    if err != nil {
        c.httpError(writer, err)
        return
    }

    _ = httputil.WriteObj200(writer, nil)
}


func (c *Client) ReadFile(f multipart.File) (err error) {
    var buf bytes.Buffer
    var file bytes.Buffer

    _, err = io.Copy(&buf, f)
    if err != nil {
        log.Fatal(err)
    }

    if err := os.WriteFile("file.pdf", file.Bytes(), 0666); err != nil {
        log.Fatal(err)
    }

    uploadedFile, err := os.Open("file.pdf")
    if err != nil {
        log.Fatal(err)
    }
    defer uploadedFile.Close()

    _, err = io.Copy(uploadedFile, &file)
    fmt.Println("file")

    absPath, err := filepath.Abs("file.pdf")
    content, err := os.ReadFile(absPath)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println(string(content))
}
解析 pdf httprequest multipartfile

评论

1赞 otaxhu 10/22/2023
os.Open()并采用绝对路径,您正在通过相对路径。路径解析为操作系统的根目录(Linux 为“/”,Windows 为“c:\”),您需要使用该函数。还有一件事是我建议你使用而不是os.WriteFile()filepath.Abs()os.Create()os.WriteFile()
0赞 erik258 10/22/2023
“哎呀。Open() 和 os。WriteFile() 采用绝对路径“不,它们只是采用路径。(文档中的示例)。当然,对于相对的工作路径,当前工作目录必须是操作的正确位置
1赞 erik258 10/22/2023
“我试图直接解析它,但它改变了 pdf 的二进制文件”如何将其写入文件将如何改变这一点?它仍然只是字节。“放置在同一个包中的新文件”包是编译时、代码时的事情。在运行已编译的可执行文件时,它们不再相关。请记住,与解释型语言不同,Go 可执行文件一旦编译就不需要执行其源代码。如果你在源码包目录中,那只是偶然的。

答: 暂无答案