2014-10-01 3 views
10

Javascript (Windows 8.1, Firefox), похоже, не имеет типов mime для файлов .tar или .rar-файлов (и, возможно, других, это только те, которые я нашел) , Что с этим? Есть ли что-нибудь, что я могу использовать для решения этой проблемы? Мне бы очень хотелось, чтобы вы могли получать типы mime для этих типов файлов, не делая какого-то необычного взлома.Mime type отсутствует для .rar и .tar

Я сделал скрипку, чтобы доказать вопрос: http://jsfiddle.net/kungfujoe/jd8h7wvs/

При просмотре в формате .txt или .docx, или многих других форматов, тип успешно тянул. Однако оба .tar и .rar не тянут их. Странно, правда?

(JSFiddle код ниже)

HTML

<input id='button' type='file' name='file'/> 
<div id='out'>Output Goes Here</div> 

Javascript (с помощью JQuery 2.1.0)

$('#button').unbind('change'); 
$('#button').bind('change', function() { 
    if(this.files[0] !== undefined && this.files[0] !== null) { 
     document.getElementById("out").innerHTML = "Type is " + this.files[0].type.toString();   
    } else { 
     throw "Error" 
    } 
}); 

Благодаря

EDIT

1) Обновленный вопрос, чтобы отразить, что проблема была обнаружена в Windows 8.1 Firefox. У Chrome есть тип mime для файлов tar, но не rar-файлов.

2) Добавлена ​​Jquery к Скрипке

+2

Вы не добавили jQuery к своей скрипке. Подтверждено, что вы не работаете с файлами tar. – DanFromGermany

+1

В какой операционной системе вы работаете? Возможно, браузер разрешает операционной системе разрешать тип mime, или нет никакой ассоциации в конфигурации браузера между этим расширением файла и типом MIME. Попробуйте настроить браузер, чтобы узнать, какая внешняя программа должна открыть .tar или .rar. Может быть, это поможет? –

+1

Это нормально для rar и tar, он возвращает: Type - это приложение/x-rar (или x-tar) в Mac OS/Chrome. На какой ОС/браузер вы его тестируете? – enguerranws

ответ

11

JQuery просто оборачивает базовый API файла, используемый в большинстве браузеров, так что нет никакой разницы, как JQuery и Javascript обрабатывать файлы и типы MIME. Вот Файл API спецификации:

http://www.w3.org/TR/FileAPI/#dfn-type

File объект, который вы манипулируете наследует типа свойство из Blob объекта, а браузер использует блоб (массив байтов), чтобы определить тип MIME.

Для выполнения этой задачи каждый браузер реализует алгоритм обнюхивания файлов для «чтения» типа mime из массива байтов, и если тип mime не совпадает, он возвращает пустую строку, как в приведенном выше примере.

Вот полный алгоритм спецификации:

https://mimesniff.spec.whatwg.org/

Итак, теперь вы задаетесь вопросом, почему это не работает для TAR, ZIP и RAR-файлов, и почему это работает для некоторых людей, а не для вы? .. потому что алгоритм обнюхивания файлов, очевидно, не идеален.

Он использует байт, соответствующий, и это кажется недостаточно надежным.

Например я использовал WinRaR на моих окнах 8 флажок, чтобы сжать файл, и начальные байты созданного файла являются:

52 61 72 21 1A 07 00

Однако, чтобы признать его.RAR согласующего браузера байты шаблона алгоритм ожидает

52 61 72 20 1A 07 00

Как вы видите, есть небольшая разница, и когда я загрузил свой файл RAR в браузер, используя код выше, Firefox не смог распознать Мим -Type, и я получил пустую строку в свойстве type.

Однако, когда я упаковал ZIP-файл с использованием WinRar на том же компьютере с настройками по умолчанию, он генерирует начальную последовательность байтовых массивов 50 4B 03 04, которая соответствует шаблону zip-байта, ожидаемому алгоритмом, и когда я использовал ваш код над ним смог правильно определить тип мим как application/zip!

Как вы видите из моего объяснения, это вопрос сериализации и «несовершенства» алгоритма, который соответствует сериализованным байтам с расширениями mime в браузерах.

Основываясь на всем упомянутом выше, я бы рекомендовал НЕ полагаться на обнюхивание мим, а вместо этого использовать свой собственный код для определения типа mime или существующих библиотек. Вы можете использовать серверный или клиентский подход.

Если вы хотите придерживаться клиента вы можете использовать следующую JS библиотеку:

https://github.com/rsdoiel/mimetype-js

А потом открывают для себя тип пантомимы будет делом одной строки кода:

Вот рабочие Скрипки, модернизируя свой пример, чтобы использовать MIMETYPE ЯША:

http://jsfiddle.net/jd8h7wvs/4/

+1

Просто добавьте, если это неясно: «mimetype.js» - простая таблица поиска. Он работает на основе расширения файла и поиска в каталоге соответствующего типа. – Academia

+0

Фантастический. Это именно то, что я искал. Щедрость - это все твоя (и это заслуга, если я так говорю). –

+0

... через 16 часов (я добавлю его в список дел) –