2017-02-16 21 views
3

私はASP.NET Coreアプリケーションを持っており、アップロードされたファイルが画像であり、画像拡張子がない画像ファイルではないことを検証する必要があります。 私が見つけたすべてのソリューションは、System.Drawing.ImageまたはASP.NET Coreで利用できない類似のクラスを使用します。 代替案をご提案いただけますか? *拡張子を確認するのではなく、内容を確認しています。あなたがImageMagickのの特定のコマンドを使用することができ、サーバー上で実行可能ファイルを実行する権限を持っている場合ASP.Net CoreのIFormFileの画像タイプを確認してください

はあなたに

+0

http://stackoverflow.com/questions/3643750/net-image-libraries –

答えて

0

ありがとうございます。それは多くの仕事です。あなたは、サーバーにimagemagickをインストールする必要があり、実行可能ファイルを実行する権限を持っている必要があります。

https://www.imagemagick.org/script/identify.php

あなたがプログラムを呼び出すと、それに画像ファイルを与える必要があると思い

C#でexeファイルのファイルを呼び出す方法

https://msdn.microsoft.com/en-us/library/system.diagnostics.process.beginoutputreadline(v=vs.110).aspx

:プロセスの出力を読み取る方法 https://msdn.microsoft.com/en-us/library/0w4h05yb(v=vs.110).aspx

+0

私は本当にC#のコードで道が必要です.... – Techy

-1

これはpostを確認できます。私は試しました..

 // declare FindMimeFromData from urlmon.dll 
    [DllImport(@"urlmon.dll", CharSet = CharSet.Unicode)] 
    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.IntPtr ppwzMimeOut, 
    System.UInt32 dwReserverd 
    ); 


    // you can return boolen value if mime type is not image 
    public static string getMimeFromFile(IFormFile file) 
    { 


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

    [HttpGet] 
    public ActionResult Test() 
    { 

     ViewData["Message"] = "Your test page."; 
     return View(); 
    } 

    [HttpPost] 
    public ActionResult Test(IFormFile file) 
    { 
     string mimeType = getMimeFromFile(file); 
     ViewData["Message"] = mimeType; 
     return View(); 
    } 

とTest.cshtml

<h3>@ViewData["Message"]</h3> 
<form action="/Home/Test" method="post" enctype="multipart/form-data"> 

    <input name="file" type="File"> <br> 
    <input type="submit" value="submit"> 

</form> 

UPDATE:

あなたはthisをチェックし、クロスプラットフォーム用のDLLのインポートを使用している場合カント。 hereから新しいMIMEタイプを追加できます。

+0

あなたが別の質問への回答によって答えられると信じる場合、その質問からの答えをコピーするのではなく、代わりにこの質問に重複してフラグを立てる。しかし、これはASP.NET Coreについてです。その前提は、どのランタイムでも実行できるということです。 Platform Invokeを含めることによって、あなたはそれを否定します。 – CodeCaster

+0

@CodeCasterそのコピー・ペーストではありません。 plsはそれについて話す前にコードを読む – levent

+0

私はすべての画像を受け入れるために必要です – Techy

関連する問題