今天和大家一起來討論一下在上傳文件之前如何獲取文件的MIMEType席函,有疏忽的地方,還望各位不吝賜教彰檬。
一盏触、啥是MIMEType
MIME (Multipurpose Internet Mail Extensions) 是描述消息內(nèi)容類型的因特網(wǎng)標(biāo)準(zhǔn),說白了也就是文件的媒體類型贮尉。瀏覽器可以根據(jù)它來區(qū)分文件拌滋,然后決定什么內(nèi)容用什么形式來顯示。
部分文件的MIMEType
/*
* 文件拓展名 : MIMEType
* png : image/png
* bmp\dib : image/bmp
* jpg\jpeg\jpg : image/ipeg
* gif : image/gif
* mp3 : audio/mpeg
* mp4\mpg4\m4v\mp4v : video/mp4
* js : application/javascript
* pdf : application/pdf
* text\txt : text/plan
* json : application/json
* xml : text/xml
*/
二猜谚、為啥要獲取MIMEType
關(guān)于為什么要獲取MIMEType的原因败砂,是因?yàn)樵谶M(jìn)行文件上傳的時(shí)候,需要在POST請(qǐng)求體中傳遞相應(yīng)的參數(shù)魏铅,來進(jìn)行文件的上傳操作昌犹,關(guān)于文件的上傳會(huì)在稍后的文章里做詳細(xì)闡述。
說明:當(dāng)然你也可以直接傳遞application/octet-stream览芳,此參數(shù)表示通用的二進(jìn)制類型斜姥。
三、咋獲取MIMEType
1沧竟、借助百度就不說了铸敏,搜一搜就出來了,這里要說的是你可以向這個(gè)文件發(fā)個(gè)請(qǐng)求悟泵,來進(jìn)行獲取MIMEType的操作杈笔。
/*
* 第一種方式獲得MIMEType
* 說明:
* 1、你可以將此方法寫成分類糕非,以便今后方便使用蒙具。
* 2、這里請(qǐng)求的方式我采用的是NSURLConnection的方式發(fā)送的請(qǐng)求朽肥,大家可以采取其他的方式禁筏,在iOS7.0之后本方式已經(jīng)棄用了。
* 參數(shù)解釋:
* path : 文件的路徑衡招。
*/
- (void)getMimeType:(NSString *)path{
// 創(chuàng)建URL
NSURL *url = [NSURL fileURLWithPath:path];
// 創(chuàng)建請(qǐng)求對(duì)象
NSURLRequest *request = [NSURLRequest requestWithURL:url];
// 發(fā)送異步請(qǐng)求 在請(qǐng)求的
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
NSLog(@"%@",response.MIMEType);
}];
}
2篱昔、第二種方式是采用C語言庫的方式進(jìn)行獲取,在AFNetworing第三方框架里發(fā)現(xiàn)的蚁吝。
/*
* 第二種方式獲得MIMEType
* 說明:
* 1旱爆、這種方式使用了C語言的API進(jìn)行實(shí)現(xiàn)的舀射,要使用它窘茁,首先要引入入 <MobileCoreServices/MobileCoreServices.h>這個(gè)庫。
* 2脆烟、相關(guān)的使用在AFURLRequestSerialization.m文件中山林,在此框架中采用的是內(nèi)聯(lián)函數(shù)的方式進(jìn)行描述的。關(guān)于內(nèi)聯(lián)函數(shù),讀者請(qǐng)先自行百度驼抹。
* 參數(shù)解釋:
* extension : 這個(gè)是文件的拓展名桑孩。
*/
// 方法實(shí)現(xiàn)
static inline NSString * AFContentTypeForPathExtension(NSString *extension) {
NSString *UTI = (__bridge_transfer NSString *)UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (__bridge CFStringRef)extension, NULL);
NSString *contentType = (__bridge_transfer NSString *)UTTypeCopyPreferredTagWithClass((__bridge CFStringRef)UTI, kUTTagClassMIMEType);
if (!contentType) {
return @"application/octet-stream";
} else {
return contentType;
}
}
// 方法調(diào)用 打印為 image/png
AFContentTypeForPathExtension(@"png");
-----------------------------------------------------------------華麗麗的分割線------------------------------------------------------------------
/*
* 說明:
* 1、知道了這個(gè)函數(shù)是如何使用的之后我們可以進(jìn)行相關(guān)改造框冀,使其更方便的使用流椒。
* 2、這里傳入文件的路徑會(huì)自動(dòng)截取,并且添加了相關(guān)的過濾條件明也,這里的參數(shù)和方式一中的相同宣虾。
*/
// 方法實(shí)現(xiàn)
- (NSString *)mimeTypeForFileAtPath:(NSString *)path
{
// 這里使用文件管理者的相關(guān)方法判斷文件路徑是否有后綴名
if (![[[NSFileManager alloc] init] fileExistsAtPath:path]) {
return nil;
}
// [path pathExtension] 獲得文件的后綴名 MIME類型字符串轉(zhuǎn)化為UTI字符串
CFStringRef UTI = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (__bridge CFStringRef)[path pathExtension], NULL);
// UTI字符串轉(zhuǎn)化為后綴擴(kuò)展名
CFStringRef MIMEType = UTTypeCopyPreferredTagWithClass (UTI, kUTTagClassMIMEType);
CFRelease(UTI);
// application/octet-stream,此參數(shù)表示通用的二進(jìn)制類型温数。
if (!MIMEType) {
return @"application/octet-stream";
}
return (__bridge NSString *)(MIMEType);
}
// 方法調(diào)用 打印為image/png
[self mimeTypeForFileAtPath:@"/Users/Desktop/icon.png"]