上传的 Golang 文件的 Mime 类型检查



我正在尝试获取上传到服务器中的 mime 类型的文件。

.xlsx和.docx文件MIME类型出现应用程序/zip。我尝试解压缩文件并读取类型为"_rels/.rels"的文件。我的疑问是在读取此特定文件时,我应该为读取文件保留的最大大小是多少,如果目标是"xl/工作簿.xml",我可以假设它是 xlsx 类型吗?

我的代码如下

file, fileHeader, err := r.FormFile("file")
buffer := make([]byte, 512)
_, err = file.Read(buffer)
if err != nil {
fmt.Println(err)
}
contentType := http.DetectContentType(buffer)
if contentType == "application/zip" {
r, err := zip.NewReader(file, fileHeader.Size)
if err != nil {
fmt.Println(err)
}
for _, zf := range r.File {
if zf.Name == "_rels/.rels" {
fmt.Println("rels")
rc, err := zf.Open()
if err != nil {
fmt.Println("Rels errors")
}
const BufferSize = 1000
buffer := make([]byte, BufferSize)
defer rc.Close()
bytesread, err := rc.Read(buffer)
if err != nil {
if err != io.EOF {
fmt.Println(err)
}
}
fmt.Println("bytes read: ", bytesread)
fmt.Println("bytestream to string: ", string(buffer[:bytesread]))
fmt.Println(rc)
}
}
}

var arr []byte
w.Header().Set("Content-Type", "application/json")
w.Write(arr)

}

我得到的输出是

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships     xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties" Target="docProps/app.xml"/><Relationship Id="rId2" Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Target="docProps/core.xml"/><Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="xl/workbook.xml"/></Relationships>

关于如何阅读.doc或.xls的任何提示?

不幸的是,html包中的DetectContentType仅限于它可以检测到的 MIME 类型。

至于检测二进制格式,如果您只需要判断它是否是.doc,则无需读取整个文件。您只需检查文件签名即可。文件签名的一个很好的资源是文件签名

如果你想使用现有的包,这是 github 上的内容的摘要。

免责声明:我是mimetype的作者。

  • 文件类型

    • 纯 go,无 c 绑定
    • 可以扩展以检测新的 MIME 类型
    • 作为
    • 多个 MIME 类型传递的文件存在问题(例如:XLSX 和 docx 作为 zip 传递(,因为它在映射中存储匹配的函数,因此它不保证遍历的顺序
  • 魔术哑剧

    • 需要安装libmagic-dev
    • 可以扩展,尽管更难...man magic
  • 哑剧型

    • 纯 go,无 c 绑定
    • 检测到的 MIME 类型数量多于filetype
    • 线程安全
    • 可以扩展

你可以使用。

import (
"net/http"
"os"
)
filebytes, err :=os.Readfile(filePath)
http.DetectContentType(filebytes)

最新更新