猿问

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

我想知道是否有办法在将其上传到服务器之前检查大小和类型。我担心人们试图上传非常大的文件来故意降低服务器的速度。


我只知道如何在将文件复制到服务器后检查文件的大小。我不知道如何检查文件类型。我想在必须上传 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

}


慕工程0101907
浏览 220回答 1
1回答

智慧大石

为了避免将大量数据上传到您的服务器,我建议将您的 包装起来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。
随时随地看视频慕课网APP

相关分类

Go
我要回答