Bagaimana menemukan ekstensi file di C #?

135

Dalam aplikasi web saya (asp.net, c #) Saya mengunggah file video dalam satu halaman tetapi saya hanya ingin mengunggah video flv. Bagaimana saya bisa membatasi ketika saya mengunggah video ekstensi lainnya?

Surya sasidhar
sumber
1
Jika memungkinkan, Anda juga ingin memeriksa klien, untuk menghindari unggahan yang tidak perlu.
Thilo
2
Ya, tetapi lihat jawaban saya di bawah ini - JANGAN mengandalkan pemeriksaan sisi klien - itu akan dielakkan cepat atau lambat. :)
ZombieSheep
4
Pemeriksaan sisi klien bukan perlindungan untuk server Anda, tetapi kenyamanan bagi pengguna.
Thilo
Memang. Saya hanya menyarankan OP untuk tidak bergantung padanya.
ZombieSheep

Jawaban:

269

Path.GetExtension

string myFilePath = @"C:\MyFile.txt";
string ext = Path.GetExtension(myFilePath);
// ext would be ".txt"
James
sumber
8
Ini memungkinkan seseorang mengubah nama file * .flv dan mengunggahnya. Bergantung pada apa persyaratan Anda, Anda mungkin ingin memeriksa jenis MIME juga.
David Glenn
Bukankah tipe MIME biasanya diatur sesuai dengan ekstensi nama file?
Thilo
@ Thilo, Anda benar, tetapi ekstensi dapat diubah tanpa mengubah tipe konten mime. Jenis pantomim menggambarkan data yang terkandung dalam file, sehingga dapat ditangani dengan tepat lihat en.wikipedia.org/wiki/MIME
Mark Dickinson
2
Tidak, cara yang lebih baik adalah memeriksa konten file. Penting untuk memeriksa tanda tangan flv.
Marat Faskhiev
Hanya untuk menambahkan ini karena masih merupakan jawaban yang populer - argumen tipe MIME sama tidak amannya dengan ekstensi karena keduanya dapat dipalsukan. Kombinasi dari kedua pemeriksaan mungkin merupakan solusi yang masuk akal tetapi pada akhirnya jika keamanan menjadi perhatian maka harus ada pemeriksaan yang lebih ketat misalnya memblokir file yang tidak ditandatangani atau pengambilan sampel konten.
James
21

Anda cukup membaca aliran file

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

Indeks 5/6 pertama akan memberi tahu Anda jenis file. Dalam hal FLV 70, 76, 86, 1, 5 .

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

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

jika isAllowedsama truemaka FLV-nya.

ATAU

Baca konten file

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

Dua / tiga huruf pertama akan memberi tahu Anda jenis file.
Dalam hal FLV, "FLV ......"

content.StartsWith("FLV")
Mukul Yadav
sumber
3
Ini harus dinilai lebih tinggi. Jika Anda benar-benar ingin aplikasi Anda berfungsi dan datanya tidak dipercaya, Anda harus memeriksa awalnya.
PRMan
7

Di server Anda dapat memeriksa tipe MIME, mencari tipe flime mime di sini atau di google.

Anda harus memeriksa bahwa jenis mime adalah

video/x-flv

Misalnya, jika Anda menggunakan FileUpload di C #, Anda bisa melakukannya

FileUpload.PostedFile.ContentType == "video/x-flv"
Mark Dickinson
sumber
5

Saya tidak yakin apakah ini yang Anda inginkan tetapi:

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

Atau:

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

Selain itu, jika Anda memiliki FileInfo fi, Anda dapat melakukan:

string ext = fi.Extension;

dan itu akan menahan ekstensi file (catatan: itu akan mencakup ., jadi hasil di atas bisa menjadi:, .jpg .txtdan seterusnya ....

Noctis
sumber
2

Anda tidak akan dapat membatasi jenis file yang diunggah pengguna di sisi klien [*]. Anda hanya dapat melakukan ini di sisi server. Jika pengguna mengunggah file yang salah, Anda hanya akan dapat mengenali bahwa setelah file diunggah, diunggah. Tidak ada cara yang dapat diandalkan dan aman untuk menghentikan pengguna mengunggah format file apa pun yang mereka inginkan.

[*] Ya, Anda dapat melakukan segala macam hal pintar untuk mendeteksi ekstensi file sebelum memulai unggahan, tetapi jangan bergantung padanya. Seseorang akan mengatasinya dan mengunggah apa pun yang mereka suka cepat atau lambat.

ZombieSheep
sumber
1
Meskipun ia tidak dapat mencegah seorang hacker mengunggah apa yang diinginkannya, ia tetap harus memeriksa sisi klien sebagai kemudahan bagi pengguna. Pengunggah Flash harus dapat memeriksa jenis file.
Thilo
1
OP tidak menyebutkan pengunggah Flash (yaitu 'pengunggah ditulis dalam Flash', bukan 'pengunggah konten Flash'). Pertanyaannya ditandai dengan asp.net dan tag #, dan dengan pilihan teknologi itu, pemeriksaan sisi klien terbatas dan mudah dikalahkan. :)
ZombieSheep
Untuk situs unggahan video, ia harus memiliki sesuatu yang lebih baik di sisi klien daripada formulir unggahan HTML. Unggahan multi-MB tanpa bilah kemajuan tidak menyenangkan.
Thilo
ok Anda mengatakan bahwa cek sisi klien tidak banyak yang baik bagaimana saya bisa cek di sisi server Mr. ZombieSheep
Surya sasidhar
@Thilo - Saya sangat setuju, tetapi pertanyaannya adalah tentang formulir unggah ASP.net. Terserah OP apakah menurutnya itu cukup baik atau tidak.
ZombieSheep
2

Berakhir dengan()

Menemukan solusi alternatif di DotNetPerls yang saya sukai lebih baik karena tidak mengharuskan Anda menentukan jalur. Berikut adalah contoh di mana saya mengisi array dengan bantuan metode kustom

        // 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);
        }
megamaiku
sumber
2
string FileExtn = System.IO.Path.GetExtension(fpdDocument.PostedFile.FileName);

Metode di atas berfungsi baik dengan firefox dan IE, saya dapat melihat semua jenis file seperti zip, txt, xls, xlsx, doc, docx, jpg, png

tetapi ketika saya mencoba menemukan ekstensi file dari googlechrome, saya gagal.

Papun Sahoo
sumber
2

Perlu disebutkan bagaimana cara menghapus ekstensi secara paralel dengan mendapatkan ekstensi:

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

var extension = Path.GetExtension(fileFullName); // Get the extension only
Mohammed Noureldin
sumber
0

Solusi ini juga membantu dalam kasus lebih dari satu ekstensi seperti "Avishay.student.DB"

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