zoukankan      html  css  js  c++  java
  • golang: multiple http.writeHeader calls

    背景:
    golang的http服务,读取文件,提供给client下载时候。
    出现 multiple http.writeHeader calls 错误。

    func DownloadFile(w http.ResponseWriter, r *http.Request, sequence uint64, userid string) {
        userkey := userid
        filename := r.FormValue("filename")
        if len(userkey) <= 0 || len(filename) <= 0 {
            //........
        }
        fp := fmt.Sprintf("%s%s/%s", g_sc.Rootdir, userkey, filename)
        fd, err := os.Open(fp)
        if err == nil {
            defer fd.Close()
            buf, err := ioutil.ReadAll(fd)
            if err != nil {
                //.........
            } else {
                size := len(buf)
                w.Header().Add("Content-Length", fmt.Sprintf("%d", size))
                fmt.Fprint(w, string(buf))
            }
        }
    }

    问题出现在这几行代码:

    size := len(buf)
    w.Header().Add("Content-Length", fmt.Sprintf("%d", size))
    fmt.Fprint(w, string(buf))

     
    可以做如下修改:
     
    buf := new(bytes.Buffer)
    buf.Write(...)
     
    if err {
      // you can use http.Error here, no response has been written yet
      http.Error(w, err.String, http.StatusInternalServerError)
      return
    }
     
    if err := buf.WriteTo(w); err != nil {
      log.Printf("WriteTo: %v", err)
      // you can not use http.Error here anymore. So just log the message (e.g. "broken pipe...")
    }
     或者注释这两行代码
     //size := len(buf)
     //w.Header().Add("Content-Length", fmt.Sprintf("%d", size))
    fmt.Fprint(w, string(buf))
     
     
  • 相关阅读:
    Spring Boot 内嵌Tomcat的端口号的修改
    仅显示INPUT下边框
    2015面试记三
    2015面试记二
    2015面试记一
    最近工作学习心得体会
    Tomcat批处理文件小结
    启动Tomcat一闪而过——分析及解决过程
    WIN7安装及配置JDK
    Firefox下载文件时中文名乱码问题
  • 原文地址:https://www.cnblogs.com/zhangqingping/p/4300808.html
Copyright © 2011-2022 走看看