为了账号安全,请及时绑定邮箱和手机立即绑定

如何检查通过多部分形式发布的文件是否为图像类型,并且它是否小于 Go 中的给定 maxsize?

如何检查通过多部分形式发布的文件是否为图像类型,并且它是否小于 Go 中的给定 maxsize?

Go
慕工程0101907 2021-11-08 15:37:29
我想知道是否有办法在将其上传到服务器之前检查大小和类型。我担心人们试图上传非常大的文件来故意降低服务器的速度。我只知道如何在将文件复制到服务器后检查文件的大小。我不知道如何检查文件类型。我想在必须上传 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 的内容都将被截断。

要检查接收到的数据是否为图像,您有两种选择:

  1. 使用 解析数据image.Decode(io.Reader),如果无法将数据解析为图像,则会抛出错误 - 这还允许您检查接收到的数据是否完整和正确。但是请注意,这需要一些时间/窃取性能。也许你想避免这种情况,如果你之后只是丢弃解码的图像。请务必检查图像包的godoc,因为您必须导入您希望解码的任何格式。

  2. 检查幻数,例如 PNG 文件89 50 4e 47 0d 0a 1a 0a作为它们的幻数。然而,正确的幻数并不意味着正确的图像。特别是如果您将较大的图像截断为 10 MiB。

如果您有能力解码手头的每张图像,那就去做吧——结果应该更精确,但这只是一个建议。

我宁愿不检查文件类型的 FileHeader (pkg/mime/multipart/#FileHeader),我希望它不可靠。但是,您可能会在其中找到有关(原始)文件大小的信息,我建议您只为某些请求转储 FileHeaders。


查看完整回答
反对 回复 2021-11-08
  • 1 回答
  • 0 关注
  • 219 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信