Как File api определяет тип mime файла? [Дубликат]

Самый простой способ - использовать файл * .ui непосредственно в коде python, вам не нужно конвертировать в * .py-файл каждый раз, когда вы меняете ui. вы можете использовать этот псевдо-код в своем проекте.

# imports
from PyQt5 import uic

# load ui file
baseUIClass, baseUIWidget = uic.loadUiType("MainGui.ui")

# use loaded ui file in the logic class
class Logic(baseUIWidget, baseUIClass):
    def __init__(self, parent=None):
        super(Logic, self).__init__(parent)
        self.setupUi(self)
         .
         .
         .
         .

def main():
    app = QtWidgets.QApplication(sys.argv)
    ui = Logic(None)
    ui.showMaximized()
    sys.exit(app.exec_())
66
задан MPelletier 30 April 2012 в 01:53
поделиться

6 ответов

Chrome

Chrome (версия 38 с момента написания) имеет 3 способа определить тип MIME и делает это в определенном порядке. Ниже приведен фрагмент из файла src/net/base/mime_util.cc, метода MimeUtil::GetMimeTypeFromExtensionHelper.

// We implement the same algorithm as Mozilla for mapping a file extension to
// a mime type.  That is, we first check a hard-coded list (that cannot be
// overridden), and then if not found there, we defer to the system registry.
// Finally, we scan a secondary hard-coded list to catch types that we can
// deduce but that we also want to allow the OS to override.

Жестко кодированные списки идут немного раньше в файле: https://cs.chromium.org /chromium/src/net/base/mime_util.cc?l=170 (kPrimaryMappings и kSecondaryMappings).

Пример: при загрузке CSV-файла из системы Windows с Microsoft Excel установлен, Chrome сообщит об этом как application/vnd.ms-excel. Это связано с тем, что .csv не указан в первом жестко запрограммированном списке, поэтому браузер возвращается в системный реестр. HKEY_CLASSES_ROOT\.csv имеет значение с именем Content Type, которое установлено на application/vnd.ms-excel.

Internet Explorer

Снова используя тот же пример, браузер сообщит application/vnd.ms-excel. Я думаю, что разумно предположить, что Internet Explorer (версия 11 по записи) использует реестр. Возможно, он также использует жесткий список, такой как Chrome и Firefox, но его закрытая природа источника затрудняет проверку.

Firefox

Как указано в коде Chrome, Firefox (версия 32 с момента написания) работает аналогичным образом. Фрагмент из файла uriloader\exthandler\nsExternalHelperAppService.cpp, метод nsExternalHelperAppService::GetTypeFromExtension

// OK. We want to try the following sources of mimetype information, in this order:
// 1. defaultMimeEntries array
// 2. User-set preferences (managed by the handler service)
// 3. OS-provided information
// 4. our "extras" array
// 5. Information from plugins
// 6. The "ext-to-type-mapping" category

Жестко закодированные списки появляются раньше в файле, где-то рядом с линией 441. Вы ищете defaultMimeEntries и extraMimeEntries.

С моим текущим профилем браузер сообщает text/csv, потому что в нем есть запись в mimeTypes.rdf (пункт 2 в списке выше). С новым профилем, который не имеет этой записи, браузер сообщает application/vnd.ms-excel (пункт 3 в списке).

Резюме

Жестко кодированные списки в браузерах довольно ограничены. Часто тип MIME, отправленный браузером, будет сообщен ОС. И именно поэтому, как указано в вопросе, тип MIME, о котором сообщает браузер, является ненадежным.

45
ответ дан Boris 26 August 2018 в 11:23
поделиться

Хотя это не ответ на ваш вопрос, он решает проблему, которую вы пытаетесь решить. YMMV.

Как вы писали, тип mime не является надежным, так как каждый браузер имеет свой способ его определения. Однако браузеры отправляют исходное имя (включая расширение) файла. Поэтому лучший способ справиться с этой проблемой - проверить расширение файла вместо MIME-типа.

Если вам все еще нужен тип mime, вы можете использовать mime.types вашего apache для определения его на стороне сервера.

4
ответ дан johndodo 26 August 2018 в 11:23
поделиться

Кип, я некоторое время читал RFC, MSDN и MDN. Вот что я мог понять. Когда браузер встречает файл для загрузки, он смотрит на первый буфер данных, который он получает, а затем запускает на нем тест. Эти тесты пытаются определить, является ли файл известным типом mime или нет, и если известен тип mime, он просто будет дополнительно тестировать его, для которого известен тип mime, и принять соответствующие меры. Я думаю, что IE пытается сделать это сначала, а не просто определять тип файла из расширения. Эта страница объясняет это для IE http://msdn.microsoft.com/en-us/library/ms775147%28v=vs.85%29.aspx . Для firefox я понял, что он пытается прочитать информацию о файле из файловой системы или записи в каталоге, а затем определяет тип файла. Вот ссылка для FF https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIFile . Я все еще хотел бы получить более авторитетную информацию об этом.

10
ответ дан Kumar 26 August 2018 в 11:23
поделиться

Это, вероятно, ОС и, возможно, зависит от браузера, но в Windows тип MIME для данного расширения файла можно найти, посмотрев в реестре под HKCR:

Например:

HKEY_CLASSES_ROOT.zip - ContentType

Чтобы перейти от MIME к расширению файла, вы можете посмотреть ключи в разделе

HKEY_CLASSES_ROOT \ Mime \ Database \ Content Type

] Чтобы получить расширение по умолчанию для определенного типа MIME.

5
ответ дан Michael A. McCloskey 26 August 2018 в 11:23
поделиться

Я согласен с johndodo, существует так много переменных, которые делают типы mime, которые отправляются из браузеров ненадежными. Я бы исключил подтипы, которые были получены, и просто сосредоточиться на типе типа «приложение». если ваше приложение основано на php, вы можете легко сделать это, используя функцию explode (). кроме того, просто проверьте расширение файла, чтобы убедиться, что это .zip или любое другое сжатие, которое вы ищете!

0
ответ дан Seul Shahkee 26 August 2018 в 11:23
поделиться

Согласно rfc1867 - Загрузка файла на основе формы в HTML :

Каждая часть должна быть помечена соответствующим типом контента, если известен тип носителя ( например, выводится из информации о расширении файла или операционной системы) или в качестве потока приложений / октетов.

Итак, я понимаю, application/octet-stream является своего рода идентификатором blanket catch-all, если тип не может быть выведен .

0
ответ дан smwikipedia 26 August 2018 в 11:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: