在Go中给定名称的情况下,如何猜测文件的类型和编码?

时间:2018-08-16 23:41:01

标签: go

我正在寻找一种快速的方法来猜测文件名的Go语言中的mime类型和编码。在Python中,您可以执行以下操作:

import mimetypes
type, encoding = mimetypes.guess_type(file_name)

去有类似的东西吗?我看到了mimetypes包,但我认为它不能从文件名中导出编码。

2 个答案:

答案 0 :(得分:2)

使用mime.TypeByExtension获取给定文件扩展名的mime类型:

fmt.Println(mime.TypeByExtension(".jpg"))  // prints image/jpeg

如果以完整的文件名开头,请使用filepath.Ext获取扩展名并将该扩展名传递给上面的函数:

fmt.Println(mime.TypeByExtension(filepath.Ext("blah.gif")))  // prints image/gif

答案 1 :(得分:-1)

我对OP如何使用他们要检查的文件没有任何了解。如果您要从未知来源(例如从网站用户)进行上传并根据文件扩展名that's a security issue进行检查。如果要处理用户提交的内容,则应始终检查魔术页眉和页脚。

请尝试以下操作:https://github.com/h2non/filetype

由于不赞成仅粘贴答案链接,因此他们粘贴了代码示例:

package main

import (
  "fmt"
  "gopkg.in/h2non/filetype.v1"
  "io/ioutil"
)

func main() {
  buf, _ := ioutil.ReadFile("guess_file")

  kind, unknown := filetype.Match(buf)
  if unknown != nil {
    fmt.Printf("Unknown: %s", unknown)
    return
  }

  fmt.Printf("File type: %s. MIME: %s\n", kind.Extension, kind.MIME.Value)
}

我在生成的二进制文件上对其进行了测试,似乎可以正常工作:

$ ./guess_file 
File type: elf. MIME: application/x-executable