W mojej aplikacji sieci web (asp.net, c #) przekazuję plik wideo na stronie, ale chcę przekazać tylko pliki wideo flv. Jak mogę ograniczyć przesyłanie innych plików wideo z rozszerzeniami?
W mojej aplikacji sieci web (asp.net, c #) przekazuję plik wideo na stronie, ale chcę przekazać tylko pliki wideo flv. Jak mogę ograniczyć przesyłanie innych plików wideo z rozszerzeniami?
Odpowiedzi:
string myFilePath = @"C:\MyFile.txt";
string ext = Path.GetExtension(myFilePath);
// ext would be ".txt"
Możesz po prostu przeczytać strumień pliku
using (var target = new MemoryStream())
{
postedFile.InputStream.CopyTo(target);
var array = target.ToArray();
}
Pierwsze indeksy 5/6 wskażą typ pliku. W przypadku FLV to 70, 76, 86, 1, 5 .
private static readonly byte[] FLV = { 70, 76, 86, 1, 5};
bool isAllowed = array.Take(5).SequenceEqual(FLV);
jeśli isAllowedjest równe, trueto jego FLV.
LUB
Przeczytaj zawartość pliku
var contentArray = target.GetBuffer();
var content = Encoding.ASCII.GetString(contentArray);
Pierwsze dwie / trzy litery określą typ pliku.
W przypadku pliku FLV jego „FLV ......”
content.StartsWith("FLV")
Na serwerze możesz sprawdzić typ MIME, sprawdzić typ MIME flv tutaj lub w Google.
Powinieneś sprawdzić, czy typ MIME to
video/x-flv
Jeśli na przykład używasz FileUpload w C #, możesz to zrobić
FileUpload.PostedFile.ContentType == "video/x-flv"
Nie będzie można ograniczyć typu pliku, który użytkownik przesyła po stronie klienta [*]. Będziesz mógł to zrobić tylko po stronie serwera. Jeśli użytkownik prześle nieprawidłowy plik, będziesz mógł to rozpoznać dopiero po przesłaniu pliku. Nie ma niezawodnego i bezpiecznego sposobu, aby uniemożliwić użytkownikowi przesyłanie plików w dowolnym formacie.
[*] tak, możesz zrobić wiele sprytnych rzeczy, aby wykryć rozszerzenie pliku przed rozpoczęciem przesyłania, ale nie polegaj na nim. Ktoś obejdzie to i wrzuci, co tylko zechce, wcześniej czy później.
Możesz sprawdzić podpis .flv. Możesz pobrać specyfikację tutaj:
http://www.adobe.com/devnet/flv/
Zobacz rozdział „Nagłówek FLV”.
Znalazłem alternatywne rozwiązanie w DotNetPerls, które bardziej mi się podobało, ponieważ nie wymaga określenia ścieżki. Oto przykład, w którym wypełniłem tablicę za pomocą niestandardowej metody
// 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);
Powyższa metoda działa dobrze z Firefox i IE, jestem w stanie przeglądać wszystkie typy plików, takie jak zip, txt, xls, xlsx, doc, docx, jpg, png
ale kiedy próbuję znaleźć rozszerzenie pliku z googlechrome, nie udało mi się.
Warto wspomnieć, jak usunąć rozszerzenie również równolegle z uzyskaniem rozszerzenia:
var name = Path.GetFileNameWithoutExtension(fileFullName); // Get the name only
var extension = Path.GetExtension(fileFullName); // Get the extension only