我想知道是否有办法在将其上传到服务器之前检查大小和类型。我担心人们试图上传非常大的文件来故意降低服务器的速度。我只知道如何在将文件复制到服务器后检查文件的大小。我不知道如何检查文件类型。我想在必须上传 2 GB 数据然后验证文件之前执行此操作。这是我到目前为止所拥有的,但这首先将文件复制到服务器,这不是我想要的。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}
1 回答
智慧大石
TA贡献1946条经验 获得超3个赞
为了避免将大量数据上传到您的服务器,我建议将您的 包装起来multipart.File
,这本质上是一个io.Reader
带有io.LimitedReader
,例如
wrapped := io.LimitReader(mpf,10*1024*1024) //10 MiB
然后在wrapped
阅读器上工作。这将读取指定数量的字节,然后返回 EOF,因此任何大于 10 MiB 的内容都将被截断。
要检查接收到的数据是否为图像,您有两种选择:
使用 解析数据
image.Decode(io.Reader)
,如果无法将数据解析为图像,则会抛出错误 - 这还允许您检查接收到的数据是否完整和正确。但是请注意,这需要一些时间/窃取性能。也许你想避免这种情况,如果你之后只是丢弃解码的图像。请务必检查图像包的godoc,因为您必须导入您希望解码的任何格式。检查幻数,例如 PNG 文件
89 50 4e 47 0d 0a 1a 0a
作为它们的幻数。然而,正确的幻数并不意味着正确的图像。特别是如果您将较大的图像截断为 10 MiB。
如果您有能力解码手头的每张图像,那就去做吧——结果应该更精确,但这只是一个建议。
我宁愿不检查文件类型的 FileHeader (pkg/mime/multipart/#FileHeader),我希望它不可靠。但是,您可能会在其中找到有关(原始)文件大小的信息,我建议您只为某些请求转储 FileHeaders。
- 1 回答
- 0 关注
- 219 浏览
添加回答
举报
0/150
提交
取消