我读了一个pdf文件,然后将其原始内容存储到数据库中。现在我想从数据库中读取该内容并创建一个pdf,以便用户可以下载它。
为此,我阅读内容并将其写入扩展名为.pdf的文件。但结果是一个空的pdf文件。
我这样做是因为我想避免在磁盘中保存文件。
我正在使用beego框架。
有任何建议/帮助吗?
我正在做什么
从pdf文件中读取并将其写入数据库
_,header,_:=c.GetFile("attachment[]")
attachment:=header.Filename
c.SaveToFile("attachment[]","/tmp/"+attachment)
content,_:= ioutil.ReadFile("/tmp/"+attachment)
s := string(content)
然后将此's'写入数据库
从数据库中读取并写入pdf文件
err := o.Raw("SELECT attachment FROM table_name WHERE id=?",id).QueryRow(&att)
if err == nil {
fmt.Println(att)
}
var data []byte
data = []byte(att)
ioutil.WriteFile("/tmp/hello.pdf",data, 0666)
答案 0 :(得分:1)
您忽略了multipart.File
来电中的GetFile
。直接使用它。将它写入磁盘并再次读回来是浪费时间。
在从DB读取文件到发送到客户端之间也没有理由将文件保存到磁盘。
(您可能希望确保您的数据库已经过优化,可以处理像这样的大型blob。对于大多数数据库来说,这不是通常的用例。)
答案 1 :(得分:0)
我在MongoDB文档中遇到了同样的pdf问题。它被存储为Base64加密的字符串值。我的步骤是:
直接将其写入http.ResponseWritter:
b := bytes.NewBuffer(pdfBytes) // Step 2
pdfBytes,err := b64.StdEncoding.DecodeString(doc.Image) // Step 3
if _, err := b.WriteTo(w); err != nil { // Step 4
fmt.Fprintf(w, "%s", err) // Handle the error
}
这很好用,我可以使用它处理40+百万份文档。但是,我一直对是否有更好的方法感兴趣。正如@JimB所说,如果您需要从文件中读取内容,那是最好的方法。问题是问题很模糊。
答案 2 :(得分:-2)
何时使用github.com/jung-kurt/gofpdf库:
int i(0);
std::for_each(mat.begin(), mat.end(),
[&i](IVec &ivec){int j(0); std::for_each(ivec.begin(), ivec.end(),
[&i,&j](auto &k){k = i*j++;}); ++i;});