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))
     
     
  • 相关阅读:
    GNU Linux中的SO_RCVLOWAT和SO_SNDLOWAT说明
    Spring.NET 的IOC(依赖注入)
    c# post 数据的方法
    C# .NET中的 反射的应用
    C# .NET修改注册表
    DataTabel DataSet 对象 转换成json
    sqlserver 行转列
    asp.net 二级域名session共享
    Asp.Net集群中Session共享
    微软企业库DBBA的研究
  • 原文地址:https://www.cnblogs.com/zhangqingping/p/4300808.html
Copyright © 2011-2022 走看看