Як знайти розширення файлу в C #?


135

У своїй веб-програмі (asp.net, c #) я завантажую відеофайл на сторінку, але хочу завантажувати лише файли flv. Як я можу обмежитись, коли завантажую інші відео з розширеннями?


1
Якщо можливо, ви також хочете перевірити клієнта, щоб уникнути зайвих завантажень.
Тіло

2
Так, але дивіться мою відповідь нижче - НЕ покладайтеся на перевірку з боку клієнта - рано чи пізно це буде обійти. :)
ZombieSheep

4
Перевірка на стороні клієнта - це не захист вашого сервера, а зручність для користувача.
Тіло

Здійснено. Я просто раджу ОП не покладатися на це.
ZombieSheep

Відповіді:


269

Path.GetExtension

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

8
Це дозволяє комусь просто перейменувати будь-який файл * .flv та завантажити його. Залежно від ваших вимог, ви також можете перевірити тип MIME.
Девід Гленн

Невже тип MIME зазвичай не встановлюється відповідно до розширення імені файлу?
Тіло

@Thilo, ви праві, але розширення можна змінити, не змінюючи тип вмісту mime. Тип mime описує дані, що містяться у файлі, тому з ними можна обробляти належним чином див. En.wikipedia.org/wiki/MIME
Марк Дікінсон

2
Ні, кращий спосіб - перевірити вміст файлу. Потрібно перевірити підпис flv.
Марат Фасхієв

Просто до цього, оскільки це все ще популярна відповідь - аргумент типу MIME так само небезпечний, як і розширення, оскільки обидва можуть бути підроблені. Поєднання обох перевірок, ймовірно, є розумним рішенням, але в кінцевому підсумку, якщо безпека викликає занепокоєння, тоді повинні бути більш жорсткі перевірки, наприклад, блокування неподписаних файлів або вибірки вмісту.
Джеймс

21

Ви можете просто прочитати потік файлу

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

Перші 5/6 індексів підкажуть вам тип файлу. У випадку з FLV його 70, 76, 86, 1, 5 .

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

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

якщо isAllowedдорівнює, trueто його FLV.

АБО

Прочитайте вміст файлу

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

Перші два / три букви підкажуть вам тип файлу.
У випадку FLV його "FLV ......"

content.StartsWith("FLV")

3
Це слід оцінювати вище. Якщо ви дійсно хочете, щоб ваша програма працювала, а дані недовірені, слід перевірити її початок.
PRMan

7

На сервері ви можете перевірити тип MIME, шукати тип mime типу flv тут або в google.

Ви повинні перевірити, чи є тип mime

video/x-flv

Якщо ви, наприклад, використовували FileUpload в C #, ви можете це зробити

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

5

Я не впевнений, що ви цього хочете, але:

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

Або:

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

4

Крім того, якщо у вас є FileInfo fi, ви можете просто зробити:

string ext = fi.Extension;

і він буде містити розширення файлу (зверніть увагу: воно буде включати в себе ., тому результатом вищезазначеного може бути: .jpg .txtі так далі ....


2

Ви не зможете обмежити тип файлу, який користувач завантажує на стороні клієнта [*]. Ви зможете зробити це лише на стороні сервера. Якщо користувач завантажує неправильний файл, ви зможете розпізнати це лише після завантаження файлу, завантаженого. Немає надійного та безпечного способу зупинити завантаження користувачем будь-якого формату файлу.

[*] так, ви можете робити всілякі розумні речі, щоб виявити розширення файлу перед початком завантаження, але не покладайтеся на нього. Хтось обійде його і рано чи пізно завантажить все, що їм подобається.


1
Хоча він не може перешкодити хакеру завантажити те, що він хоче, він все-таки повинен перевірити клієнтську сторону як зручність для користувача. Завантажувачі Flash повинні мати можливість перевірити тип файлу.
Тіло

1
ОП не згадувала завантажувачів Flash (тобто "завантажувачів, написаних у Flash", а не "завантажувачів Flash-вмісту"). Питання позначено тегами asp.net та c #, і з використанням цих технологій вибір перевірки на стороні клієнта обмежений і легко переможений. :)
ZombieSheep

Для сайту для завантаження відео він повинен мати щось краще на стороні клієнта, ніж форму для завантаження HTML. Завантаження кількох МБ без смужки прогресу - це не цікаво.
Тіло

гаразд, ви говорите, що перевірка на стороні клієнта не так добре, як я можу перевірити серверну сторону Містер ZombieSheep
Surya sasidhar

@Thilo - Я не могла погодитися більше, але питання стосується форми завантаження ASP.net. Це він вважає, що це досить добре чи ні.
ZombieSheep


2

Закінчується ()

Знайдено альтернативне рішення в DotNetPerls, яке мені сподобалось краще, оскільки воно не вимагає від вас вказувати шлях. Ось приклад, коли я заповнив масив за допомогою спеціального методу

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

Вищеописаний метод добре працює з firefox та IE, я можу переглядати всі типи файлів, такі як zip, txt, xls, xlsx, doc, docx, jpg, png

але коли я намагаюся знайти розширення файлу з googlechrome, я не вдався.


2

Варто згадати, як видалити розширення також паралельно з отриманням розширення:

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

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

0

Це рішення також допомагає у випадках, коли існує більше ніж одне розширення типу "Avishay.student.DB"

                FileInfo FileInf = new FileInfo(filePath);
                string strExtention = FileInf.Name.Replace(System.IO.Path.GetFileNameWithoutExtension(FileInf.Name), "");
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.