golang如何操作二进制流呢?

发布于 2022-09-11 21:58:59 字数 162 浏览 14 评论 0

有一个需求是这样的:
需要用go从一个接口获取pdf文件,然后前端js向go请求这个pdf文件,最终在页面上显示一个预览按钮并可以点击预览pdf

前端 → go → pdf

具体是这么一个过程,pdf用二进制方式传递,具体如何实现呢。。?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

時窥 2022-09-18 21:58:59

楼上的如果PDF过大,一次性读取会有内存问题。
另外,不要使用panic来中断逻辑运行,一旦panic没被处理,整个程序挂掉

func main() {
    http.HandleFunc("/pdf", function(w ResponseWriter, r *http.Request) {
        w.Header().Add("Content-Type", "application/pdf");
        fp, err:= os.Open("./go.pdf")
        if err!=nil {
            http.Error(w, fmt.Errorf("internal server error"), http.StatusInternalServerError)
            return;
        }
        defer fp.Close()
        
        if _, err:=io.Copy(w, fp);err!=nil {
            http.Error(w, fmt.Errorf("internal server error"), http.StatusInternalServerError)
           return;
        }
    });
}
黒涩兲箜 2022-09-18 21:58:59

根据 @loxp 的回答,写了测试代码。完全可行

func main() {
    http.HandleFunc("/index", IndexHandler)
    http.ListenAndServe(":8082", nil)
}

func IndexHandler(w http.ResponseWriter, r *http.Request) {
    w.Header().Add("Content-Type", "application/pdf")
    f, err := os.OpenFile("./go_book.pdf", os.O_RDONLY, 0777)
    if err != nil {
        // handle the error
    }
   defer f.Close()
   io.Copy(w, f)

    //b, err := ioutil.ReadAll(f)
    //if err != nil {
    //    panic(err)
    //}
   //w.Write(b)
}

访问http://127.0.0.1:8082/index就可以看到效果

从来不烧饼 2022-09-18 21:58:59

主要是http返回的content-type吧, 设置成application/pdf就行了. go中二进制数据用[]byte保存就可以.

╭⌒浅淡时光〆 2022-09-18 21:58:59
w.Header().Add("Content-Type", "application/pdf")
w.Header().Add("Content-Disposition", "attachment; filename=\""+fileNames+"\"")
经测试只设置    Content-Type即可,w.Header().Add("Content-Transfer-Encoding", "binary") 不是必须的,详情 https://www.w3.org/Protocols/rfc1341/5_Content-Transfer-Encoding.html
用 http.ServeFile() 也可实现下载显示
七月上 2022-09-18 21:58:59
package main  
  
import (  
    "log"  
 "net/http" "os" "time")  
  
func main() {  
    http.HandleFunc("/", zipHandler)  
    log.Println("Listening......")  
    http.ListenAndServe(":8080", nil)  
}  
  
func zipHandler(rw http.ResponseWriter, r \*http.Request) {  
    rw.Header().Set("Content-Type", "application/pdf")  
    f, err := os.Open("./sample.pdf");  
    defer f.Close()  
    if err == nil {  
        for {  
            buf := make(\[\]byte, 1024)  
            \_, err := f.Read(buf);  
            if err == nil {  
                rw.Write(buf)  
                // 流控  
  time.Sleep(1000 \* time.Microsecond)  
            } else {  
                return  
  }  
  
        }  
    }  
  
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文