2009-03-27 4 views
11

私のWPFアプリケーションは... Microsoft.Win32.OpenFileDialog()を持つユーザーから.NETでファイルのコンテンツタイプを特定するにはどうすればよいですか?

Private Sub ButtonUpload_Click(...) 
    Dim FileOpenStream As Stream = Nothing 
    Dim FileBox As New Microsoft.Win32.OpenFileDialog() 
    FileBox.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) 
    FileBox.Filter = "Pictures (*.jpg;*.jpeg;*.gif;*.png)|*.jpg;*.jpeg;*.gif;*.png|" & _ 
        "Documents (*.pdf;*.doc;*.docx;)|*.pdf;*.doc;*.docx;|" & _ 
        "All Files (*.*)|*.*" 
    FileBox.FilterIndex = 1 
    FileBox.Multiselect = False 
    Dim FileSelected As Nullable(Of Boolean) = FileBox.ShowDialog(Me) 
    If FileSelected IsNot Nothing AndAlso FileSelected.Value = True Then 
     Try 
      FileOpenStream = FileBox.OpenFile() 
      If (FileOpenStream IsNot Nothing) Then 
       Dim ByteArray As Byte() 
       Using br As New BinaryReader(FileOpenStream) 
        ByteArray = br.ReadBytes(FileOpenStream.Length) 
       End Using 
       Dim z As New ZackFile 
       z.Id = Guid.NewGuid 
       z.FileData = ByteArray 
       z.FileSize = CInt(ByteArray.Length) 
       z.FileName = FileBox.FileName.Split("\").Last 
       z.DateAdded = Now 
       db.AddToZackFile(z) 
       db.SaveChanges() 
      End If 
     Catch Ex As Exception 
      MessageBox.Show("Cannot read file from disk. " & Ex.Message, "Fail", MessageBoxButton.OK, MessageBoxImage.Error) 
     Finally 
      If (FileOpenStream IsNot Nothing) Then 
       FileOpenStream.Close() 
      End If 
     End Try 
    End If 
End Sub 

をファイルを取得し、私のASP.NET MVCアプリケーションはFileStreamResultを使用したWebサイトでダウンロードのためにそれをお楽しみいただけます()。 ..

Public Class ZackFileController 
    Inherits System.Web.Mvc.Controller 

    Function Display(ByVal id As Guid) As FileStreamResult 
     Dim db As New EfrDotOrgEntities 
     Dim Model As ZackFile = (From z As ZackFile In db.ZackFile _ 
           Where z.Id = id _ 
           Select z).First 
     Dim ByteArray As Byte() = Model.ImageData 
     Dim FileStream As System.IO.MemoryStream = New System.IO.MemoryStream(ByteArray) 
     Dim ContentType As String = ????? 
     Dim f As New FileStreamResult(FileStream, ContentType) 
     f.FileDownloadName = Model.FileName 
     Return f 
    End Function 

End Class 

しかし、FileStreamResult()にはコンテンツタイプ文字列が必要です。ファイルの正しいコンテンツタイプを知るにはどうすればよいですか?

+0

が見つかりませんか? – shahkalpesh

+0

ページがありません。これはASP.NET MVCコントローラクラスです。表示はビューの1つです。しかし、このViewはViewResultではなくFileStreamResultを返すため、ASPXページはありません。 –

答えて

15

私はContentTypeを柱と私のデータベーステーブルのFileExtension列を交換しました。

ファイルをアップロードするときに入力します。

Private Sub ButtonUpload_Click(...) 
    ... 
    Dim FileExtension As String = "." + FileBox.FileName.Split(".").Last.ToLower 
    z.ContentType = ContentType(FileExtension) 
    ... 
End Sub 

私はこの機能を備えたコンテンツタイプを決定:

Function ContentType(ByVal FileExtension As String) As String 
    Dim d As New Dictionary(Of String, String) 
    'Images' 
    d.Add(".bmp", "image/bmp") 
    d.Add(".gif", "image/gif") 
    d.Add(".jpeg", "image/jpeg") 
    d.Add(".jpg", "image/jpeg") 
    d.Add(".png", "image/png") 
    d.Add(".tif", "image/tiff") 
    d.Add(".tiff", "image/tiff") 
    'Documents' 
    d.Add(".doc", "application/msword") 
    d.Add(".docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document") 
    d.Add(".pdf", "application/pdf") 
    'Slideshows' 
    d.Add(".ppt", "application/vnd.ms-powerpoint") 
    d.Add(".pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation") 
    'Data' 
    d.Add(".xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") 
    d.Add(".xls", "application/vnd.ms-excel") 
    d.Add(".csv", "text/csv") 
    d.Add(".xml", "text/xml") 
    d.Add(".txt", "text/plain") 
    'Compressed Folders' 
    d.Add(".zip", "application/zip") 
    'Audio' 
    d.Add(".ogg", "application/ogg") 
    d.Add(".mp3", "audio/mpeg") 
    d.Add(".wma", "audio/x-ms-wma") 
    d.Add(".wav", "audio/x-wav") 
    'Video' 
    d.Add(".wmv", "audio/x-ms-wmv") 
    d.Add(".swf", "application/x-shockwave-flash") 
    d.Add(".avi", "video/avi") 
    d.Add(".mp4", "video/mp4") 
    d.Add(".mpeg", "video/mpeg") 
    d.Add(".mpg", "video/mpeg") 
    d.Add(".qt", "video/quicktime") 
    Return d(FileExtension) 
End Function 

これは動作しますが、それは洗練ようだが。

+3

'ContentType'を呼び出すたびに新しい辞書を作るのではなく、switch文を使うべきでしょう。また、 'Path.GetExtension'メソッドがありますので、手動でファイル名を分割する必要はありません。 – StriplingWarrior

+0

VB.Net 10は少し綺麗です... { {".bmp"、 "image/bmp"}、 {".gif"、 "image/gif" "}、 {" .jpeg "、" image/jpeg "}} 'など – JoelFan

+0

@StriplingWarrior、または1つの静的辞書を保持する。このメソッドが頻繁に使用され、そのファイル拡張子の多くをサポートしている場合は、少し速いものになると思います。 –

2

コンテンツタイプを設定するときにファイル名が残っているようです。ファイル拡張子の正しいMIMEタイプを選択するか、デフォルトで "application/base64"のように設定します。

それは、Webブラウザを使用するダウンロードする人を想定すると、一般的なものに固執してみてください:MIME Types Known By IE

+0

リンクの+1 –

+0

これは、ペンテストを通過することに十分な信頼性がありません。この例を使って.docxに名前を変更した.exeをアップロードすることができました。 –

6

私はweb.configファイルでカスタムconfigセクション(私はあなたにカスタム構成セクションを記述するためのタスクを残す)を使用します。私は(Path.GetExtensionを使用

<configSections> 
    <section name="mimeTypeMappings" type="MySoftwareLol.MimeTypeMappingSection, MySoftwareLol"/> 
</configSections> 

<mimeTypeMappings> 
    <MimeTypes> 
     <MimeType Type="application/mac-binhex40" Extensions=".hqx"/> 
     <MimeType Type="application/msword" Extensions=".doc"/> 
     <MimeType Type="application/pdf" Extensions=".pdf"/> 
     <MimeType Type="application/postscript" Extensions=".ai;.eps;.ps"/> 
     <MimeType Type="application/rtf" Extensions=".rtf"/> 
     <MimeType Type="application/vnd.ms-excel" Extensions=".xla;.xlc;.xlm;.xls;.xlt;.xlw"/> 
     <MimeType Type="application/vnd.ms-outlook" Extensions=".msg"/> 
     <MimeType Type="application/vnd.ms-powerpoint" Extensions=".pot;.pps;.ppt"/> 
     <MimeType Type="application/vnd.ms-works" Extensions=".wcm;.wdb;.wks;.wps"/> 
     <MimeType Type="application/x-compress" Extensions=".z"/> 
     <MimeType Type="application/x-compressed" Extensions=".tgz"/> 
     <MimeType Type="application/x-gzip" Extensions=".gz"/> 
     <MimeType Type="application/x-msaccess" Extensions=".mdb"/> 
     <MimeType Type="application/x-msmetafile" Extensions=".wmf"/> 
     <MimeType Type="application/x-mspublisher" Extensions=".pub"/> 
     <MimeType Type="application/x-msschedule" Extensions=".scd"/> 
     <MimeType Type="application/x-msterminal" Extensions=".trm"/> 
     <MimeType Type="application/x-mswrite" Extensions=".wri"/> 
     <MimeType Type="application/x-tar" Extensions=".tar"/> 
     <MimeType Type="application/zip" Extensions=".zip"/> 
     <MimeType Type="audio/basic" Extensions=".au;.snd"/> 
     <MimeType Type="audio/mid" Extensions=".mid;.rmi"/> 
     <MimeType Type="audio/mpeg" Extensions=".mp3"/> 
     <MimeType Type="audio/x-aiff" Extensions=".aif;.aifc;.aiff"/> 
     <MimeType Type="audio/x-pn-realaudio" Extensions=".ra;.ram"/> 
     <MimeType Type="audio/x-wav" Extensions=".wav"/> 
     <MimeType Type="image/bmp" Extensions=".bmp"/> 
     <MimeType Type="image/gif" Extensions=".gif"/> 
     <MimeType Type="image/jpeg" Extensions=".jpe;.jpeg;.jpg"/> 
     <MimeType Type="image/pipeg" Extensions=".jfif"/> 
     <MimeType Type="image/tiff" Extensions=".tif;.tiff"/> 
     <!--By default, sends HTML documents as plain text; sending it as text/html may pose security risks--> 
     <!--If you wish to accept the risks, uncomment the following two lines and comment out the third.--> 
     <!--<MimeType Type="text/html" Extensions=".mht;.html;.htm"/>--> 
     <!--<MimeType Type="text/plain" Extensions=".txt"/>--> 
     <MimeType Type="text/plain" Extensions=".txt;.html;.htm"/> 
     <MimeType Type="text/richtext" Extensions=".rtx"/> 
     <MimeType Type="text/tab-separated-values" Extensions=".tsv"/> 
     <MimeType Type="video/mpeg" Extensions=".mp2;.mpa;.mpe;.mpeg;.mpg;.mpv2"/> 
     <MimeType Type="video/quicktime" Extensions=".mov;.qt"/> 
     <MimeType Type="video/x-la-asf" Extensions=".lsf;.lsx;.asf;.asr;.asx;"/> 
     <MimeType Type="video/x-msvideo" Extensions=".avi"/> 
    </MimeTypes> 
    </mimeTypeMappings> 

を)とのいずれかにそれをマッピングエクステンションにリストされているタイプ。

4

私はZacksレスポンスに基づいてC#ヘルパークラスを作った。

/// <summary> 
/// Helps with Mime Types 
/// </summary> 
public static class MimeTypesHelper 
{ 
    /// <summary> 
    /// Returns the content type based on the given file extension 
    /// </summary> 
    public static string GetContentType(string fileExtension) 
    { 
     var mimeTypes = new Dictionary<String, String> 
      { 
       {".bmp", "image/bmp"}, 
       {".gif", "image/gif"}, 
       {".jpeg", "image/jpeg"}, 
       {".jpg", "image/jpeg"}, 
       {".png", "image/png"}, 
       {".tif", "image/tiff"}, 
       {".tiff", "image/tiff"}, 
       {".doc", "application/msword"}, 
       {".docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"}, 
       {".pdf", "application/pdf"}, 
       {".ppt", "application/vnd.ms-powerpoint"}, 
       {".pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation"}, 
       {".xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"}, 
       {".xls", "application/vnd.ms-excel"}, 
       {".csv", "text/csv"}, 
       {".xml", "text/xml"}, 
       {".txt", "text/plain"}, 
       {".zip", "application/zip"}, 
       {".ogg", "application/ogg"}, 
       {".mp3", "audio/mpeg"}, 
       {".wma", "audio/x-ms-wma"}, 
       {".wav", "audio/x-wav"}, 
       {".wmv", "audio/x-ms-wmv"}, 
       {".swf", "application/x-shockwave-flash"}, 
       {".avi", "video/avi"}, 
       {".mp4", "video/mp4"}, 
       {".mpeg", "video/mpeg"}, 
       {".mpg", "video/mpeg"}, 
       {".qt", "video/quicktime"} 
      }; 

     // if the file type is not recognized, return "application/octet-stream" so the browser will simply download it 
     return mimeTypes.ContainsKey(fileExtension) ? mimeTypes[fileExtension] : "application/octet-stream"; 
    } 
} 

もちろん、mimeTypesを今後のクエリに備えておきたい場合もあります。これは単なる出発点に過ぎない。

3

でMimeMappingクラスは、簡単にレジストリキーを使用して行うことができますがあります。

Dim regKey As Microsoft.Win32.RegistryKey = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey("extension") 
If Not regKey Is Nothing Then 
Dim ct As Object = regKey.GetValue("Content Type") 
    If Not ct Is Nothing Then 
    Return ct.ToString() 
    End If 
End If 

これは、上記の大きなリストと同じ結果を生成します。

+1

これが答えになるはずです。 –

0

リストには、684個のファイル拡張子が含まれています。

このリストでは、のペアは「〜」で区切られ、すべてのペアには拡張名と「#」で区切られたコンテンツタイプがあります。

あなたはどの言語を使用しているのかわかりませんが、これはVBです。ネット

それを使用する方法

  1. リストが含まれていますプロジェクトに文字列リソースを追加します。 それは次のようになります - enter image description here
  2. 今、あなたはこのようにそれを使用することができます

    Public Class MIMETypeList 
        Public data As Dictionary(Of String, String) 
        Public Sub New() 
         data = New Dictionary(Of String, String)() 
         Dim Temp() As String 
         For Each TypeConvertion As String In My.Resources.MimeType.Split("~") 
          Temp = TypeConvertion.Split("#") 
          If Not data.ContainsKey(Temp(0)) Then 
           data.Add(Temp(0), Temp(1)) 
          End If 
         Next 
        End Sub 
    End Class 
    
  3. (つまり、辞書に文字列を解析します)プロジェクトにこのクラスを追加します。

    Dim FileExtension1 As String = ".mp4" 
    Dim FileExtension2 As String = ".html" 
    Dim FileExtension3 As String = ".Random" 
    Dim Converter As New MIMETypeList 
    If Converter.data.ContainsKey(FileExtension1) Then 
        Debug.WriteLine(FileExtension1 & " -> " & Converter.data.Item(FileExtension1)) 
    Else 
        Debug.WriteLine(FileExtension1 & " -> File Content Not Found") 
    End If 
    If Converter.data.ContainsKey(FileExtension2) Then 
        Debug.WriteLine(FileExtension2 & " -> " & Converter.data.Item(FileExtension2)) 
    Else 
        Debug.WriteLine(FileExtension2 & " -> File Content Not Found") 
    End If 
    If Converter.data.ContainsKey(FileExtension3) Then 
        Debug.WriteLine(FileExtension3 & " -> " & Converter.data.Item(FileExtension3)) 
    Else 
        Debug.WriteLine(FileExtension3 & " -> File Content Not Found") 
    End If 
    

    出力:

    .mp4 - >ビデオ/ mp4

    の.html - > text/htmlの

    .Randomを - >ファイルの内容は、表示機能は、ページ内で使用されている方法

関連する問題