В моем веб-приложении (asp.net, С #) я загружаю видеофайл на страницу, но хочу загружать только видео в формате FLV. Как я могу ограничить загрузку других расширенных видео?
В моем веб-приложении (asp.net, С #) я загружаю видеофайл на страницу, но хочу загружать только видео в формате FLV. Как я могу ограничить загрузку других расширенных видео?
Ответы:
string myFilePath = @"C:\MyFile.txt";
string ext = Path.GetExtension(myFilePath);
// ext would be ".txt"
Вы можете просто прочитать поток файла
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")
На сервере вы можете проверить тип MIME, найти тип flv mime здесь или в Google.
Вы должны проверить, что тип пантомимы
video/x-flv
Если вы, например, использовали FileUpload на C #, вы могли бы сделать
FileUpload.PostedFile.ContentType == "video/x-flv"
Вы не сможете ограничить тип файла, который пользователь загружает на стороне клиента [*]. Вы сможете сделать это только на стороне сервера. Если пользователь загружает неправильный файл, вы сможете распознать это только после того, как файл будет загружен. Не существует надежного и безопасного способа остановить загрузку пользователем файла любого желаемого формата.
[*] Да, вы можете делать всевозможные хитрые вещи, чтобы определять расширение файла перед началом загрузки, но не полагайтесь на это. Кто-то рано или поздно обойдет это и загрузит все, что им нравится.
Вы можете проверить подпись .flv. Вы можете скачать спецификацию здесь:
http://www.adobe.com/devnet/flv/
См. Главу «Заголовок FLV».
Нашел альтернативное решение в 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);
}
string FileExtn = System.IO.Path.GetExtension(fpdDocument.PostedFile.FileName);
Вышеупомянутый метод отлично работает с Firefox и IE, я могу просматривать все типы файлов, такие как zip, txt, xls, xlsx, doc, docx, jpg, png.
но когда я пытаюсь найти расширение файла из googlechrome, мне не удалось.
Стоит упомянуть, как удалить расширение также параллельно с получением расширения:
var name = Path.GetFileNameWithoutExtension(fileFullName); // Get the name only
var extension = Path.GetExtension(fileFullName); // Get the extension only