Как я получаю тип MIME файла, требуемого в ASP.NET C#?

Понятие, что regex не поддерживает инверсию, соответствующую, не совсем верно. Можно подражать этому поведению при помощи отрицательного взгляда-arounds:

^((?!hede).)*$

regex выше будет соответствовать любой строке, или строка без разрыва строки, не содержащий (sub) представляет 'Эде' в виде строки. Как упомянуто, это не что-то, что regex "хорош" в (или должен сделать), но тем не менее, это возможно.

И если необходимо соответствовать символам разрыва строки также, используйте эти ТОЧКА - ВЕСЬ модификатор (запаздывание s в следующем шаблоне):

/^((?!hede).)*$/s

или использование это встраивает:

/(?s)^((?!hede).)*$/

(где эти /.../ regex разделители, т.е. не часть шаблона)

, Если ТОЧКА - ВЕСЬ модификатор не доступен, можно подражать тому же поведению с классом символов [\s\S]:

/^((?!hede)[\s\S])*$/

Объяснение

строка А является просто списком n символы. Прежде, и после каждого символа, существует пустая строка. Так список n символы будут иметь n+1 пустые строки. Рассмотрите строку "ABhedeCD":

    ┌──┬───┬──┬───┬──┬───┬──┬───┬──┬───┬──┬───┬──┬───┬──┬───┬──┐
S = │e1│ A │e2│ B │e3│ h │e4│ e │e5│ d │e6│ e │e7│ C │e8│ D │e9│
    └──┴───┴──┴───┴──┴───┴──┴───┴──┴───┴──┴───┴──┴───┴──┴───┴──┘

index    0      1      2      3      4      5      6      7

, где эти e пустые строки. regex (?!hede). смотрит вперед, чтобы видеть, нет ли никакой подстроки "hede", чтобы быть замеченной, и если это так (таким образом, что-то еще замечено), затем эти . (точка) будет соответствовать любому символу кроме разрыва строки. Взгляд-arounds также называют утверждения нулевой ширины , потому что они не делают , используют любые символы. Они только утверждают/проверяют что-то.

Так, в моем примере, каждая пустая строка сначала проверена, чтобы видеть, нет ли никакого "hede" вперед, прежде чем символ будет использован эти . (точка). regex (?!hede). сделает это только однажды, таким образом, он будет перенесен в группу и повторил нуль или больше раз: ((?!hede).)*. Наконец, запуск - и конец входа привязывается, чтобы удостовериться, что весь вход используется: ^((?!hede).)*$

, Как Вы видите, вход "ABhedeCD" перестанет работать, потому что на [1 122], сбои regex (?!hede) (там "hede" вперед!).

7
задан mkelley33 19 August 2009 в 20:00
поделиться

4 ответа

Сопоставления mime-типов .NET хранятся в классе System.Web.MimeMapping , который предлагает метод GetMimeMapping .

До. NET 4.5 этот класс был помечен как внутренний и поэтому недоступен для вашего кода. В этом случае лучшее, что вы можете сделать, это украсть список, который вы можете получить с помощью Reflector, и декомпилировать статический конструктор (cctor).

Если вы воспользуетесь этим подходом, вам может быть лучше просто создать список поддерживаемых расширений и их тип пантомимы и сохранение его в словаре. (Список внутри MimeMapping немного подробен)

11
ответ дан 6 December 2019 в 06:14
поделиться

Эта информация находится в реестре в HKEY_CLASSES_ROOT \ \ Content Type

using(var key = Registry.ClassesRoot.OpenSubKey(".htm"))
{
    string mimeType = key.GetValue("Content Type") as string;
}
1
ответ дан 6 December 2019 в 06:14
поделиться

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

Если вы сопоставите все запросы файлов с помощью настраиваемого IHttpHandler (см. раздел обработчиков вашего файла web.config), вы сможете это сделать.

In ProcessRequest (или BeginProcessRequest, если вы реализовать асинхронный обработчик), вы можете вызвать HttpContext.Current.Server.MapPath ("~" + HttpContext.Current.Request.Path) (может быть лучшим способом сделать это), чтобы получить текущий запрашиваемый статический файл.

Затем вы можете проанализировать расширение этого файла, чтобы принять решение.

0
ответ дан 6 December 2019 в 06:14
поделиться

Несколько месяцев назад у меня была похожая проблема, и я решил ее с помощью этого простого класса-оболочки вокруг System.Web.MimeMapping (как упомянул Ричард Салай):

/// <summary>
/// This class allows access to the internal MimeMapping-Class in System.Web
/// </summary>
class MimeMappingWrapper
{
    static MethodInfo getMimeMappingMethod;

    static MimeMappingWrapper() {
        // dirty trick - Assembly.LoadWIthPartialName has been deprecated
        Assembly ass = Assembly.LoadWithPartialName("System.Web");
        Type t = ass.GetType("System.Web.MimeMapping");

        getMimeMappingMethod = t.GetMethod("GetMimeMapping", BindingFlags.Static | BindingFlags.NonPublic);
    }

    /// <summary>
    /// Returns a MIME type depending on the passed files extension
    /// </summary>
    /// <param name="fileName">File to get a MIME type for</param>
    /// <returns>MIME type according to the files extension</returns>
    public static string GetMimeMapping(string fileName) {
        return (string)getMimeMappingMethod.Invoke(null, new[] { fileName });
    }
}
9
ответ дан 6 December 2019 в 06:14
поделиться
Другие вопросы по тегам:

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