2009-03-27 30 views
11

Ứng dụng của tôi WPF được một tập tin từ người sử dụng với Microsoft.Win32.OpenFileDialog() ...Làm cách nào để xác định loại nội dung của tệp trong .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 

Và ứng dụng ASP.NET MVC của tôi phục vụ nó lên để tải về tại một trang web với 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 

Nhưng FileStreamResult() cần chuỗi loại nội dung. Làm cách nào để biết loại nội dung chính xác của tệp của tôi?

+0

Làm thế nào là chức năng hiển thị được sử dụng trong trang? – shahkalpesh

+0

Không có trang nào. Đó là một lớp điều khiển ASP.NET MVC. Hiển thị là một trong các Chế độ xem của nó. Nhưng, vì View này trả về một FileStreamResult hơn là một ViewResult, nó không có trang ASPX. –

Trả lời

15

tôi đã thay thế cột FileExtension trong bảng cơ sở dữ liệu của tôi với một cột ContentType.

Tôi điền nó khi tôi tải tệp lên.

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

tôi xác định loại nội dung với chức năng này:

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 

này hoạt động, nhưng có vẻ như không thanh nha.

+3

Có thể bạn nên sử dụng câu lệnh chuyển đổi thay vì tạo từ điển mới mỗi khi bạn gọi 'ContentType'. Ngoài ra, còn có phương thức 'Path.GetExtension' để bạn không phải tách tên tệp theo cách thủ công. – StriplingWarrior

+0

VB.Net 10 đẹp hơn một chút ... Dim d Là Từ điển Mới (của Chuỗi, Chuỗi) Từ { {".bmp", "hình ảnh/bmp"}, {".gif", "hình ảnh/gif "}, {" .jpeg "," hình ảnh/jpeg "}} 'etc – JoelFan

+0

@StriplingWarrior hoặc giữ một từ điển tĩnh đơn. Nếu phương pháp này thường được sử dụng và hỗ trợ nhiều phần mở rộng tệp, tôi nghĩ nó sẽ tăng tốc độ một chút –

2

Dường như bạn vẫn có tên tệp khi bạn đi để đặt loại nội dung. Bạn có thể chọn loại mime chính xác cho phần mở rộng tập tin, hoặc mặc định cho một cái gì đó như "application/base64".

Giả sử người tải xuống nó sẽ được sử dụng một trình duyệt web, hãy cố gắng bám vào những điểm chung: MIME Types Known By IE

+0

+1 cho liên kết –

+0

Đây không phải là đủ đáng tin cậy cho bất cứ điều gì sẽ trải qua thử nghiệm bút. Tôi có thể tải lên một .exe đổi tên thành .docx bằng cách sử dụng ví dụ này. –

6

tôi sử dụng một phần tùy chỉnh cấu hình trong web.config (tôi rời khỏi công việc để viết phần cấu hình tùy chỉnh cho bạn):

<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> 

tôi sử dụng Path.GetExtension() và bản đồ đó để một trong những các loại được liệt kê trong Tiện ích mở rộng.

4

Tôi đã tạo lớp trợ giúp C# dựa trên phản hồi Zacks.

/// <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"; 
    } 
} 

Tất nhiên, bạn có thể giữ số mimeTypes còn sống cho các truy vấn trong tương lai. Đây chỉ là điểm khởi đầu.

3

có thể dễ dàng thực hiện bằng cách sử dụng từ khóa registry.

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 

Điều này sẽ tạo ra kết quả tương tự như danh sách lớn được đề cập ở trên !!!!

+1

Đây phải là câu trả lời. –

0

Bạn có thể sử dụng danh sách This, chứa 684 tiện ích mở rộng tệp.

Trong danh sách này, mỗi cặp được phân tách bằng dấu "~" và mỗi cặp có tên tiện ích mở rộng và loại nội dung được phân tách bằng "#".

Tôi không biết bạn đang sử dụng ngôn ngữ nào nhưng đây là trong vb.net

Làm thế nào để sử dụng nó:

  1. Thêm một nguồn tài nguyên chuỗi cho bạn dự án có chứa danh sách. Nó sẽ giống như thế này - enter image description here
  2. Thêm lớp này để dự án của bạn (mà sẽ phân tích các chuỗi từ điển)

    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. Bây giờ bạn có thể sử dụng nó như thế này:

    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 
    

    Đầu ra:

    .mp4 -> video/mp4

    .html -> text/html

    .Random -> File Content Not Found

Các vấn đề liên quan