【问题标题】:golang template upload file how to validate the file is emptygolang模板上传文件如何验证文件是否为空
【发布时间】:2016-03-03 20:08:35
【问题描述】:

我是 go-lang 的初学者。上传带有 html 模板的文件时遇到问题。我google了很多,但没有解决。

<input  type="file" name="myfile"/>

使用 func (*Request) FormFile 获取文件。

file, header, err := req.FormFile("receipt")

但是如何从服务器端验证文件是否为空?我知道我可以读取 request.Body 来查找 myfile 是否为空。

有没有更好的实现方式?

【问题讨论】:

    标签: file templates go upload


    【解决方案1】:

    我认为在您阅读文件之前不可能知道文件的大小。见this answer

    读取文件内容是唯一可靠的方法。话虽如此,如果内容长度存在并且太大,关闭连接将是合理的做法。

    所以我猜你必须将部分内容读入一个小的临时缓冲区并查看大小。

    如果要验证用户是否发送了文件,可以检查http.ErrMissingFile

        file, header, err := r.FormFile("f")
        switch err {
        case nil:
            // do nothing
        case http.ErrMissingFile:
            log.Println("no file")
        default:
            log.Println(err)
        }
    

    【讨论】:

      【解决方案2】:

      不,不读取文件就无法找到文件的长度。 (可以尝试使用 Content-Length 标头,但要知道它可以修改,因此不可靠)。

      获取文件大小的方法如下:

      file, handler, err := r.FormFile("receipt") // r is *http.Request
      var buff bytes.Buffer
      fileSize, err := buff.ReadFrom(file)
      fmt.Println(fileSize) // this will return you a file size.
      

      【讨论】:

        【解决方案3】:

        您可以从标头变量(在您的示例中)读取文件大小,这是一个FileHeader type,由FormValue 返回,并包含文件的大小:

        file, header, err := req.FormFile("receipt")
        if err != nil || header.Size == 0 {
            // file was not sent
        } else {
            // process file
        }
        

        虽然我不确定这些数据在安全性方面有多可靠(我猜攻击者可能会恶意伪造发送到服务器的标头)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-12-18
          • 2013-11-16
          • 1970-01-01
          • 2010-12-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-12
          相关资源
          最近更新 更多