如何在 Golang 中检测文件的内容类型?

考虑一种情况,无论出于何种原因,我们都想在 Golang 中获取文件的内容类型。为了做到这一点,我们必须首先知道如何打开文件并将其中的一些字节读入一个缓冲区切片,然后我们将把它传递给一个帮助我们检测文件类型的函数。

第一步是打开我们要检查其类型的文件。

打开文件

考虑我们有一个名为sample.pdf的文件,其contentType是我们想要知道的。为了打开文件,我们需要按照下面代码片段中显示的代码进行操作。

// 打开您输入的类型的文件
// 想检查
file, err := os.Open("sample.pdf")

if err != nil {
   panic(err)
}

defer file.Close()

在上面的代码片段中,我们打开了一个名为sample.pdf的文件,然后如果遇到任何错误,我们将调用panic函数。

请注意,我们还推迟了Close()文件上的方法,这始终是一个好习惯。

从文件中读取数据

下一步是从文件中读取数据,我们可以借助os包中的Read()方法来完成。

下面显示的代码片段表示我们如何从文件中读取数据,然后将其存储在缓冲区中以备后用。

// 仅嗅探内容类型的第一个
// 使用了 512 个字节。

buf := make([]byte, 512)

_, err := out.Read(buf)

if err != nil {
   return "", err
}

检测内容类型

现在,最后一步是调用http包为我们提供的DetectContentType()函数。

这是完整的程序代码 -

package main

import (
   "fmt"
   "net/http"
   "os"
)

func main() {

   // 打开您输入的类型的文件
   // 想检查
   file, err := os.Open("sample.pdf")

   if err != nil {
      panic(err)
   }

   defer file.Close()

   // 获取文件内容
   contentType, err := GetFileContentType(file)

   if err != nil {
      panic(err)
   }

   fmt.Println("文件的内容类型是: " + contentType)
}

func GetFileContentType(ouput *os.File) (string, error) {

   // 仅嗅探内容类型的第一个
   // 使用了 512 个字节。

   buf := make([]byte, 512)

   _, err := ouput.Read(buf)

   if err != nil {
      return "", err
   }

   // 真正起作用的函数
   contentType := http.DetectContentType(buf)

      return contentType, nil
}
输出结果

如果我们在上面的代码上运行go run main.go命令,那么我们将在终端中得到以下输出。

Content Type: application/pdf