从NSData确定MIMEtypes?

你将如何确定一个NSData对象的MIMEtypes? 我打算让用户从他们的iPhone上传video/图片,并将该文件包装在一个NSData类。

我想知道是否可以告诉NSData的MIMEtypes。 这个问题只有几个答案,最近一个是从2010年(4年前!)。 谢谢!

NSData *data; // can be an image or video NSString *mimeType = [data getMimetype]; // how would I implement getMimeType 

基于ml的类似post的回答 ,我已经添加了NSData的MIMEtypes确定:

 + (NSString *)mimeTypeForData:(NSData *)data { uint8_t c; [data getBytes:&c length:1]; switch (c) { case 0xFF: return @"image/jpeg"; break; case 0x89: return @"image/png"; break; case 0x47: return @"image/gif"; break; case 0x49: case 0x4D: return @"image/tiff"; break; case 0x25: return @"application/pdf"; break; case 0xD0: return @"application/vnd"; break; case 0x46: return @"text/plain"; break; default: return @"application/octet-stream"; } return nil; } 

这个句柄只是主要的文件types,但是你可以完成它:你可以在这里find所有的文件签名,只要使用和我一样的模式。

PS:所有对应的MIMEtypes都可以在这里find

❤️斯威夫特

 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" } } 

据我所知, NSData只是一个包装一个字节数组的数据对象:

https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSData_Class/Reference/Reference.html

…所以如果你想发现它的MIMEtypes,我可以想到的一种方法是检查字节本身,然后从那里猜测types。 这里有一个例子: 从NSData或UIImage查找图像types

我也发现这一点: 确定从文件加载的NSData的MIMEtypes ; 这是指一些内部数据库(我猜)可以用于MIMEtypes的查找。

但就像汤姆·哈林顿(Tom Harrington)在回答中所说的那样,根据你所处理的情况可能会变得棘手。

编辑…

当然,第二个解决scheme依赖于文件扩展名,你显然没有,但我相信你已经注意到了。

既然你说你正在上传这些数据,你应该已经知道MIMEtypes了。 您创build了数据对象,您知道数据来自哪里,并且只有有限数量的MIMEtypes。 因此,使用适用于您的数据的任何一个。 对于图像可能是image/jpegimage/png 。 对于video有一堆video/types。 您可以在/etc/apache2/mime.types的Mac上find一长串MIMEtypesstring。 您将需要一个或多个取决于你有什么样的video。

确定MIMEtypes是一个棘手的问题; 一个NSData可以编码任何种类的二进制数据。 确定编码的唯一方法是检查字节。 这反过来意味着对不同文件types中存在的字节stream有一些了解。 应该可以在许多(但不是全部)的情况下使用查找字典,并且可能存在用于常见文件types的开源实现。 要了解所涉及的内容,请尝试Mac上的man file ,然后查看/usr/share/file/magic/以查看各种文件types是如何识别的( file命令不生成MIMEtypes,但它分析文件内容尝试和识别文件types,所以这是相同的原则)。

var values = [UInt8](重复:0,count:imgData.count)

imgData.copyBytes(to:&values,count:1)

  switch values { case 0xff: return "image/jpeg" case 0x89: return "image/png" case 0x47: return "image/gif" case 0x49, 0x4d: return "image/tiff" } return ""