如何使用beego从数据库中读取内容来制作pdf文件?

时间:2015-01-07 07:22:29

标签: database pdf go beego

我读了一个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)

3 个答案:

答案 0 :(得分:1)

您忽略了multipart.File来电中的GetFile。直接使用它。将它写入磁盘并再次读回来是浪费时间。

在从DB读取文件到发送到客户端之间也没有理由将文件保存到磁盘。

(您可能希望确保您的数据库已经过优化,可以处理像这样的大型blob。对于大多数数据库来说,这不是通常的用例。)

答案 1 :(得分:0)

我在MongoDB文档中遇到了同样的pdf问题。它被存储为Base64加密的字符串值。我的步骤是:

  1. 查找记录。
  2. 解码字符串:
  3. 从pdfBytes创建* Buffer
  4. 直接将其写入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;});