从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
只是一个包装一个字节数组的数据对象:
…所以如果你想发现它的MIMEtypes,我可以想到的一种方法是检查字节本身,然后从那里猜测types。 这里有一个例子: 从NSData或UIImage查找图像types
我也发现这一点: 确定从文件加载的NSData的MIMEtypes ; 这是指一些内部数据库(我猜)可以用于MIMEtypes的查找。
但就像汤姆·哈林顿(Tom Harrington)在回答中所说的那样,根据你所处理的情况可能会变得棘手。
编辑…
当然,第二个解决scheme依赖于文件扩展名,你显然没有,但我相信你已经注意到了。
既然你说你正在上传这些数据,你应该已经知道MIMEtypes了。 您创build了数据对象,您知道数据来自哪里,并且只有有限数量的MIMEtypes。 因此,使用适用于您的数据的任何一个。 对于图像可能是image/jpeg
或image/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 ""
- 如何使用Restkit 0.20.0创build/发布新的托pipe对象到服务器?
- 如何使用自动布局在屏幕中水平和垂直居中UILabel?
- 无限的UICollectionView
- 为什么在呈现新的UITableviewController子类时以前工作的Xcode项目在Xcode 7中挂起?
- 如何在MapKit中获得可见的覆盖? (即来自Mapkit Ivew的MKOverlay / MKOverlayRender)
- 远程删除以前发送的通知
- 在Android SDK SDK 4.1+中调用Android refreshCurrentAccessTokenAsync
- 一旦手机电源closures和打开,无声通知的行为如何
- 如何testing/检查使用NSURLCache?