Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get MIME type from filename in C

Tags:

mime-types

c

unix

I want to get the MIME type from a filename using C. Is there a way to do this without using a textfile containing MIME types and file extensions (i.e. Apache's file mime.types)?

Maybe there is a function to get the MIME type using the filename? I rather not use the file extension if I don't have to.

like image 939
Göran Lilja Avatar asked Jan 08 '09 08:01

Göran Lilja


2 Answers

If there was a way to do it, Apache wouldn't need its mime.types file!

The table has to be somewhere. It's either in a separate file which is parsed by your code, or it's hard coded into your software. The former is clearer the better solution...

It's also possible to guess at the MIME type of a file by examining the content of the file, i.e. header fields, data structures, etc. This is the approach used by the file(1) program and also by Apache's mod_mime_magic. In both cases they still use a separate text file to store the lookup rules rather than have any details hard-coded in the program itself.

like image 168
Alnitak Avatar answered Oct 10 '22 16:10

Alnitak


I just implemented this for a project on which I'm working. libmagic is what you're looking for. On RHEL/CentOS its provided by file-libs and file-devel. Debian/Ubuntu appears to be libmagic-dev.

http://darwinsys.com/file/

Here's some example code:

#include <stdio.h>
#include <magic.h>

int main(int argc, char **argv){
  const char *mime;
  magic_t magic;

  printf("Getting magic from %s\n", argv[1]);

  magic = magic_open(MAGIC_MIME_TYPE); 
  magic_load(magic, NULL);
  magic_compile(magic, NULL);
  mime = magic_file(magic, argv[1]);

  printf("%s\n", mime);
  magic_close(magic);

  return 0;
}

The code below uses the default magic database /usr/share/misc/magic. Once you get the dev packages installed, the libmagic man page is pretty helpful. I know this is an old question, but I found it on my hunt for the same answer. This was my preferred solution.

like image 25
Brian Lindblom Avatar answered Oct 10 '22 18:10

Brian Lindblom