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))
     
     
  • 相关阅读:
    MyBatis的缓存
    16年随笔
    linux 随笔
    Linux下启动Tomcat启动并显示控制台日志信息
    linux 连接工具
    Linux Tomcat重新启动
    SpringMVC 文件上传 MultipartFile
    spring @component
    mysql转型
    MyBatis传入参数
  • 原文地址:https://www.cnblogs.com/zhangqingping/p/4300808.html
Copyright © 2011-2022 走看看