C # 'da bir dosyanın uzantısını nasıl bulabilirim?


135

Web uygulamamda (asp.net, c #) bir sayfaya video dosyası yüklüyorum ancak sadece flv videoları yüklemek istiyorum. Diğer uzantı videolarını yüklerken nasıl kısıtlayabilirim?


1
Mümkünse, gereksiz yüklemelerden kaçınmak için istemciyi de kontrol etmek istersiniz.
Thilo

2
Evet, ancak aşağıdaki cevabıma bakın - müşteri tarafındaki kontrollere güvenmeyin - er ya da geç atlatılacaktır. :)
ZombieSheep

4
İstemci tarafı denetimi, sunucunuz için bir koruma değil, kullanıcı için bir kolaylıktır.
Thilo

Verilen. Ben sadece OP'ye buna güvenmemesini tavsiye ediyorum.
ZombieSheep

Yanıtlar:


269

Path.GetExtension

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

8
Bu, bir kişinin herhangi bir dosyayı * .flv olarak yeniden adlandırmasına ve yüklemesine olanak tanır. Gereksinimlerinizin ne olduğuna bağlı olarak, MIME türünü de kontrol etmek isteyebilirsiniz.
David Glenn

MIME türü genellikle dosya adı uzantısına göre ayarlanmıyor mu?
Thilo

@Thilo, haklısın, ancak uzantı mime içerik türünü değiştirmeden değiştirilebilir. Mime türü, dosyada bulunan verileri açıklar, böylece uygun şekilde işlenebilir bkz. En.wikipedia.org/wiki/MIME
Mark Dickinson

2
Hayır, daha iyi bir yol dosya içeriğini kontrol etmektir. Flv imzasını kontrol etmek gerekir.
Marat Faskhiev

Buna ek olarak, hala popüler bir cevap olduğu için - MIME türü argümanı, uzantı kadar güvensizdir, çünkü her ikisi de sahte olabilir. Her iki kontrolün bir kombinasyonu muhtemelen makul bir çözümdür, ancak nihayetinde güvenlik bir endişe kaynağıysa, daha sıkı kontroller yapılmalıdır, örneğin, imzasız dosyaları veya içerik örneklemesini bloke etmek.
James

21

Bir dosyanın akışını basitçe okuyabilirsiniz

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

İlk 5/6 dizin size dosya türünü söyleyecektir. FLV durumunda 70, 76, 86, 1, 5 .

private static readonly byte[] FLV = { 70, 76, 86, 1, 5};

bool isAllowed = array.Take(5).SequenceEqual(FLV);

eğer isAllowedeşitse trueo zaman FLV.

VEYA

Bir dosyanın içeriğini okuyun

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

İlk iki / üç harf size dosya türünü söyleyecektir.
FLV durumunda "FLV ......"

content.StartsWith("FLV")

3
Bu, daha yüksek derecelendirilmelidir. Uygulamanızın gerçekten çalışmasını istiyorsanız ve veriler güvenilmezse, başlangıca bakmalısınız.
PRMan

7

Sunucuda MIME türünü kontrol edebilir, flv mime türünü buradan veya google'da arayabilirsiniz.

Mime türünün

video/x-flv

Örneğin, C #'da bir FileUpload kullanıyorsanız, şunları yapabilirdiniz:

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

5

İstediğin bu mu emin değilim ama:

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

Veya:

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

4

Ek olarak, eğer varsa FileInfo fi, şunları yapabilirsiniz:

string ext = fi.Extension;

ve dosyanın uzantısını tutacaktır (not: içerecektir ., dolayısıyla yukarıdakinin sonucu: .jpg .txtvb. olabilir ...


2

İstemci tarafında [*] kullanıcının yüklediği dosya türünü kısıtlayamazsınız. Bunu yalnızca sunucu tarafında yapabileceksiniz. Bir kullanıcı yanlış bir dosya yüklerse, bunu ancak dosya yüklendiğinde tanıyabilirsiniz. Bir kullanıcının istediği dosya formatını yüklemesini durdurmanın güvenilir ve güvenli bir yolu yoktur.

[*] evet, yüklemeye başlamadan önce dosya uzantısını tespit etmek için her türlü zekice şey yapabilirsiniz, ancak ona güvenmeyin. Birisi bunun üstesinden gelecek ve er ya da geç istediği şeyi yükleyecektir.


1
Bir bilgisayar korsanının istediğini yüklemesini engelleyemese de, kullanıcıya kolaylık sağlamak için yine de istemci tarafında kontrol etmelidir. Flash yükleyicileri, dosya türünü kontrol edebilmelidir.
Thilo

1
OP, Flash yükleyicilerinden ("Flash içeriği yükleyicileri" yerine "Flash'ta yazılan yükleyiciler") bahsetmedi. Soru, asp.net ve c # etiketleriyle etiketlenir ve bu teknoloji seçenekleriyle, istemci tarafı denetimi sınırlandırılır ve kolayca engellenir. :)
ZombieSheep

Bir video yükleme sitesi için, müşteri tarafında bir HTML yükleme formu yerine daha iyi bir şeye sahip olmalıdır. İlerleme çubuğu olmayan çoklu MB yüklemeleri eğlenceli değildir.
Thilo

Tamam, istemci tarafı kontrolünün o kadar da iyi olmadığını söylüyorsunuz, sunucu tarafında nasıl kontrol edebilirim Bay ZombieSheep
Surya sasidhar

@Thilo - Daha fazlasını kabul edemedim, ancak soru ASP.net yükleme formu ile ilgili. Bunun yeterince iyi olup olmadığını düşünmesi OP'ye kalmış.
ZombieSheep


2

Endswith ()

DotNetPerls'de bir yol belirlemenizi gerektirmediği için daha çok sevdiğim alternatif bir çözüm buldum . İşte bir diziyi özel bir yöntem yardımıyla doldurduğum bir örnek

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

2
string FileExtn = System.IO.Path.GetExtension(fpdDocument.PostedFile.FileName);

Yukarıdaki yöntem firefox ve IE ile iyi çalışıyor, zip, txt, xls, xlsx, doc, docx, jpg, png gibi her tür dosyayı görüntüleyebiliyorum

ancak googlechrome'dan dosyanın uzantısını bulmaya çalıştığımda başarısız oldum.


2

Uzantıyı almakla paralel olarak uzantının nasıl kaldırılacağını da belirtmekte fayda var:

var name = Path.GetFileNameWithoutExtension(fileFullName); // Get the name only

var extension = Path.GetExtension(fileFullName); // Get the extension only

0

Bu çözüm, "Avishay.student.DB" gibi birden fazla uzantının olduğu durumlarda da yardımcı olur.

                FileInfo FileInf = new FileInfo(filePath);
                string strExtention = FileInf.Name.Replace(System.IO.Path.GetFileNameWithoutExtension(FileInf.Name), "");
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.