173

Is there a way to find out the MIME type (or is it called "Content-Type"?) of a file in a Linux bash script?

The reason I need it is because ImageShack appears to need it to upload a file, as for some reason it detects the .png file as an application/octet-stream file.

I’ve checked the file, and it really is a PNG image:

$ cat /1.png 
?PNG
(with a heap load of random characters)

This gives me the error:

$ curl -F "fileupload=@/1.png" http://www.imageshack.us/upload_api.php
<links>
<error id="wrong_file_type">Wrong file type detected for file 1.png:application/octet-stream</error>
</links>

This works, but I need to specify a MIME-TYPE.

$ curl -F "fileupload=@/1.png;type=image/png" http://www.imageshack.us/upload_api.php
Benjamin Loison
  • 3,782
  • 4
  • 16
  • 33
Mint
  • 14,388
  • 30
  • 76
  • 108

6 Answers6

333

Use file. Examples:

> file --mime-type image.png
image.png: image/png

> file -b --mime-type image.png
image/png

> file -i FILE_NAME
image.png: image/png; charset=binary
jozxyqk
  • 16,424
  • 12
  • 91
  • 180
bhups
  • 14,345
  • 8
  • 49
  • 57
35

one of the other tool (besides file) you can use is xdg-mime

eg xdg-mime query filetype <file>

if you have yum,

yum install xdg-utils.noarch

An example comparison of xdg-mime and file on a Subrip(subtitles) file

$ xdg-mime query filetype subtitles.srt
application/x-subrip

$ file --mime-type subtitles.srt
subtitles.srt: text/plain

in the above file only show it as plain text.

MayeulC
  • 1,628
  • 17
  • 24
ghostdog74
  • 327,991
  • 56
  • 259
  • 343
  • xdg-mime query filetype install.sql; xprop: unable to open display '' – a coder Oct 09 '12 at 12:42
  • 1
    xdg-mime is a bash script an relies heavily on environment variables. Some of them e.g. DE are not set if you are not logged into a session. Check it out yourself `$ less $(which xdg-mime)` – ManuelSchneid3r Sep 08 '14 at 23:32
12

file version < 5 : file -i -b /path/to/file
file version >=5 : file --mime-type -b /path/to/file

Andrey
  • 307
  • 4
  • 5
7

Try the file command with -i option.

-i option Causes the file command to output mime type strings rather than the more traditional human readable ones. Thus it may say text/plain; charset=us-ascii rather than ASCII text.

codaddict
  • 445,704
  • 82
  • 492
  • 529
2

file --mime works, but not --mime-type. at least for my RHEL 5.

fanchyna
  • 2,623
  • 7
  • 36
  • 38
1

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.

foo
  • 1,968
  • 1
  • 23
  • 35