3

FileUploaderASP.NET C# Web ページでコントロールを使用してアップロードされたファイルのファイル タイプを確認するにはどうすればよいですか?

  1. Leonardo.jpgファイル拡張子を確認しようとしましたが、JPEG 画像 (例: ) が PDF の拡張子 (例: ) を持つように名前を変更すると、明らかに失敗しますLeonardo.pdf

  2. 私は試した

    FileUpload1.PostedFile.ContentType.ToLower().Equals("application/pdf")
    

    ただし、上記のコードは最初のコードと同じように動作するため、これは失敗します。

拡張子だけでなく、実際のファイルの種類を確認する他の方法はありますか?

拡張子に関係なくファイルタイプのタイプを確認する方法をASP.NETで調べました。

編集:スタックオーバーフローの投稿の1つから以下のコードを試しました。しかし、このダウンは機能しません。これについてのアイデア。

/// <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 | BindingFlags.Public));
}

/// <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 });
}
}
4

3 に答える 3

6

ファイル拡張子を使用して MIME タイプを計算しないでください。代わりに、バイナリ分析に「Winista」を使用してください。

誰かが に拡張子を付けて名前を変更したexeとします。jpg実際のファイル形式は引き続き判別できます。swf や flv は検出しませんが、他のほとんどすべての既知の形式を検出します。16 進エディタを使用して、検出できるファイルを追加できます。

Winista をダウンロード:ここまたは私のミラーまたは私の GitHub https://github.com/MeaningOfLights/MimeDetect

Winista が実際のファイル形式を検出できない場合、私は URLMon メソッドに頼りました。

public class urlmonMimeDetect
{
    [DllImport(@"urlmon.dll", CharSet = CharSet.Auto)]
    private extern static System.UInt32 FindMimeFromData(
        System.UInt32 pBC,
        [MarshalAs(UnmanagedType.LPStr)] System.String pwzUrl,
        [MarshalAs(UnmanagedType.LPArray)] byte[] pBuffer,
        System.UInt32 cbSize,
        [MarshalAs(UnmanagedType.LPStr)] System.String pwzMimeProposed,
        System.UInt32 dwMimeFlags,
        out System.UInt32 ppwzMimeOut,
        System.UInt32 dwReserverd
    );

public string GetMimeFromFile(string filename)
{
    if (!File.Exists(filename))
        throw new FileNotFoundException(filename + " not found");

    byte[] buffer = new byte[256];
    using (FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read))
    {
        if (fs.Length >= 256)
            fs.Read(buffer, 0, 256);
        else
            fs.Read(buffer, 0, (int)fs.Length);
    }
    try
    {
        System.UInt32 mimetype;
        FindMimeFromData(0, null, buffer, 256, null, 0, out mimetype, 0);
        System.IntPtr mimeTypePtr = new IntPtr(mimetype);
        string mime = Marshal.PtrToStringUni(mimeTypePtr);
        Marshal.FreeCoTaskMem(mimeTypePtr);
        return mime;
    }
    catch (Exception e)
    {
        return "unknown/unknown";
    }
}
}

Winista メソッド内から、次の URLMon にフォールバックします。

   public MimeType GetMimeTypeFromFile(string filePath)
    {
        sbyte[] fileData = null;
        using (FileStream srcFile = new FileStream(filePath, FileMode.Open, FileAccess.Read))
        {
            byte[] data = new byte[srcFile.Length];
            srcFile.Read(data, 0, (Int32)srcFile.Length);
            fileData = Winista.Mime.SupportUtil.ToSByteArray(data);
        }

        MimeType oMimeType = GetMimeType(fileData);
        if (oMimeType != null) return oMimeType;

        //We haven't found the file using Magic (eg a text/plain file)
        //so instead use URLMon to try and get the files format
        Winista.MimeDetect.URLMONMimeDetect.urlmonMimeDetect urlmonMimeDetect = new Winista.MimeDetect.URLMONMimeDetect.urlmonMimeDetect();
        string urlmonMimeType = urlmonMimeDetect.GetMimeFromFile(filePath);
        if (!string.IsNullOrEmpty(urlmonMimeType))
        {
            foreach (MimeType mimeType in types)
            {
                if (mimeType.Name == urlmonMimeType)
                {
                    return mimeType;
                }
            }
        }

        return oMimeType;
    }

アップデート:

ここでマジックを使用してより多くのファイルを作成するには、FILE SIGNATURES TABLEを使用します。

于 2012-09-16T05:08:32.713 に答える
-1

名前や拡張子を確認することは、決して信頼できる考えではありません。確認できる唯一の方法は、実際にファイルの内容を読むことです。

つまり、ファイルの画像をチェックしたい場合は、ファイルから画像を読み込んでみてください。失敗した場合は、それが画像ファイルではないことを確認できます。これは、GDI オブジェクトを使用して簡単に実行できます。

PDFファイルも同様です。

結論は、ユーザーが提供する名前や拡張子に依存しないことです。

于 2012-09-16T04:59:29.840 に答える
-2

FileApload でファイルタイプを確認するには、

ValidationExpression="^.+.(([pP][dD][fF])|([jJ][pP][gG])|([pP][nN][gG])))$"

例:Rarファイルタイプなどに([rR] [aA] [rR])を追加できます...

于 2013-11-09T11:38:56.270 に答える