จะหานามสกุลของไฟล์ใน C # ได้อย่างไร?


135

ในเว็บแอปพลิเคชันของฉัน (asp.net, c #) ฉันกำลังอัปโหลดไฟล์วิดีโอในเพจ แต่ต้องการอัปโหลดเฉพาะวิดีโอ flv ฉันจะ จำกัด เวลาอัปโหลดวิดีโอส่วนขยายอื่น ๆ ได้อย่างไร


1
หากเป็นไปได้คุณควรตรวจสอบไคลเอนต์ด้วยเพื่อหลีกเลี่ยงการอัปโหลดที่ไม่จำเป็น
Thilo

2
ใช่ แต่ดูคำตอบของฉันด้านล่าง - อย่าพึ่งพาการตรวจสอบจากฝั่งไคลเอ็นต์ - จะถูกหลีกเลี่ยงไม่ช้าก็เร็ว :)
ZombieSheep

4
การตรวจสอบฝั่งไคลเอ็นต์ไม่ใช่การป้องกันเซิร์ฟเวอร์ของคุณ แต่เป็นความสะดวกสำหรับผู้ใช้
Thilo

ที่ได้รับ ฉันแค่แนะนำให้ OP ไม่ต้องพึ่งพามัน
ZombieSheep

คำตอบ:


269

Path.GetExtension

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

8
ซึ่งช่วยให้บางคนสามารถเปลี่ยนชื่อไฟล์ * .flv และอัปโหลดได้ ขึ้นอยู่กับความต้องการของคุณคุณอาจต้องการตรวจสอบประเภท MIME ด้วย
David Glenn

ประเภท MIME มักจะไม่ได้รับการตั้งค่าตามนามสกุลไฟล์หรือไม่?
Thilo

@ Thilo คุณพูดถูก แต่สามารถเปลี่ยนส่วนขยายได้โดยไม่ต้องเปลี่ยนประเภทเนื้อหา mime ประเภทละครใบ้อธิบายข้อมูลที่มีอยู่ในไฟล์ดังนั้นจึงสามารถจัดการได้อย่างเหมาะสมโปรดดูที่en.wikipedia.org/wiki/MIME
Mark Dickinson

2
ไม่วิธีที่ดีกว่าคือตรวจสอบเนื้อหาไฟล์ จำเป็นต้องตรวจสอบลายเซ็น flv
Marat Faskhiev

เพื่อเพิ่มสิ่งนี้เนื่องจากยังคงเป็นคำตอบยอดนิยม - อาร์กิวเมนต์ประเภท 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เท่ากับtrueFLV

หรือ

อ่านเนื้อหาของไฟล์

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

ตัวอักษรสอง / สามตัวแรกจะบอกประเภทไฟล์
ในกรณีที่ FLV เป็น "FLV ...... "

content.StartsWith("FLV")

3
สิ่งนี้ควรได้รับการจัดอันดับให้สูงขึ้น หากคุณต้องการให้แอปพลิเคชันของคุณใช้งานได้จริงและข้อมูลไม่น่าเชื่อถือคุณควรตรวจสอบจุดเริ่มต้น
PRMan

7

ที่เซิร์ฟเวอร์คุณสามารถตรวจสอบประเภท MIME ค้นหาประเภท mime flv ที่นี่หรือใน Google

คุณควรตรวจสอบว่าเป็นประเภทละครใบ้

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 ควรตรวจสอบประเภทไฟล์ได้
Thilo

1
OP ไม่ได้กล่าวถึงผู้อัปโหลด Flash (นั่นคือ 'ผู้อัปโหลดที่เขียนด้วย Flash' แทนที่จะเป็น 'ผู้อัปโหลดเนื้อหา Flash') คำถามถูกแท็กด้วยแท็ก asp.net และ c # และด้วยตัวเลือกเทคโนโลยีเหล่านั้นการตรวจสอบฝั่งไคลเอ็นต์จึงมีข้อ จำกัด และถูกกำจัดได้ง่าย :)
ZombieSheep

สำหรับไซต์อัปโหลดวิดีโอเขาควรมีสิ่งที่ดีกว่าในฝั่งไคลเอ็นต์จากนั้นก็คือแบบฟอร์มอัปโหลด HTML การอัปโหลดหลาย MB โดยไม่มีแถบความคืบหน้าไม่ใช่เรื่องสนุก
Thilo

โอเคคุณบอกว่าการตรวจสอบฝั่งไคลเอ็นต์ไม่ค่อยดีเท่าไหร่ฉันจะเช็คอินฝั่งเซิร์ฟเวอร์ได้อย่างไรนาย ZombieSheep
Surya sasidhar

@Thilo - ฉันไม่เห็นด้วยมากกว่านี้ แต่คำถามเกี่ยวกับแบบฟอร์มการอัปโหลด ASP.net ขึ้นอยู่กับ OP ว่าเขาคิดว่าดีพอหรือยัง
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 ฉันล้มเหลว



0

โซลูชันนี้ยังช่วยในกรณีที่มีส่วนขยายมากกว่าหนึ่งรายการเช่น "Avishay.student.DB"

                FileInfo FileInf = new FileInfo(filePath);
                string strExtention = FileInf.Name.Replace(System.IO.Path.GetFileNameWithoutExtension(FileInf.Name), "");
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.