ble*_*908 22 objective-c nsdata ios mime-types
您如何确定NSData对象的mime类型?我计划让用户从他们的iPhone上传视频/图片,并将该文件包装在NSData类中.
我想知道我是否可以告诉NSData的mime类型.这个问题只有几个答案,最近一个是2010年(4年前!).谢谢!
NSData *data; // can be an image or video
NSString *mimeType = [data getMimetype]; // how would I implement getMimeType
Run Code Online (Sandbox Code Playgroud)
Tib*_*Tib 37
基于ml的类似帖子的回答,我添加了NSData的mime类型确定:
ObjC:
+ (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;
}
Run Code Online (Sandbox Code Playgroud)
迅速:
static func mimeType(for data: Data) -> String {
var b: UInt8 = 0
data.copyBytes(to: &b, count: 1)
switch b {
case 0xFF:
return "image/jpeg"
case 0x89:
return "image/png"
case 0x47:
return "image/gif"
case 0x4D, 0x49:
return "image/tiff"
case 0x25:
return "application/pdf"
case 0xD0:
return "application/vnd"
case 0x46:
return "text/plain"
default:
return "application/octet-stream"
}
}
Run Code Online (Sandbox Code Playgroud)
这只处理主文件类型,但您可以完成它以满足您的需要:此处提供所有文件签名,只需使用与我相同的模式.
PS:这里有所有相应的mime类型
Dmi*_*aev 23
❤️斯威夫特
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"
}
}
Run Code Online (Sandbox Code Playgroud)
既然您说要上传此数据,那么您应该已经知道 MIME 类型。您创建了数据对象,您知道数据来自哪里,并且 MIME 类型的数量有限。因此,请使用适用于您的数据的任何一种。对于图像来说,它可能是image/jpeg
或image/png
。对于视频来说,有很多video/
类型。您可以在 Mac 上的 中找到一长串 MIME 类型字符串/etc/apache2/mime.types
。您需要其中一个或多个,具体取决于您拥有的视频类型。
确定 MIME 类型是一个棘手的问题;anNSData
可以编码任何类型的二进制数据。确定编码内容的唯一方法是检查字节。这反过来意味着对不同文件类型中存在哪些字节流有一定的了解。在许多(但不是全部)情况下应该可以使用查找字典,并且在某些地方可能有针对常见文件类型的开源实现。要了解其中涉及的内容,请尝试man file
在 Mac 上查看/usr/share/file/magic/
如何识别各种文件类型(该file
命令不会生成 MIME 类型,但会分析文件内容以尝试识别文件类型,因此原理相同)。