2009-12-11 70 views
66

Trong ứng dụng web của tôi (asp.net, C#) Tôi đang tải lên tệp video trong một trang nhưng tôi chỉ muốn tải lên các video flv. Tôi có thể hạn chế như thế nào khi tôi tải lên các video mở rộng khác?Cách tìm phần mở rộng của một tập tin?

+1

Nếu có thể, bạn cũng muốn kiểm tra khách hàng, để tránh tải lên không cần thiết. – Thilo

+2

Có, nhưng hãy xem câu trả lời của tôi bên dưới - KHÔNG dựa vào việc kiểm tra phía khách hàng - nó sẽ bị phá vỡ sớm hay muộn. :) – ZombieSheep

+3

Kiểm tra phía máy khách không phải là sự bảo vệ cho máy chủ của bạn mà là sự tiện lợi cho người dùng. – Thilo

Trả lời

146

Path.GetExtension

string myFilePath = @"C:\MyFile.txt"; 
string ext = Path.GetExtension(myFilePath); 
// ext would be ".txt" 
+0

Cảm ơn u Ông James nó đang làm việc tốt cảm ơn u cho phản ứng –

+6

Điều này cho phép ai đó chỉ cần đổi tên bất kỳ tập tin * .flv và tải nó lên. Tùy thuộc vào yêu cầu của bạn là gì, bạn cũng có thể kiểm tra loại MIME. –

+0

Không phải loại MIME thường được đặt theo phần mở rộng tên tệp không? – Thilo

7

Tại máy chủ bạn có thể kiểm tra kiểu MIME, tra cứu flv loại mime đây hoặc trên google.

Bạn nên kiểm tra xem các loại mime là

video/x-flv 

Nếu bạn đang sử dụng một FileUpload trong C# ví dụ, bạn có thể làm

FileUpload.PostedFile.ContentType == "video/x-flv" 
6

Tôi không chắc chắn nếu điều này là những gì bạn muốn nhưng:

Directory.GetFiles(@"c:\mydir", "*.flv"); 

Hoặc:

Path.GetExtension(@"c:\test.flv") 
+0

cảm ơn u Ông Carra đang làm việc –

2

Bạn sẽ không thể hạn chế loại tệp mà người dùng tải lên ở phía máy khách [*]. Bạn sẽ chỉ có thể làm điều này ở phía máy chủ. Nếu người dùng tải lên tệp không chính xác, bạn sẽ chỉ có thể nhận ra rằng khi tệp được tải lên được tải lên. Không có cách nào đáng tin cậy và an toàn để ngăn người dùng tải lên bất kỳ định dạng tệp nào họ muốn.

[*] có, bạn có thể thực hiện tất cả các công cụ thông minh để phát hiện phần mở rộng tệp trước khi bắt đầu tải lên nhưng không dựa vào nó. Một người nào đó sẽ nhận được xung quanh nó và tải lên bất cứ điều gì họ thích sớm hay muộn.

+1

Trong khi ông không thể ngăn chặn một hacker tải lên những gì ông muốn, ông vẫn nên kiểm tra ở phía khách hàng như một tiện lợi cho người dùng. Người tải lên Flash có thể kiểm tra loại tệp. – Thilo

+1

OP không đề cập đến người tải lên Flash (tức là 'người tải lên được viết bằng Flash', thay vì 'người tải lên nội dung Flash'). Câu hỏi được gắn thẻ với các thẻ asp.net và C#, và với những lựa chọn công nghệ đó, việc kiểm tra phía máy khách bị giới hạn và dễ dàng bị đánh bại. :) – ZombieSheep

+0

Đối với trang web tải lên video, anh ấy nên có nội dung nào đó tốt hơn ở phía máy khách, sau đó là biểu mẫu tải lên HTML. Tải lên nhiều MB không có thanh tiến trình không vui. – Thilo

1

Bạn có thể kiểm tra chữ ký .flv. Bạn có thể tải xuống đặc điểm kỹ thuật tại đây:

http://www.adobe.com/devnet/flv/

Xem chương "Tiêu đề FLV".

0

Bên cạnh đó, nếu bạn có một FileInfo fi, bạn có thể chỉ cần làm:

string ext = fi.Extension; 

và nó sẽ giữ phần mở rộng của tập tin (lưu ý: nó sẽ bao gồm các ., do đó, một kết quả của sự trên có thể là: .jpg.txt, và vân vân ....

8

Bạn chỉ có thể đọc những dòng của một file

using (var target = new MemoryStream()) 
     { 
      postedFile.InputStream.CopyTo(target); 
      var array = target.ToArray(); 

Đầu tiên 5/6 chỉ mục sẽ cho bạn biết loại tệp. Trong trường hợp FLV của nó

byte đọc riêng tĩnh [] FLV = {70, 76, 86, 1, 5};

Just do - var isAllowed = array.Take(5).SequenceEqual(FLV); 

nếu có thì FLV của nó.

HOẶC

Đọc nội dung của một tập tin

var contentArray = target.GetBuffer(); 
       var content = Encoding.ASCII.GetString(contentArray); 

Đầu tiên hai/ba chữ sẽ cho bạn biết loại tệp. Trong trường hợp của FLV nó

"FLV | \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 ......"

Just do - content.StartsWith("FLV") 
+1

Điều này sẽ được xếp hạng cao hơn. Nếu bạn thực sự muốn ứng dụng của mình hoạt động và dữ liệu không đáng tin cậy, bạn nên kiểm tra phần đầu. – PRMan

0

Giải pháp này cũng giúp trong trường hợp nhiều hơn một phần mở rộng như "Avishay.student.DB"

   FileInfo FileInf = new FileInfo(filePath); 
       string strExtention = FileInf.Name.Replace(System.IO.Path.GetFileNameWithoutExtension(FileInf.Name), ""); 
0

EndsWith()

Tìm thấy một giải pháp thay thế qua tại DotNetPerls mà tôi thích hơn bởi vì nó không yêu cầu bạn phải chỉ định đường dẫn. Dưới đây là một ví dụ nơi tôi cư một mảng với sự giúp đỡ của một phương pháp tùy chỉnh

 // This custom method takes a path 
     // and adds all files and folder names to the 'files' array 
     string[] files = Utilities.FileList("C:\", ""); 
     // Then for each array item... 
     foreach (string f in files) 
     { 
      // Here is the important line I used to ommit .DLL files: 
      if (!f.EndsWith(".dll", StringComparison.Ordinal)) 
       // then populated a listBox with the array contents 
       myListBox.Items.Add(f); 
     } 
0
string FileExtn = System.IO.Path.GetExtension(fpdDocument.PostedFile.FileName); 

Các phương pháp trên hoạt động tốt với Firefox và IE, tôi có thể xem tất cả các loại tập tin như zip, txt, xls, xlsx, doc, docx, jpg, png

nhưng khi tôi cố gắng tìm phần mở rộng của tệp từ googlechrome, tôi không thành công.

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