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

go programmingserver side programmingprogramming

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

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

打开文件

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

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

if err != nil {
   panic(err)
}

defer file.Close()

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

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

从文件中读取数据

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

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

// to嗅探内容类型,仅使用前
// 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

相关文章