Mime类型检查上传的文件Golang

sqserrrh  于 2023-09-28  发布在  Go
关注(0)|答案(2)|浏览(113)

我试图得到的MIME类型的文件被上传到我的服务器。
.xlsx和.docx文件mime类型出现在application/zip中。我尝试解压缩文件并读取类型为“_rels/.rels”的文件。我的疑问是,在阅读这个特定的文件时,我应该为读取文件保留的最大大小是多少,如果目标是“xl/workbook.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的提示吗?

cetgtptt

cetgtptt1#

不幸的是,html包中的DetectContentType仅限于它可以检测的mime类型。
至于检测二进制格式,如果您只需要判断它是否是. doc,则不需要读取整个文件。您可以查看文件签名。file signatures是一个很好的文件签名资源
如果你想使用现有的包,这里是github上的摘要。
免责声明:我是mimetype的作者。

  • filetype
  • 纯go,没有c绑定
  • 可以扩展到检测新的MIME类型
  • 对于作为多个mime类型传递的文件存在问题(例如:xlsx和docx传递为zip),因为它将匹配的函数存储在Map中,因此不能保证遍历的顺序
  • magicmime
  • 需要安装libmagic-dev
  • 可以延长,尽管更难man magic
  • mimetype
  • 纯go,没有c绑定
  • 检测到的mime类型数高于filetype
  • 是线程安全
  • 可以扩展
p4rjhz4m

p4rjhz4m2#

你可以使用。

import (
"net/http"
"os"
)

filebytes, err :=os.Readfile(filePath)

http.DetectContentType(filebytes)

相关问题