C # में फ़ाइल का एक्सटेंशन कैसे खोजें?


135

अपने वेब एप्लिकेशन (asp.net, c #) में मैं एक पेज में वीडियो फ़ाइल अपलोड कर रहा हूं लेकिन मैं केवल flv वीडियो अपलोड करना चाहता हूं। जब मैं अन्य एक्सटेंशन वीडियो अपलोड करता हूं तो मैं कैसे प्रतिबंधित कर सकता हूं?


1
यदि संभव हो, तो आप अनावश्यक अपलोड से बचने के लिए क्लाइंट पर भी जांच करना चाहते हैं।
थिलो

2
हां, लेकिन मेरा जवाब नीचे देखें - क्लाइंट साइड चेकिंग पर भरोसा न करें - इसे जल्द या बाद में दरकिनार कर दिया जाएगा। :)
ज़ोंबीशेप

4
क्लाइंट-साइड चेक आपके सर्वर के लिए सुरक्षा नहीं है, लेकिन उपयोगकर्ता के लिए एक सुविधा है।
थिलो

स्वीकृत। मैं सिर्फ ओपी को इस पर भरोसा नहीं करने की सलाह दे रहा हूं।
ज़ोंबीशेप

जवाबों:


269

Path.GetExtension

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

8
यह किसी को किसी भी फ़ाइल का नाम बदलने के लिए अनुमति देता है * .flv और इसे अपलोड करें। आपकी आवश्यकताएं क्या हैं, इस पर निर्भर करते हुए, आप 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तो इसकी एफ.एल.वी.

या

किसी फ़ाइल की सामग्री पढ़ें

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

पहले दो / तीन अक्षर आपको फ़ाइल प्रकार बताएंगे।
FLV के मामले में इसका "FLV ......"

content.StartsWith("FLV")

3
यह उच्च श्रेणी निर्धारण किया जाना चाहिए। यदि आप वास्तव में चाहते हैं कि आपका एप्लिकेशन काम करे और डेटा अविश्वासित हो, तो आपको शुरुआत की जांच करनी चाहिए।
PRMan

7

सर्वर पर आप MIME प्रकार की जाँच कर सकते हैं, यहाँ या Google पर flv माइम प्रकार देख सकते हैं।

आपको यह देखना चाहिए कि माइम का प्रकार क्या है

video/x-flv

यदि आप उदाहरण के लिए C # में FileUpload का उपयोग कर रहे हैं, तो आप कर सकते हैं

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
हालांकि वह एक हैकर को यह अपलोड करने से नहीं रोक सकता कि वह क्या चाहता है, फिर भी उसे उपयोगकर्ता की सुविधा के रूप में क्लाइंट की तरफ देखना चाहिए। फ़्लैश अपलोडर को फ़ाइल प्रकार की जांच करने में सक्षम होना चाहिए।
थिलो

1
ओपी ने फ्लैश अपलोडर्स (यानी 'फ्लैश कंटेंट के अपलोडर्स के बजाय फ्लैश में लिखे गए अपलोडर') का उल्लेख नहीं किया। प्रश्न को asp.net और c # टैग के साथ टैग किया गया है, और उन प्रौद्योगिकी विकल्पों के साथ, क्लाइंट-साइड चेकिंग सीमित है और आसानी से हार जाती है। :)
ज़ोंबीशेप

वीडियो अपलोड साइट के लिए, उसे क्लाइंट-साइड पर फिर HTML अपलोड फॉर्म में कुछ बेहतर करना चाहिए। प्रगति-पट्टी के बिना मल्टी-एमबी अपलोड कोई मज़ा नहीं है।
थिलो

ठीक है आप कह रहे हैं कि क्लाइंट साइड चेक इतना अच्छा नहीं है कि मैं सर्वर साइड मिस्टर
ज़ोंबीशेप

@ थिलो - मैं अधिक सहमत नहीं हो सका, लेकिन सवाल ASP.net अपलोड फॉर्म के बारे में है। यह ओपी के ऊपर है कि वह सोचता है कि यह काफी अच्छा है या नहीं।
ज़ोंबीशेप


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

उपरोक्त विधि फ़ायरफ़ॉक्स और IE के साथ ठीक काम करती है, मैं ज़िप, 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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.