英文:
golang template upload file how to validate the file is empty
问题
我是一个go-lang的初学者。当我使用HTML模板上传文件时遇到了一个问题。我在Google上搜索了很多但是没有解决。
使用func (*Request) FormFile
来获取文件。
file, header, err := req.FormFile("receipt")
但是如何在服务器端验证文件是否为空呢?我知道可以读取request.Body
来查找myfile
是否为空。
有没有更好的实现方法呢?
英文:
I am a beginner with go-lang. I met a problem when I uploaded a file with html template. I google a lot but not solved.
<input type="file" name="myfile"/>
Use func (*Request) FormFile get the file.
file, header, err := req.FormFile("receipt")
But how to validate the file whether it is empty from server side? I know I can read request.Body to find whether myfile is empty.
Is there a better way to implement it?
答案1
得分: 3
我认为在读取文件之前是不可能知道文件的大小的。请参考这个答案:
读取文件内容是唯一可靠的方法。话虽如此,如果内容长度存在且太大,关闭连接是一个合理的做法。
所以我猜你需要将一部分内容读入一个小的临时缓冲区,并查看大小。
如果你想验证用户是否发送了文件,你可以检查http.ErrMissingFile
:
file, header, err := r.FormFile("f")
switch err {
case nil:
// 什么都不做
case http.ErrMissingFile:
log.Println("没有文件")
default:
log.Println(err)
}
英文:
I don't think it's possible to know the size of the file until you read it. See this answer:
>To read the file content is the only reliable way. Having said that, if the content-lenght is present and is too big, to close the connection would be a reasonable thing to do.
So I guess you'll have to read a part of the content into a small temporary buffer and look at the size.
If you want to validate, whether the user even sent a file, you can check against 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
得分: 1
不,你无法在不读取文件的情况下找到文件的长度。(你可以尝试使用Content-Length头部,但你必须知道它可以被修改,因此不可靠)。
以下是获取文件大小的方法:
file, handler, err := r.FormFile("receipt") // r是*http.Request
var buff bytes.Buffer
fileSize, err := buff.ReadFrom(file)
fmt.Println(fileSize) // 这将返回文件的大小。
英文:
No, you can't find the length of a file without reading it. (You can try to use Content-Length header, but you have to know that it can be modified and thus not reliable).
Here is how you can get the file size:
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
得分: 0
你可以从头部变量(在你的示例中)中读取文件大小,该变量是由FileHeader类型返回的,由FormValue返回,并包含文件的大小:
file, header, err := req.FormFile("receipt")
if err != nil || header.Size == 0 {
// 文件未发送
} else {
// 处理文件
}
尽管我不确定这个数据在安全方面有多可靠(我猜攻击者可以恶意伪造发送到服务器的头部)。
英文:
You can read the file size from the header variable (in your example), which is a FileHeader type, returned by FormValue, and contains the size of the file:
file, header, err := req.FormFile("receipt")
if err != nil || header.Size == 0 {
// file was not sent
} else {
// process file
}
Though I'm not sure how reliable is this data in terms of security (I guess an attacker could fake the headers sent to the server maliciously).
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论