2012-03-23 4 views

Répondre

0

Si vous voulez être absolument certain, il est préférable de vérifier le flux du HttpPostedFileBase pour les octets magiques. C'est parce que certaines applications peuvent l'écrire comme une extension que vous pensez pouvoir traiter (comme MP4), mais en réalité c'est un autre format comme M4V. Par exemple, pour vérifier si un flux est un flux de variation MP4, vous pouvez vérifier si le flux commence par les octets 0x00, 0x00, 0x00, 0x20, 0x66, 0x74, 0x79, 0x70, 0x6D, 0x70 et 0x34. Vous pouvez trouver plus de formats here.

Quelque chose comme cela peut fonctionner:

public static bool IsMP4(System.IO.Stream stream) 
{ 
    return HasMagicBytes(stream, 0, 0x00, 0x00, 0x00, 0x20, 0x66, 0x74, 0x79, 0x70, 0x6D, 0x70, 0x34); 
} 

public static bool HasMagicBytes (System.IO.Stream stream, int offset, params byte[] magicBytes) 
{ 
    try { 
     bool match = false; 
     byte[] bytes = new byte[magicBytes.Length]; 
     if (stream.Read (bytes, offset, magicBytes.Length) == magicBytes.Length) { 
      for (int i = 0; i < magicBytes.Length; i++) { 
       if (bytes [i] != magicBytes [i]) { 
        return false; 
       } 
      } 
      return true; 
     } else { 
      return false; 
     } 

    } finally { 
     stream.Seek (0, System.IO.SeekOrigin.Begin); 
    } 

} 

Certains précautions doivent être prises si le flux est positionnable. Cette technique est plutôt efficace pour les fichiers plus volumineux. Pour ce réutilisable, vous pouvez écrire un ValidationAttribute donc il peut être possible de définir votre modèle comme celui-ci:

public class MyModel 
{ 
    [CheckFormat(0x00, 0x00, 0x00, 0x20, 0x66, 0x74, 0x79, 0x70, 0x6D, 0x70, 0x34)] 
    public HttpPostedFileBase MyFile { get; set; } 
} 

Mais je vais laisser vous d'enquêter plus loin.

Questions connexes