Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检查通过多部分表单发布的文件是否为图像类型,以及是否小于Go中给定的maxsize?_Go - Fatal编程技术网

如何检查通过多部分表单发布的文件是否为图像类型,以及是否小于Go中给定的maxsize?

如何检查通过多部分表单发布的文件是否为图像类型,以及是否小于Go中给定的maxsize?,go,Go,我想知道在上传到服务器之前是否有办法检查大小和类型。我担心人们试图上传非常大的文件来故意降低服务器的速度 我只知道在将文件复制到服务器后如何检查文件的大小。我不知道如何检查文件类型。我想在上传2GB的数据,然后验证文件之前完成 这是我到目前为止所拥有的,但这会首先将文件复制到服务器,这不是我想要的 func userUploadImage(w http.ResponseWriter, r *http.Request, _ httprouter.Params) error { mpf, m

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

我只知道在将文件复制到服务器后如何检查文件的大小。我不知道如何检查文件类型。我想在上传2GB的数据,然后验证文件之前完成

这是我到目前为止所拥有的,但这会首先将文件复制到服务器,这不是我想要的

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)
    解析数据,如果无法将数据解析为图像,则会抛出错误-这还允许您检查接收到的数据是否完整和正确。但是请注意,这需要一些时间/影响性能。也许你想避免这种情况,如果你只是放弃解码后的图像。请确保检查图像包的,因为您必须导入任何您希望解码的格式
  • 例如,检查PNG文件是否将
    89 50 4e 47 0d 0a 1a 0a
    作为其幻数。然而,正确的幻数并不意味着正确的图像。尤其是如果您将较大的图像截断为10 MiB
  • 如果你有能力解码手头上的每一幅图像,那就去吧——结果应该更精确,但这只是一个建议


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

    非常感谢,非常有用!