如何检查通过多部分表单发布的文件是否为图像类型,以及是否小于Go中给定的maxsize?
我想知道在上传到服务器之前是否有办法检查大小和类型。我担心人们试图上传非常大的文件来故意降低服务器的速度 我只知道在将文件复制到服务器后如何检查文件的大小。我不知道如何检查文件类型。我想在上传2GB的数据,然后验证文件之前完成 这是我到目前为止所拥有的,但这会首先将文件复制到服务器,这不是我想要的如何检查通过多部分表单发布的文件是否为图像类型,以及是否小于Go中给定的maxsize?,go,Go,我想知道在上传到服务器之前是否有办法检查大小和类型。我担心人们试图上传非常大的文件来故意降低服务器的速度 我只知道在将文件复制到服务器后如何检查文件的大小。我不知道如何检查文件类型。我想在上传2GB的数据,然后验证文件之前完成 这是我到目前为止所拥有的,但这会首先将文件复制到服务器,这不是我想要的 func userUploadImage(w http.ResponseWriter, r *http.Request, _ httprouter.Params) error { mpf, m
func userUploadImage(w http.ResponseWriter, r *http.Request, _ httprouter.Params) error {
mpf, mpfh, err := r.FormFile("file")
if err != nil {
return nil
}
defer mpf.Close()
dstFile, err := os.Create(config.UploadDir + "/img/" + mpfh.Filename)
if err != nil {
return err
}
defer dstFile.Close()
size, err := io.Copy(dstFile, mpf)
if err != nil {
return err
}
spew.Dump(size)
return nil
}
为了避免将大量数据上传到服务器,我建议将
多部分.File
包装起来,它本质上是一个io.Reader
和io.LimitedReader
,如
wrapped := io.LimitReader(mpf,10*1024*1024) //10 MiB
然后使用包装的
读卡器。这将读取指定数量的字节,然后返回EOF,因此任何大于10MIB的内容都将被截断
要检查接收的数据是否为图像,您有两种选择:
image.Decode(io.Reader)
解析数据,如果无法将数据解析为图像,则会抛出错误-这还允许您检查接收到的数据是否完整和正确。但是请注意,这需要一些时间/影响性能。也许你想避免这种情况,如果你只是放弃解码后的图像。请确保检查图像包的,因为您必须导入任何您希望解码的格式89 50 4e 47 0d 0a 1a 0a
作为其幻数。然而,正确的幻数并不意味着正确的图像。尤其是如果您将较大的图像截断为10 MiB我不想检查文件头(pkg/mime/multipart/#FileHeader)中的文件类型,我认为它不可靠。但是,您可能会在其中找到有关(原始)文件大小的信息,我建议您仅对某些请求转储文件头。非常感谢,非常有用!