Eu estou procurando uma maneira simples de obter um tipo MIME onde a extensão do arquivo está incorreta ou não foi fornecida, algo semelhante a esta pergunta apenas no .Net.
c#
mime
mime-types
Richard Gourlay
fonte
fonte
Respostas:
No Urlmon.dll, há uma função chamada
FindMimeFromData
.A partir da documentação
Portanto, leia os primeiros (até) 256 bytes do arquivo e passe-o para
FindMimeFromData
.fonte
Eu usei urlmon.dll no final. Eu pensei que haveria uma maneira mais fácil, mas isso funciona. Incluo o código para ajudar outras pessoas e permite que eu o encontre novamente, se necessário.
...
fonte
Eu encontrei uma solução codificada, espero ajudar alguém:
fonte
StringComparer.OrdinalIgnoreCase
o construtor de dicionário. A comparação ordinal é mais rápida que a invariável, e você se livra.ToLower()
e suas variações.Edit: Basta usar Mime Detective
Eu uso seqüências de matriz de bytes para determinar o tipo MIME correto de um determinado arquivo. A vantagem disso é apenas olhar para a extensão do nome do arquivo e se um usuário renomear um arquivo para ignorar certas restrições de upload de tipo de arquivo, a extensão do nome do arquivo falharia em capturar isso. Por outro lado, obter a assinatura do arquivo via matriz de bytes impedirá que esse comportamento malicioso aconteça.
Aqui está um exemplo em C #:
Observe que eu lidei com os tipos de arquivos DOCX de maneira diferente, pois o DOCX é realmente apenas um arquivo ZIP. Nesse cenário, basta verificar a extensão do arquivo depois de verificar se ela possui essa sequência. Este exemplo está longe de ser completo para algumas pessoas, mas você pode facilmente adicionar o seu.
Se você deseja adicionar mais tipos MIME, pode obter as seqüências de matriz de bytes de muitos tipos diferentes de arquivos aqui . Além disso, aqui está outro bom recurso sobre assinaturas de arquivo.
O que faço muitas vezes, se tudo mais falhar, é percorrer vários arquivos de um tipo específico que estou procurando e procurar um padrão na sequência de bytes dos arquivos. No final, ainda é uma verificação básica e não pode ser usada para 100% de prova da determinação de tipos de arquivos.
fonte
Se você estiver usando o .NET Framework 4.5 ou superior, agora existe um método MimeMapping.GetMimeMapping (filename) que retornará uma seqüência de caracteres com o mapeamento Mime correto para o nome do arquivo passado. Observe que isso usa a extensão do arquivo, não os dados no próprio arquivo.
A documentação está em http://msdn.microsoft.com/en-us/library/system.web.mimemapping.getmimemapping
fonte
var mimetype = System.Web.MimeMapping.GetMimeMapping(<pathToFile>);
Você também pode procurar no registro.
De uma maneira ou de outra, você terá que acessar um banco de dados de MIMEs - se elas são mapeadas a partir de extensões ou números mágicos é algo trivial - o registro do Windows é um desses locais. Para uma solução independente de plataforma, seria necessário enviar esse banco de dados com o código (ou como uma biblioteca autônoma).
fonte
Eu uso uma solução híbrida:
fonte
.doc
arquivo.HeyRed.Mime.MimeGuesser.GuessMimeType
da Nuget seria a melhor solução se você deseja hospedar sua solução ASP.NET em ambientes não Windows.O mapeamento de extensão de arquivo é muito inseguro. Se um invasor carregasse extensões inválidas, um dicionário de mapeamento permitiria, por exemplo, que os executáveis fossem distribuídos dentro dos arquivos .jpg. Portanto, sempre use uma biblioteca de detecção de conteúdo para conhecer o tipo de conteúdo real.
fonte
Eu acho que a resposta certa é uma combinação das respostas de Steve Morgan e Serguei. É assim que o Internet Explorer faz isso. A chamada pinvoke
FindMimeFromData
funciona para apenas 26 tipos MIME codificados. Além disso, fornecerá tipos mímicos ambíguos (comotext/plain
ouapplication/octet-stream
), mesmo que exista um tipo de mime mais específico e mais apropriado. Se ele não fornecer um bom tipo de MIME, você poderá acessar o Registro para obter um tipo de MIME mais específico. O registro do servidor pode ter tipos MIME mais atualizados.Consulte: http://msdn.microsoft.com/en-us/library/ms775147(VS.85).aspx
fonte
Esta classe usa respostas anteriores para tentar de três maneiras diferentes: codificado com base na extensão, API FindMimeFromData e uso do registro.
fonte
Eu achei este útil. Para desenvolvedores do VB.NET:
fonte
Me deparei com o mesmo problema e, eventualmente, optei pelo meu próprio sabor da solução de Kirk Baucom, encontrada aqui .
Parece-me que esta é uma oportunidade para alguém escrever um serviço de pesquisa on-line.
Enfim, espero que ajude.
fonte
Se alguém o aceitasse, poderia portar o excelente módulo perl File :: Type para o .NET. No código, há um conjunto de pesquisas de número mágico do cabeçalho do arquivo para cada tipo de arquivo ou correspondência de regex.
Aqui está uma biblioteca de detecção de tipo de arquivo .NET http://filetypedetective.codeplex.com/, mas ele detecta apenas um número pequeno de arquivos no momento.
fonte
Esta resposta é uma cópia da resposta do autor (Richard Gourlay), mas foi aprimorada para resolver problemas no IIS 8 / win2012 (onde a função causaria falha no pool de aplicativos), com base no comentário de Rohland apontando para http://www.pinvoke.net /default.aspx/urlmon.findmimefromdata
...
fonte
@ Steve Morgan e @ Richard Gourlay, essa é uma ótima solução, obrigado por isso. Uma pequena desvantagem é que, quando o número de bytes em um arquivo é 255 ou menos, o tipo MIME às vezes gera "application / octet-stream", que é um pouco impreciso para arquivos que se espera que produzam "texto / sem formatação". Atualizei seu método original para explicar essa situação da seguinte maneira:
Se o número de bytes no arquivo for menor ou igual a 255 e o tipo de mímica deduzido for "application / octet-stream", crie uma nova matriz de bytes que consiste nos bytes do arquivo original repetidos n-vezes até o número total de bytes é> = 256. Em seguida, verifique novamente o tipo MIME nessa nova matriz de bytes.
Método modificado:
fonte
IIS 7 ou mais
Use esse código, mas você precisa ser o administrador no servidor
fonte
Ao trabalhar com a função Web do Windows Azure ou qualquer outro host que execute seu aplicativo no Limited Trust, não esqueça que você não terá permissão para acessar o registro ou o código não gerenciado. Abordagem híbrida - a combinação de try-catch-for-registry e dicionário na memória parece uma boa solução que tem um pouco de tudo.
Eu uso esse código para fazer isso:
fonte
Acabei usando o Winista MimeDetector da Netomatix. As fontes podem ser baixadas gratuitamente depois que você criou uma conta: http://www.netomatix.com/Products/DocumentManagement/MimeDetector.aspx
Isso faz parte de outra pergunta respondida aqui: Alternativa ao método FindMimeFromData no Urlmon.dll, que possui mais tipos MIME A melhor solução para esse problema, na minha opinião.
fonte
Encontrei vários problemas ao executar este código:
Se você tentar executá-lo com o x64 / Win10, receberá
Graças a este post, o PtrToStringUni não funciona no Windows 10 e @xanatos
Modifiquei minha solução para executar em x64 e .NET Core 2.1:
obrigado
fonte
Olá, eu adaptei o projeto Winista.MimeDetect no .net core / framework com fallback no urlmon.dll Sinta-se livre para usá-lo: pacote nuget .
fonte
mimeTypes.GetMimeTypeFromFile(bytes);
Eu escrevi um validador do tipo mime. Por favor, compartilhe com você.
fonte