জাভাস্ক্রিপ্ট - কোনও ফাইল ইনপুট নিয়ন্ত্রণ থেকে ফাইলের নাম কীভাবে নেওয়া যায়


117

যখন কোনও ব্যবহারকারী কোনও ওয়েব পৃষ্ঠায় একটি ফাইল নির্বাচন করেন আমি কেবল ফাইলের নামটি বের করতে সক্ষম হতে চাই।

আমি str.search ফাংশন চেষ্টা করেছিলাম কিন্তু ফাইলের নামটি যখন এরকম কিছু হয় তখন এটি ব্যর্থ হয় বলে মনে হয়: c: s 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

আমি এক্সটেনশন ছাড়াই কেবলমাত্র ফাইলের নাম আহরণের জন্য কোডের এই দুটি লাইন যুক্ত করেছি: "ফাইলের নাম = ফাইল নাম.সুবস্ট্রিং (0, ফাইলের নাম। দৈর্ঘ্য -4); ফাইলের নাম = ফাইল নাম.টোলওয়ারকেস ();"
যোগী ইয়াং 007

13
নাহ, আপনি যোগী ইয়াং যেভাবে বলেন এটি করতে চান না। পরিবর্তে ব্যবহার করুন: filename = filename.substring(0, filename.lastIndexOf('.'));কারণ তার পথটি 3 টিরও বেশি অক্ষরের এক্সটেনশনের সাথে ব্যর্থ হবে, এইভাবে: .html, .jpeg ইত্যাদি
ইয়েতি

1
একাধিক ফাইল নির্বাচনের ক্ষেত্রে ফাইলের নাম কীভাবে পাবেন?
avngr

স্টার্ট ইন্ডেক্সের মতো কেন গণনা করা হচ্ছে না? var startIndex = Math.max(fullPath.lastIndexOf('\\'), fullPath.lastIndexOf('/')) + 1;
নলিজ

196

স্ট্রিংকে বিভক্ত করতে ({ফাইলপথ} / {ফাইলের নাম}) এবং ফাইলের নাম পেতে আপনি এই জাতীয় কিছু ব্যবহার করতে পারেন:

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

এটি ধরে নিয়েছে যে ব্যবহারকারী উইন্ডোজ চালাচ্ছেন। অন্যান্য অপারেটিং সিস্টেমগুলি বিভিন্ন ফাইল পাথ পৃথককারী ব্যবহার করে।
কোয়ান্টিন

উইন্ডোজবিহীন ব্যবহারকারীদের যেমন আপনার (/ টুকরা) {স্ট্রিয়রস্প্লিট ('/'); }? +1 যদিও দুর্দান্ত সরল সমাধান
ইয়ান অক্সলে

আইআইআরসি, আইই হ'ল একমাত্র ব্রাউজার যা যেভাবেই ফাইলের পুরো পথ দেয় ... আপনার ফায়ারফক্সের মতো অন্য ব্রাউজারগুলিতে বিভক্ত হওয়ার দরকার নেই, তাই এটি এখনও কার্যকর। যদিও আমি স্বীকার করি আমি প্রত্যেকটি লিনাক্স / ইউনিক্স ব্রাউজার চেষ্টা করি নি।
টিএম

6
str.split (/ (\\ | \ /) / ছ); উইন্ডোজ এবং * নিক্সের জন্য
ট্র্যাকার 1

@TM। ক্রোম সুরক্ষার জন্য একটি জাল পথ পরিবর্তনশীল ব্যবহার করে যা কুৎসিত; আপনি কী ওএস চালু আছেন তার উপর নির্ভর করে iirc এটি ভিন্ন।
নেতৃত্ব দিন

5

আমি ধরে নিই যে আপনি সমস্ত এক্সটেনশানগুলি অর্থাত্‍ /tmp/test/somefile.tar.gzচাইলে ফেলাতে চান somefile

রেজেক্সের সাথে সরাসরি যোগাযোগ:

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

রেজেক্স এবং অ্যারে অপারেশন সহ বিকল্প পদ্ধতি:

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

1
এটি এক্সটেনশানটি ছাঁটাই করে না, যেমনটি বলা হয়েছিল।
জন ওয়াট

সংশোধন করা হয়েছে। ইঙ্গিতটির জন্য ধন্যবাদ!
vog

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>

নিম্নলিখিত ফলাফল আউটপুট হবে:

  • 'টেস্টকেস 1' নামের ফাইলটির এক্সটেনশন রয়েছে: 'জেপেইগ' ডিরেক্টরিতে রয়েছে: 'সি: \ ব্লেবলা \ ব্লিওবুয়েউ'
  • 'টেস্টকেস 2' নামের ফাইলটির এক্সটেনশান রয়েছে: 'পিএনজি' ডিরেক্টরিতে রয়েছে: '/ tmp / blabla'
  • 'টেস্টকেস 3' নামের ফাইলটির এক্সটেনশন রয়েছে: 'এইচটিএম' ডিরেক্টরিতে রয়েছে: ''
  • 'টেস্টকেস 4' নামের ডিরেক্টরিতে এক্সটেনশন রয়েছে: '' ডিরেক্টরিতে রয়েছে: 'সি:'
  • 'ফাইল উইথআউটডটস' নামের ডিরেক্টরিতে এক্সটেনশান রয়েছে: '' ডিরেক্টরিতে রয়েছে: '/dir.with.dots'
  • '' নামের নামের ডিরেক্টরিতে এক্সটেনশন রয়েছে: '' ডিরেক্টরিতে রয়েছে: '/dir.with.dots/another.dir'

এর সাথে && nOffset+1 === str.lengthযুক্ত হয়েছে isDirectory:

  • 'টেস্টকেস 1' নামের ফাইলটির এক্সটেনশন রয়েছে: 'জেপেইগ' ডিরেক্টরিতে রয়েছে: 'সি: \ ব্লেবলা \ ব্লিওবুয়েউ'
  • 'টেস্টকেস 2' নামের ফাইলটির এক্সটেনশান রয়েছে: 'পিএনজি' ডিরেক্টরিতে রয়েছে: '/ tmp / blabla'
  • 'টেস্টকেস 3' নামের ফাইলটির এক্সটেনশন রয়েছে: 'এইচটিএম' ডিরেক্টরিতে রয়েছে: ''
  • 'টেস্টকেস 4' নামের ডিরেক্টরিতে এক্সটেনশন রয়েছে: '' ডিরেক্টরিতে রয়েছে: 'সি:'
  • 'ফাইল উইথআউটডটস' নামের ডিরেক্টরিতে এক্সটেনশান রয়েছে: '' ডিরেক্টরিতে রয়েছে: '/dir.with.dots'
  • '' নামের নামের ডিরেক্টরিতে এক্সটেনশন রয়েছে: '' ডিরেক্টরিতে রয়েছে: '/dir.with.dots/another.dir'

টেস্টকেসগুলি দেওয়া আপনি দেখতে পাবেন যে এখানে অন্যান্য প্রস্তাবিত পদ্ধতির তুলনায় এই ফাংশনটি বেশ দৃ .়তার সাথে কাজ করে।

B: about সম্পর্কে নবাবিদের জন্য দ্রষ্টব্য হ'ল একটি পালানোর চরিত্র, উদাহরণস্বরূপ \ n এর অর্থ একটি নতুন লাইন এবং \ টা ট্যাব। Write n লিখতে এটি সম্ভব করার জন্য, আপনাকে অবশ্যই type n টাইপ করতে হবে।


1
এই পথটির জন্য সতর্কতা অবলম্বন করুন: dir.with.dots / fileWithoutDots আপনি ই-অফসেটের চেয়ে কম কম পাবেন এবং নিষ্কাশন অভিব্যক্তি গুলিয়ে ফেলবেন।
জেসি চিশলম

হ্যাঁ, এটি স্থির করুন। এখন এটিও ঠিকভাবে কাজ করা উচিত (যুক্ত && eOffset < nOffset)।
ইয়েতি

2

ইনপুট : C:\path\Filename.ext
আউটপুট :Filename

এইচটিএমএল কোডে ফাইলের 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
"একটি খুব সাধারণ নিয়মিত অভিব্যক্তি" ... আচ্ছা, আসলে এগুলি দুটি রেজিেক্সস। :-) আমার উত্তরটি একটি একক-রেজেক্স সমাধানের জন্য দেখুন।
vog

হ্যাঁ, পাইপ (|) অপারেটরটি ব্যবহার করে two দুটি রেইজেক্সকে একটি একক রেজেেক্সে প্যাক করার জন্য একটি স্পষ্টত পুনরায় লেখা রয়েছে। আমি মনে করি লিখিত কোডটি আরও পরিষ্কার, তবে এটি স্ট্রিংয়ের মধ্য দিয়ে দু'বার চলবে, যদি স্ট্রিংটি সাধারণত বেশ দীর্ঘ হয় তবে সমস্যা হবে। (ফাইলের পাথগুলি সাধারণত হয় না তবে তা হতে পারে))
জন ওয়াট

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>

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.