No meu aplicativo da web (asp.net, c #), estou carregando um arquivo de vídeo em uma página, mas quero carregar apenas vídeos flv. Como posso restringir quando envio outros vídeos de extensão?
No meu aplicativo da web (asp.net, c #), estou carregando um arquivo de vídeo em uma página, mas quero carregar apenas vídeos flv. Como posso restringir quando envio outros vídeos de extensão?
Respostas:
string myFilePath = @"C:\MyFile.txt";
string ext = Path.GetExtension(myFilePath);
// ext would be ".txt"
Você pode simplesmente ler o fluxo de um arquivo
using (var target = new MemoryStream())
{
postedFile.InputStream.CopyTo(target);
var array = target.ToArray();
}
Os primeiros 5/6 índices informarão o tipo de arquivo. No caso de FLV, seus 70, 76, 86, 1, 5 .
private static readonly byte[] FLV = { 70, 76, 86, 1, 5};
bool isAllowed = array.Take(5).SequenceEqual(FLV);
se for isAllowed
igual a true
seu FLV.
OU
Leia o conteúdo de um arquivo
var contentArray = target.GetBuffer();
var content = Encoding.ASCII.GetString(contentArray);
As primeiras duas / três letras indicam o tipo de arquivo.
No caso de FLV, seu "FLV ......"
content.StartsWith("FLV")
No servidor, você pode verificar o tipo MIME, pesquisa flv mime type aqui ou no google.
Você deve verificar se o tipo MIME é
video/x-flv
Se você estivesse usando um FileUpload em C #, por exemplo, você poderia fazer
FileUpload.PostedFile.ContentType == "video/x-flv"
Você não poderá restringir o tipo de arquivo que o usuário carrega no lado do cliente [*]. Você só poderá fazer isso no lado do servidor. Se um usuário fizer o upload de um arquivo incorreto, você poderá reconhecer apenas que após o upload do arquivo. Não há uma maneira confiável e segura de impedir que um usuário faça o upload do formato de arquivo desejado.
[*] sim, você pode fazer todos os tipos de coisas inteligentes para detectar a extensão do arquivo antes de iniciar o upload, mas não confie nela. Alguém irá contorná-lo e enviar o que quiser mais cedo ou mais tarde.
Você pode verificar a assinatura .flv. Você pode baixar as especificações aqui:
http://www.adobe.com/devnet/flv/
Consulte o capítulo "O cabeçalho da FLV".
Encontrei uma solução alternativa no DotNetPerls que eu mais gostei, porque não exige que você especifique um caminho. Aqui está um exemplo em que eu preenchi uma matriz com a ajuda de um método personalizado
// 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);
O método acima funciona bem com o firefox e o IE, eu consigo visualizar todos os tipos de arquivos como zip, txt, xls, xlsx, doc, docx, jpg, png
mas quando tento encontrar a extensão de arquivo do googlechrome, falhei.
Vale mencionar como remover a extensão também em paralelo com a obtenção da extensão:
var name = Path.GetFileNameWithoutExtension(fileFullName); // Get the name only
var extension = Path.GetExtension(fileFullName); // Get the extension only