12 Stimmen

Wie kann ich den Inhaltstyp einer Datei in .NET bestimmen?

Meine WPF-Anwendung erhält eine Datei vom Benutzer mit Microsoft.Win32.OpenFileDialog()...

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

Und meine ASP.NET MVC-Anwendung dient es zum Download auf einer Website mit FileStreamResult()...

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

Aber FileStreamResult() benötigt eine Zeichenfolge für den Inhaltstyp. Wie kann ich den richtigen Inhaltstyp meiner Datei ermitteln?

2voto

CodingWithSpike Punkte 41513

Es sieht so aus, als ob Sie immer noch den Dateinamen haben, wenn Sie den Inhaltstyp festlegen wollen. Sie könnten den richtigen Mime-Typ für die Dateierweiterung auswählen oder etwas wie "application/base64" vorgeben.

Wenn Sie davon ausgehen, dass die Person, die die Datei herunterlädt, einen Webbrowser verwendet, versuchen Sie, sich an die gängigen Browser zu halten: Vom IE erkannte MIME-Typen

0voto

Green Fire Punkte 710

Sie können verwenden Diese Liste, die 684 Dateierweiterungen enthält.

In dieser Liste sind alle Paar wird durch "~" getrennt, und bei jedem Paar werden der Name der Erweiterung und der Inhaltstyp durch "#" getrennt.

Ich weiß nicht, welche Sprache Sie verwenden, aber dies ist in vb.net

Wie man es benutzt:

  1. Fügen Sie eine String-Ressource zu Ihrem Projekt hinzu, die die Liste enthält. Sie wird wie folgt aussehen - enter image description here

  2. Fügen Sie diese Klasse zu Ihrem Projekt hinzu (die die Zeichenkette in ein Dictionary umwandeln wird)

    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. Jetzt können Sie es so verwenden:

    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

    Ausgabe:

    .mp4 -> Video/mp4

    .html -> text/html

    .Random -> Dateiinhalt nicht gefunden

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X