जावास्क्रिप्ट - फ़ाइल इनपुट नियंत्रण से फ़ाइल नाम कैसे निकालें


117

जब कोई उपयोगकर्ता किसी वेब पेज में एक फ़ाइल का चयन करता है तो मैं सिर्फ फ़ाइल नाम निकालने में सक्षम होना चाहता हूं।

मैंने str.search फ़ंक्शन की कोशिश की, लेकिन ऐसा लगता है कि जब फ़ाइल का नाम कुछ इस तरह से विफल होता है: c: \ uploads \ ilike.this.file.jpg

हम बिना एक्सटेंशन के सिर्फ फ़ाइल नाम कैसे निकाल सकते हैं?

जवाबों:


127

अपने <इनपुट प्रकार = "फ़ाइल"> को मानते हुए अपलोड की एक आईडी है यह उम्मीद है कि चाल करना चाहिए:

var fullPath = document.getElementById('upload').value;
if (fullPath) {
    var startIndex = (fullPath.indexOf('\\') >= 0 ? fullPath.lastIndexOf('\\') : fullPath.lastIndexOf('/'));
    var filename = fullPath.substring(startIndex);
    if (filename.indexOf('\\') === 0 || filename.indexOf('/') === 0) {
        filename = filename.substring(1);
    }
    alert(filename);
}

धन्यवाद यह अच्छी तरह से काम करने लगता है, लेकिन मैं सिर्फ विस्तार के बिना फ़ाइल नाम चाहता हूं। मैं इसे उपरोक्त कोड में कैसे कर सकता हूं।
योगी यांग 007

मैंने एक्सटेंशन के बिना फ़ाइल का नाम निकालने के लिए कोड की इन दो पंक्तियों को जोड़ा: "फ़ाइल का नाम = फ़ाइल का नाम। Substring (0, फ़ाइल नाम .length-4); फ़ाइल नाम = फ़ाइल नाम। संदेश ();"
योगी यांग 007

13
नहीं, आप ऐसा नहीं करना चाहते हैं जिस तरह से योगी यांग कहते हैं। इसके बजाय उपयोग करें: filename = filename.substring(0, filename.lastIndexOf('.'));क्योंकि उनका रास्ता 3 से अधिक वर्णों के एक्सटेंशन के साथ विफल हो जाएगा, इस प्रकार: .html, .jpeg आदि
यति

1
कई फ़ाइल चयन के मामले में फ़ाइल नाम कैसे प्राप्त करें?
avngr

क्यों न सिर्फ शुरुआत की गणना करें? var startIndex = Math.max(fullPath.lastIndexOf('\\'), fullPath.lastIndexOf('/')) + 1;
नोलिज

196

स्ट्रिंग को विभाजित करने के लिए ({filepath} / {filename}) और फ़ाइल नाम प्राप्त करें जिसे आप इस तरह से उपयोग कर सकते हैं:

str.split(/(\\|\/)/g).pop()

"पॉप विधि अंतिम तत्व को एक सरणी से हटाती है और उस मान को कॉलर को लौटा देती है।"
मोज़िला डेवलपर नेटवर्क

उदाहरण:

से: "/home/user/file.txt".split(/(\\|\/)/g).pop()

आपको मिला: "file.txt"


5
तुम भी बस regexes के साथ और किसी भी सरणी ऑपरेशन के बिना कर सकते हैं:var filename = filepath.replace(/^.*?([^\\\/]*)$/, '$1');
vog

1
वोग का उत्तर वास्तव में प्रश्न के 100% सटीक उत्तर के करीब है (विस्तार को हटाने की आवश्यकता को छोड़कर।) एक फ़ाइल नाम किसी भी अन्य स्ट्रिंग से अलग नहीं है।
जॉन वाट

1
विभाजित रेगेक्स को छोटा किया जा सकता है [\\/]। इसके अलावा, यह फ़ाइल एक्सटेंशन भी अलग करने के लिए कहा गया था। पूर्ण समाधान के लिए देखें: stackoverflow.com/a/32156800/19163
vog

गुणक, संक्षिप्त। महान।
मार्क

महान समाधान, मुझे समझ नहीं आया कि यह कैसे काम करता है और यही कारण है कि यह अधिक पसंद है!
चाटॉक्स

92

आजकल एक बहुत सरल तरीका है:

var fileInput = document.getElementById('upload');   
var filename = fileInput.files[0].name;

5
fileInput.files.lengthकॉल करने से पहले जांच लें .name, यदि उपयोगकर्ता ने रद्द कर दिया है।
marcovtwout

29

बहुत आसान

let file = $("#fileupload")[0].files[0]; 
file.name

यदि आप टाइपस्क्रिप्ट का उपयोग कर रहे हैं तो उसके $ ("# फाइलअपलोड") [0] ["फाइल"] [0];
मोरवेल

18

मान लिया जाये कि:

<input type="file" name="file1" id="theFile">

जावास्क्रिप्ट होगा:

var fileName = document.getElementById('theFile').files[0].name;

8
var pieces = str.split('\\');
var filename = pieces[pieces.length-1];

यह मानता है कि उपयोगकर्ता विंडोज चला रहा है। अन्य ऑपरेटिंग सिस्टम अलग फाइल पथ सेपरेटर का उपयोग करते हैं।
क्वेंटिन

क्या आपको '/' वर्ण के साथ-साथ गैर-विंडोज उपयोगकर्ताओं के लिए भी जाँच करने की आवश्यकता होगी जैसे कि (? टुकड़े) {str.split ('/'); }? अच्छा सरल समाधान हालांकि +1
इयान ऑक्सले

IIRC, IE एकमात्र ऐसा ब्राउज़र है जो किसी भी तरह से फ़ाइल का पूर्ण पथ देता है ... आपको फ़ायरफ़ॉक्स जैसे अन्य ब्राउज़र पर विभाजित करने की आवश्यकता नहीं होगी, इसलिए यह अभी भी काम करता है। हालाँकि मैं मानता हूँ कि मैंने कभी भी लिनक्स / यूनिक्स ब्राउज़र की कोशिश नहीं की है।
टीएम।

6
str.split (/ (\\ | \ /) / छ); विंडोज़ और * निक्स के लिए
ट्रैकर

@TM। Chrome सुरक्षा के लिए एक नकली पथ चर का उपयोग करता है जो बदसूरत है; iirc यह अलग है कि आप किस ओएस पर हैं।
लीडजे

5

मैं आप सभी एक्सटेंशन यानी पट्टी, चाहते मान /tmp/test/somefile.tar.gzको somefile

रेगेक्स के साथ प्रत्यक्ष दृष्टिकोण:

var filename = filepath.match(/^.*?([^\\/.]*)[^\\/]*$/)[1];

रेगेक्स और सरणी ऑपरेशन के साथ वैकल्पिक दृष्टिकोण:

var filename = filepath.split(/[\\/]/g).pop().split('.')[0];

1
यह विस्तार पट्टी नहीं करता है, जैसा कि पूछा गया है।
जॉन वाट

फिक्स्ड। संकेत के लिए धन्यवाद!
वोग

4

मैंने अभी इसका अपना संस्करण बनाया है। मेरे फ़ंक्शन का उपयोग आप जो कुछ भी चाहते हैं उसे निकालने के लिए कर सकते हैं, अगर आपको इसकी सभी आवश्यकता नहीं है, तो आप आसानी से कुछ कोड निकाल सकते हैं।

<html>
<body>
<script type="text/javascript">
// Useful function to separate path name and extension from full path string
function pathToFile(str)
{
    var nOffset = Math.max(0, Math.max(str.lastIndexOf('\\'), str.lastIndexOf('/')));
    var eOffset = str.lastIndexOf('.');
    if(eOffset < 0 && eOffset < nOffset)
    {
        eOffset = str.length;
    }
    return {isDirectory: eOffset === str.length, // Optionally: && nOffset+1 === str.length if trailing slash means dir, and otherwise always file
            path: str.substring(0, nOffset),
            name: str.substring(nOffset > 0 ? nOffset + 1 : nOffset, eOffset),
            extension: str.substring(eOffset > 0 ? eOffset + 1 : eOffset, str.length)};
}

// Testing the function
var testcases = [
    "C:\\blabla\\blaeobuaeu\\testcase1.jpeg",
    "/tmp/blabla/testcase2.png",
    "testcase3.htm",
    "C:\\Testcase4", "/dir.with.dots/fileWithoutDots",
    "/dir.with.dots/another.dir/"
];
for(var i=0;i<testcases.length;i++)
{
    var file = pathToFile(testcases[i]);
    document.write("- " + (file.isDirectory ? "Directory" : "File") + " with name '" + file.name + "' has extension: '" + file.extension + "' is in directory: '" + file.path + "'<br />");
}
</script>
</body>
</html>

निम्नलिखित उत्पादन करेगा:

  • 'Testcase1' नाम की फ़ाइल में एक्सटेंशन है: 'jpeg' निर्देशिका में है: 'C: \ blabla \ blaeobuaeu'
  • 'Testcase2' नाम की फ़ाइल में एक्सटेंशन है: 'png' निर्देशिका में है: '/ tmp / blabla'
  • 'Testcase3' नाम की फ़ाइल में एक्सटेंशन है: 'htm' निर्देशिका में है: ''
  • 'Testcase4' नाम की निर्देशिका में विस्तार है: '' निर्देशिका में है: 'C:'
  • 'FileWithoutDots' नाम की निर्देशिका का विस्तार है: '' निर्देशिका में है: '/ dir.with.dots'
  • निर्देशिका के नाम के साथ '' का विस्तार है: '' निर्देशिका में है: '/ dir.with.dots/another.dir'

इसके साथ && nOffset+1 === str.lengthजोड़ा गया isDirectory:

  • 'Testcase1' नाम की फ़ाइल में एक्सटेंशन है: 'jpeg' निर्देशिका में है: 'C: \ blabla \ blaeobuaeu'
  • 'Testcase2' नाम की फ़ाइल में एक्सटेंशन है: 'png' निर्देशिका में है: '/ tmp / blabla'
  • 'Testcase3' नाम की फ़ाइल में एक्सटेंशन है: 'htm' निर्देशिका में है: ''
  • 'Testcase4' नाम की निर्देशिका में विस्तार है: '' निर्देशिका में है: 'C:'
  • 'FileWithoutDots' नाम की निर्देशिका का विस्तार है: '' निर्देशिका में है: '/ dir.with.dots'
  • निर्देशिका के नाम के साथ '' का विस्तार है: '' निर्देशिका में है: '/ dir.with.dots/another.dir'

वृषणों को देखते हुए आप यहां अन्य प्रस्तावित विधियों की तुलना में इस कार्य को काफी मजबूती से देख सकते हैं।

\\ के बारे में newbies के लिए ध्यान दें: \ एक एस्केप चरित्र है, उदाहरण के लिए \ n का अर्थ है एक newline और \ ta टैब। \ N लिखने के लिए संभव बनाने के लिए, आपको वास्तव में \\ n टाइप करना होगा।


1
इस पथ के लिए बाहर देखें: dir.with.dots / fileWithoutDots, क्योंकि आपको nOffset से कम eOffset मिलेगा और निष्कर्षण अभिव्यक्तियों को भ्रमित करेगा।
जेसी चिशोल्म

हाँ, इसे ठीक कर दिया। अब वह भी ठीक से काम करना चाहिए (जोड़ा && eOffset < nOffset)।
यति

2

इनपुट : C:\path\Filename.ext
आउटपुट :Filename

HTML कोड में, फ़ाइल onChangeमान को इस तरह सेट करें ...

<input type="file" name="formdata" id="formdata" onchange="setfilename(this.value)"/>

मान लें कि आपकी टेक्स्टफील्ड आईडी 'wpName' है ...

<input type="text" name="wpName" id="wpName">

जावास्क्रिप्ट

<script>
  function setfilename(val)
  {
    filename = val.split('\\').pop().split('/').pop();
    filename = filename.substring(0, filename.lastIndexOf('.'));
    document.getElementById('wpName').value = filename;
  }
</script>

1

अत्यधिक उत्कीर्ण जवाबों में से कोई भी वास्तव में "बिना विस्तार के सिर्फ फ़ाइल नाम" प्रदान नहीं करता है और अन्य समाधान ऐसे सरल काम के लिए बहुत अधिक कोड हैं।

मुझे लगता है कि यह किसी भी जावास्क्रिप्ट प्रोग्रामर के लिए वन-लाइनर होना चाहिए। यह एक बहुत ही सरल नियमित अभिव्यक्ति है:

function basename(prevname) {
    return prevname.replace(/^(.*[/\\])?/, '').replace(/(\.[^.]*)$/, '');
}

सबसे पहले, अंतिम स्लैश तक कुछ भी पट्टी करें, यदि मौजूद है।

फिर, अंतिम अवधि के बाद कुछ भी पट्टी करें, यदि मौजूद हो।

यह सरल है, यह मजबूत है, यह ठीक उसी तरह लागू होता है जैसा कि पूछा जाता है। क्या मैं कुछ भूल रहा हूँ?


1
"एक बहुत ही सरल नियमित अभिव्यक्ति" ... ठीक है, वास्तव में ये दो regexes हैं। :-) एक एकल रेगेक्स समाधान के लिए मेरा जवाब देखें।
वोग

हां, पाइप (()) ऑपरेटर का उपयोग करके उन दो रेगीक्स को एक एकल रेगेक्स में पैक करने के लिए एक स्पष्ट री-राइट भी है। मुझे लगता है कि जैसा कोड लिखा गया है वह स्पष्ट है, लेकिन यह दो बार स्ट्रिंग के माध्यम से चलता है, जो कि स्ट्रिंग आमतौर पर बहुत लंबा होने पर एक समस्या होगी। (फ़ाइल पथ आम तौर पर नहीं हैं, लेकिन हो सकते हैं।)
जॉन व्हिट

1
मैं सिर्फ नाइटपैकिंग कर रहा था। कृपया इसे गंभीरता से न लें। अनुकूलन करने की कोई आवश्यकता नहीं है, सभी प्रस्तावित समाधान तेजी से पर्याप्त से अधिक हैं। बहुत लंबे फ़ाइल पथ अभी भी किलोबाइट हैं, गीगाबाइट नहीं। और यह फ़ंक्शन एक बार फ़ाइल अपलोड के अनुसार चालू हो जाएगा, बैच में 1000x नहीं। यहां केवल वही चीजें हैं जो कोड की शुद्धता और स्पष्टता हैं।
vog

1
// HTML
<input type="file" onchange="getFileName(this)">

// JS
function getFileName(input) {
    console.log(input.files[0].name) // With extension
    console.log(input.files[0].name.replace(/\.[^/.]+$/, '')) // Without extension
}

एक्सटेंशन कैसे निकालें


1
यह प्रश्न का एक महत्वपूर्ण हिस्सा याद करता है, "विस्तार के बिना सिर्फ फ़ाइल नाम निकालें"। यह उत्तर देने के लिए कूदने से पहले प्रश्न को ध्यान से पढ़ने में मदद करता है।
zeh

1
var path = document.getElementById('upload').value;//take path
var tokens= path.split('\\');//split path
var filename = tokens[tokens.length-1];//take file name

0

उपर्युक्त उत्तरों में से कोई भी मेरे लिए काम नहीं करता है, यहाँ मेरा समाधान है जो फ़ाइल नाम के साथ एक अक्षम इनपुट को अद्यतन करता है:

<script type="text/javascript"> 
  document.getElementById('img_name').onchange = function () {
  var filePath = this.value;
    if (filePath) {
      var fileName = filePath.replace(/^.*?([^\\\/]*)$/, '$1');
      document.getElementById('img_name_input').value = fileName;
    }
  };
</script>

-2

यदि आप jQuery का उपयोग कर रहे हैं तो

$("#fileupload").val();

वैल () वास्तव में पूरे फ़ाइल पथ को वापस कर देगा जो वह नहीं चाहता है।
फैब्रिकियो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.