golang模板上传文件如何验证文件是否为空

时间:2015-11-30 08:35:46

标签: file templates go upload

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

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

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

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

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

有没有更好的方法来实现它?

3 个答案:

答案 0 :(得分: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)
    }

答案 1 :(得分:1)

不,如果不读取文件,就无法找到文件的长度。 (您可以尝试使用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.

答案 2 :(得分:0)

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

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

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