首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >iOS Swift -从数据获取mime类型

iOS Swift -从数据获取mime类型
EN

Stack Overflow用户
提问于 2022-10-15 21:18:52
回答 2查看 100关注 0票数 0

我使用PhotosPicker库来选择图像或视频并将其放入数据中:

代码语言:javascript
复制
@State private var selectedImageData: Data? = nil

我要弄清楚到底选了什么。

我找到的所有答案都是关于如何使用路径从文件中检索meme类型,但我没有使用PhotosPicker获得文件路径。

我在某个地方发现了这个:

代码语言:javascript
复制
extension Data {
    private static let mimeTypeSignatures: [UInt8 : String] = [
        0xFF : "image/jpeg",
        0x89 : "image/png",
        0x47 : "image/gif",
        0x49 : "image/tiff",
        0x4D : "image/tiff",
        0x25 : "application/pdf",
        0xD0 : "application/vnd",
        0x46 : "text/plain",
        ]

    var mimeType: String {
        var c: UInt8 = 0
        copyBytes(to: &c, count: 1)
        return Data.mimeTypeSignatures[c] ?? "application/octet-stream"
    }
}

它可以工作,但它是不完整的,我还需要mp4,mov和尽可能多的

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-10-16 05:48:56

快速研究谷歌的"mime类型十六进制签名“将给您提供,例如.

编辑

代码中的签名数组读取文件的第一个字节数据,以确定其类型。

  • 因此,首先,根据我提供的链接,仅仅使用一个字节可能不足以确定数据的类型(可以有多个类型具有相同的第一个字节)。您应该首先修改您的代码,以便签名可以有几个字节长。
  • 然后,您应该使用我提供的链接,在这里,即使使用不同的语言,也可以获得链接到相关格式的第一个字节的列表,以填充签名数组和相应的类型。

下面是我所说的示例代码:

代码语言:javascript
复制
extension Data
{
    private static let mimeTypeSignatures: [([UInt8], String)] = [
        ([0x49, 0x49, 0x2A, 0x00], "image/tiff"),
        ([0x4D, 0x4D, 0x00, 0x2A], "image/tiff"),
        ([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A], "image/png"),
        //...
    ]

    var mimeType: String
    {
        let tenFirstBytes = Array(subdata(in: 0..<10))
        return Data.mimeTypeSignatures.filter
                   { signature in
                       tenFirstBytes.starts(with: signature.0)
                   }
                   .first?.1 ?? "application/octet-stream"
    }
}

它将数据的10个第一个字节转换为一个数组,然后检查每个MIME类型是否以MIME类型字节开始。(如果MIME签名长度超过10字节,则需要占用10字节以上)。

票数 0
EN

Stack Overflow用户

发布于 2022-10-16 09:50:31

您可以重新使用代码这里来使用签名。

在复制粘贴逻辑并添加tiff、vnd或text/平原的情况后,您将得到以下逻辑:

代码语言:javascript
复制
enum ImageFormat {
    case gif, jpg, png, vnd, tiff, unknown
}
if let data = someData {
    switch data.format() {
    case .jpg, .png, .gif:
        print ("Formats supported by Swift. Yihaaa")
    case .tiff:
        print ("Do some fancy decoding")
    case .pdf:
        print ("Read as a file")
    case .unknown:
        print ("Treat this data differently")
    }
}

如果使用String进行比较,请确保使用. isoLatin1进行解码。如果使用mimeTypeSignatures中的键对字节进行比较,则不需要这样做。我个人认为使用String更容易读懂。它有助于解码和添加测试。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74083113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档