Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Determine MIME type from NSData?

How would you determine the mime type for an NSData object? I plan to have the user to upload a video/picture from their iPhone and have that file be wrapped in a NSData class.

I was wondering if I can tell the mime type from the NSData. There are only a few answers to this question and the most recent one is from 2010 (4 years ago!). Thanks!

NSData *data; // can be an image or video NSString *mimeType = [data getMimetype]; // how would I implement getMimeType 
like image 979
blee908 Avatar asked Feb 14 '14 21:02

blee908


People also ask

How do I know my MIME type?

For detecting MIME-types, use the aptly named "mimetype" command. It has a number of options for formatting the output, it even has an option for backward compatibility to "file". But most of all, it accepts input not only as file, but also via stdin/pipe, so you can avoid temporary files when processing streams.

How do you specify the MIME type of a file?

Another way to get the MIME type of a file is by reading its content. We can determine the MIME type according to specific characteristics of the file content. For example, a JPG starts with the hex signature FF D8 and ends with FF D9.

Where is MIME type stored in a file?

All MIME type information is stored in a database. The MIME database is located in the directory /usr/share/mime/ . The MIME database contains a large number of common MIME types, stored in the file /usr/share/mime/packages/freedesktop.


1 Answers

Based on ml's answer from a similar post, I've added the mime types determination for NSData:

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

Swift:

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

This handle main file types only, but you can complete it to fit your needs: all the files signature are available here, just use the same pattern as I did.

PS: all the corresponding mime types are available here

like image 154
Tib Avatar answered Sep 18 '22 17:09

Tib