您如何确定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
答案 0 :(得分:33)
基于ml's answer from a similar post,我添加了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;
}
夫特:
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"
}
}
这只处理主文件类型,但您可以完成它以满足您的需要:所有文件签名都可用here,只需使用与我相同的模式。
PS:所有相应的mime类型都可用here
答案 1 :(得分:21)
❤️Swift
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"
}
}
答案 2 :(得分:3)
据我所知,NSData
只是一个包装字节数组的数据对象:
...所以,如果你想发现它的MIME类型,我可以想到的一种方法是检查字节本身,然后从那里推测出类型。这里有一个例子:Finding image type from NSData or UIImage
我也发现了这个:Determine MIME Type of NSData Loaded From a File;这是指一些可用于MIME类型查找的内部数据库(我猜)。
但就像Tom Harrington在他的回答中所说的那样,根据你所处理的内容,这可能会变得棘手。
修改... 强>
当然,第二个解决方案依赖于文件扩展名,你显然没有,但我相信你已经注意到了。
答案 3 :(得分:2)
由于您说上传此数据,您应该已经知道了MIME类型。您创建了数据对象,您知道数据的来源,并且MIME类型的数量有限。因此,请使用适用于您的数据的任何一种。对于图片,可能是image/jpeg
或image/png
。对于视频,有一堆video/
类型。您可以在/etc/apache2/mime.types
的Mac上找到一长串MIME类型字符串。根据您拥有的视频类型,您需要一个或多个。
确定MIME类型是一个棘手的问题; NSData
可以编码任何类型的二进制数据。确定编码内容的唯一方法是检查字节。这反过来意味着要了解不同文件类型中存在的字节流。应该可以在许多(但不是全部)情况下使用查找字典,并且可能存在针对常见文件类型的开源实现。要了解所涉及的内容,请在Mac上尝试man file
并查看/usr/share/file/magic/
以查看如何识别各种文件类型(file
命令不会生成MIME类型但它会分析文件内容以尝试识别文件类型,因此原理相同。
答案 4 :(得分:0)
var values = [UInt8](重复:0,计数: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 ""
答案 5 :(得分:0)
基于接受的答案的快速解决方案:
import Foundation
extension Data {
var mimeType: String {
var byte: UInt8 = 0
copyBytes(to: &byte, count: 1)
switch byte {
case 0xFF:
return "image/jpeg"
case 0x89:
return "image/png"
case 0x47:
return "image/gif"
case 0x49, 0x4D :
return "image/tiff"
case 0x46:
return "text/plain"
case 0x25:
return "application/pdf"
case 0xD0:
return "application/vnd"
default:
return "application/octet-stream"
}
}
}
用法:
data.mimeType