我是go-lang的初学者。当我使用html模板上传文件时遇到了问题。我谷歌很多,但没有解决。
<input type="file" name="myfile"/>
使用func(* Request)FormFile获取文件。
file, header, err := req.FormFile("receipt")
但如何从服务器端验证文件是否为空?我知道我可以读取request.Body来查找myfile是否为空。
有没有更好的方法来实现它?
答案 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
}
虽然我不确定这些数据在安全性方面有多可靠(我猜攻击者可能会伪造发送到服务器的恶意程序)。