Golang HTTP请求中间件相关问题请教

公司这边有一个需求是这样的:

有一个form表单,上传文件,在前端不做文件扩展名和文件大小的校验,放在后端做,但是考虑到如果用户上传的文件比较大,需要较长的时间,所以要求用户表单提交触发HTTP请求之后,在未上传附件的情况下后端即根据请求对扩展名和文件大小校验,如果校验不通过,则返回错误请求提示。

这个说是要用HTTP中间件实现,请问下如何实现?有没有Go的http中间件推荐?

已邀请:

皇虫 - PHP后端与web前端程序员

赞同来自:

简单点说,就是用户通过form表单上传1个G的文件,在触发请求到后端的时候,就对文件扩展名和文件大小等进行校验,而不需要上传完整个文件才告诉用户说文件大小超过限制...

能实现吗?

ddxx11223

赞同来自:

我觉得可以这样,先发一个option请求,后端校验通过,浏览器再发送真正的post请求。

jdlau - https://www.jdscript.com/

赞同来自:

看http头的content-length?

root666 - 90后

赞同来自:

在未上传附件的情况下后端即根据请求对扩展名和文件大小校验

很好奇能不能实现...

pathbox - https://pathbox.github.io/

赞同来自:

如果前面挂 nginx的话,可以直接先在nginx 做对大小的限制配置。

  1. 手动写中间件(其实没那么难,只是可能没那么灵活),根据 header 的content-length 和文件名 做验证
  2. 第三方的中间件库 alice、negroni
  3. 如果用的web框架,找一下对应框架的 中间件实现
  4. 不要在中间件去 read body,如果要这样操作,最好使用context将body内容继续传下去。因为read 过body,这个body就被读取出来了,再handler里面再 read的时候,就没有数据了,如果遇到这种情况,很有可能就是这个原因

pathbox - https://pathbox.github.io/

赞同来自:

看下 这段代码

func HelloServer(w http.ResponseWriter, r *http.Request) {
    if "POST" == r.Method {
        file, _, err := r.FormFile("userfile")
        if err != nil {
            http.Error(w, err.Error(), 500)
            return
        }

        if statInterface, ok := file.(Stat); ok {
            fileInfo, _ := statInterface.Stat()
            fmt.Fprintf(w, "上传文件的大小为: %d", fileInfo.Size())
        }
        if sizeInterface, ok := file.(Size); ok {
            fmt.Fprintf(w, "上传文件的大小为: %d", sizeInterface.Size())
        }

        return
    }

要回复问题请先登录注册