নোড.জেগুলি ফাইল এক্সটেনশন পায়


209

আমি এক্সপ্রেস 3 সহ নোড.জেজে ফাইল আপলোড ফাংশন তৈরি করছি।

আমি চিত্রটির ফাইলের এক্সটেনশনটি দখল করতে চাই। সুতরাং আমি ফাইলটির পুনরায় নামকরণ করতে পারি এবং তারপরে এতে ফাইল এক্সটেনশন যুক্ত করতে পারি।

app.post('/upload', function(req, res, next) {
    var is = fs.createReadStream(req.files.upload.path),
        fileExt = '', // I want to get the extension of the image here
        os = fs.createWriteStream('public/images/users/' + req.session.adress + '.' + fileExt);
});

আমি কীভাবে নোড.জেজে চিত্রের প্রসার পেতে পারি?


1
stackoverflow.com/questions/10431845/… পুনরাবৃত্তি করবেন?
বিল অটোমেটা

3
মাইম-টাইপগুলি নিয়ে কি এটাই প্রশ্ন নয়, আমি ফাইলটি এক্সটেনশন চাই
জর্জেসাম্পার

উত্তর:


472

আমি বিশ্বাস করি যে কোনও ফাইলের নাম বাড়ানোর জন্য আপনি নিম্নলিখিতটি করতে পারেন।

var path = require('path')

path.extname('index.html')
// returns
'.html'

54
শুধু সাবধান হন, এটি কেবল শেষ বিন্দুর পরে অক্ষরগুলি দখল করবে, সুতরাং ফাইলের নামগুলি app.css.gzকেবল ফিরে আসবে .gzএবং না .css.gz, যা আপনি চান তা নাও পারে।
xentek

18
filename.split('.').pop();
আমির আফ্রিদি

12
@ আমিরআফ্রিদি যে একই স্ট্রিংটি কেবলমাত্র ছাড়াই প্রদান করে .
সংজ্ঞায়িত

13
সমস্ত এক্সটেনশানগুলি 'filename.css.gz'.split('.').slice(1).join('.')পাওয়ার চেষ্টা করুন
ট্রেভর

10
সাধারণত এক্সটেনশন শেষ হয়। এবং যখন আমরা তার চেয়ে বেশি প্রত্যাশা করি যেমন উদাহরণস্বরূপ টার.gz। এটি শেষ পর্যন্ত আছে কি না তা যাচাই করা ভাল। উদাহরণস্বরূপ regex ব্যবহার করে। "tar.gz $" বা এটি করে এমন একটি ফাংশন তৈরি করে। শেষ থেকে এটি পরীক্ষা করে ফিরে যাওয়া এবং দেখুন এটি সম্পূর্ণরূপে মেলে কিনা। এবং আপনার কাছে সেই ফাংশন থাকবে যা এক্সটেনশনটি পরীক্ষা করে। কেন? কারণ jone.lastTest.654654556.tar.gz এখানে ফাইলগুলির কী কী প্রত্যাশিত এক্সটেনশানটি টার্জেড হয় তবে আপনি যদি কোনও ফাংশন প্রয়োগ করেন যা ফর্মটি 1 ম বিন্দু দেয় তবে তা দেখতে পাবেন না
মোহাম্মদ আল্লাল

33

হালনাগাদ

আসল উত্তরটি থেকে, এক্সটামনেম ()path মডিউলে যুক্ত করা হয়েছে , স্নোফিশের উত্তর দেখুন

আসল উত্তর:

আমি একটি ফাইল এক্সটেনশান পেতে এই ফাংশনটি ব্যবহার করছি, কারণ আমি এটি সহজ উপায়ে করার উপায় খুঁজে পাই নি (তবে আমি মনে করি সেখানে আছে):

function getExtension(filename) {
    var ext = path.extname(filename||'').split('.');
    return ext[ext.length - 1];
}

এটি ব্যবহার করার জন্য আপনার অবশ্যই 'পথ' প্রয়োজন।

অন্য একটি পদ্ধতি যা পাথ মডিউলটি ব্যবহার করে না:

function getExtension(filename) {
    var i = filename.lastIndexOf('.');
    return (i < 0) ? '' : filename.substr(i);
}

4
হ্যাঁ যে কাজ করে। ভেবেছি নোড ব্যবহারের আরও সহজ উপায় হবে। আমি এটিই করেছি:var is = fs.createReadStream(req.files.upload.path), fileType = is.path.split(/[. ]+/).pop();
জর্জেসাম্পার

6
@ স্নোফিশের উত্তরটি নির্দেশ করে এবং আপনার নিজের লেখা না লিখে আপনার সত্যিই পাথ মডিউলটি ব্যবহার করা উচিত। আরও তথ্য: nodejs.org/api/path.html#path_path_extname_p
xentek

এবং ফাইলগুলি যখন এক্সটেনশন দেখায় না তখন কি হয় ??
ওল্ডবয়

19
// you can send full url here
function getExtension(filename) {
    return filename.split('.').pop();
}

আপনি যদি এক্সপ্রেস ব্যবহার করছেন তবে মিডলওয়্যার (বডি পার্সার) কনফিগার করার সময় দয়া করে নীচের লাইনটি যুক্ত করুন

app.use(express.bodyParser({ keepExtensions: true}));

12

& এর substr()পরিবর্তে পদ্ধতিটি ব্যবহার করা অনেক বেশি দক্ষsplit()pop()

এখানে পারফরম্যান্সের পার্থক্যগুলি একবার দেখুন: http://jsperf.com/remove-first-character-from-string

// returns: 'html'
var path = require('path');
path.extname('index.html').substr(1);

এখানে চিত্র বর্ণনা লিখুন

মন্তব্যগুলিতে @ xentek দ্বারা নির্দেশিত হিসাবে আগস্ট 2019 আপডেট করুন ; substr()এখন লিগ্যাসি ফাংশন ( MDN ডকুমেন্টেশন ) হিসাবে বিবেচনা করা হয়। substring()পরিবর্তে আপনি ব্যবহার করতে পারেন । substr()এবং এর মধ্যে পার্থক্যটি substring()হ'ল দ্বিতীয় আর্গুমেন্টটি substr()প্রত্যাবর্তনের সর্বাধিক দৈর্ঘ্য এবং এর দ্বিতীয় যুক্তিটি substring()সূচকটি (সেই চরিত্রটি অন্তর্ভুক্ত না করে) এ থামার জন্য। এছাড়াও, substr()স্ট্রিংয়ের শেষে থেকে অফসেট হিসাবে ব্যবহার করার জন্য নেতিবাচক শুরুর অবস্থানগুলি গ্রহণ substring()করে while


substrএটি একটি উত্তরাধিকারের ফাংশন হিসাবে বিবেচিত হওয়ার জন্য এখন একটি সতর্কতা রয়েছে এবং সম্ভব হলে এড়ানো উচিত - এমডিএন-এর আরও তথ্য
Core972

সাবস্ট্রাস্ট (১) পরীক্ষা করার সময় আপনারও পথের জন্য ব্যয় করা সময় বিবেচনা করা উচিত xtষত নাম
ইউজেনেকার

11

এই সমাধান কোয়েরিস্ট্রিংস সমর্থন করে!

var Url = require('url');
var Path = require('path');

var url = 'http://i.imgur.com/Mvv4bx8.jpg?querystring=true';
var result = Path.extname(Url.parse(url).pathname); // '.jpg'

6

প্রয়োজন ছাড়াই একটি সহজ সমাধান যা একাধিক সময়কালের এক্সটেনশন সমস্যার সমাধান করে:

var filename = 'file.with.long.extension';
var ext = filename.substring(filename.indexOf('.')); 
//ext = '.with.long.extension'

অথবা আপনি যদি শীর্ষস্থানীয় বিন্দুটি না চান:

var filename = 'file.with.long.extension';
var ext = filename.substring(filename.indexOf('.')+1); 
//ext = 'with.long.extension'

ফাইলটিরও এক্সটেনশন রয়েছে কিনা তা পরীক্ষা করে দেখুন।


4

আমি মনে করি অনুরোধে সামগ্রী-প্রকারের শিরোনামটি ম্যাপিংয়ের কাজও হবে। আপনি যখন কোনও এক্সটেনশন ছাড়াই কোনও ফাইল আপলোড করেন তখনও এটি ক্ষেত্রে কাজ করবে। (যখন ফাইলের নামের অনুরোধে এক্সটেনশন নেই)

ধরুন আপনি এইচটিটিপি পোস্ট ব্যবহার করে আপনার ডেটা প্রেরণ করছেন:

POST /upload2 HTTP/1.1
Host: localhost:7098
Connection: keep-alive
Content-Length: 1047799
Accept: */*
Origin: http://localhost:63342
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML,    like Gecko) Chrome/51.0.2704.106 Safari/537.36
Content-Type: multipart/form-data; boundary=----   WebKitFormBoundaryPDULZN8DYK3VppPp
Referer: http://localhost:63342/Admin/index.html? _ijt=3a6a054pasorvrljf8t8ea0j4h
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.8,az;q=0.6,tr;q=0.4
Request Payload
------WebKitFormBoundaryPDULZN8DYK3VppPp
Content-Disposition: form-data; name="image"; filename="blob"
Content-Type: image/png


------WebKitFormBoundaryPDULZN8DYK3VppPp--

এখানে নাম কন্টেন্ট-টাইপ শিরোনামে ডেটা মাইম টাইপ থাকে। এই মাইম টাইপটিকে কোনও এক্সটেনশনে ম্যাপিং করা আপনার ফাইলটি এক্সটেনশান পেয়ে যাবে :)।

বডি পার্সারকে পুনরায় আকার দিন এই শিরোনামটিকে নামের প্রকারের সাথে কোনও বৈশিষ্ট্যে রূপান্তর করে

File {
  domain: 
   Domain {
     domain: null,
     _events: { .... },
     _eventsCount: 1,
     _maxListeners: undefined,
     members: [ ... ] },
  _events: {},
  _eventsCount: 0,
  _maxListeners: undefined,
  size: 1047621,
  path: '/tmp/upload_2a4ac9ef22f7156180d369162ef08cb8',
  name: 'blob',
  **type: 'image/png'**,
  hash: null,
  lastModifiedDate: Wed Jul 20 2016 16:12:21 GMT+0300 (EEST),
  _writeStream: 
  WriteStream {
   ... },
     writable: true,
     domain: 
     Domain {
        ...
     },
      _events: {},
      _eventsCount: 0,
     _maxListeners: undefined,
     path: '/tmp/upload_2a4ac9ef22f7156180d369162ef08cb8',
     fd: null,
     flags: 'w',
     mode: 438,
     start: undefined,
     pos: undefined,
     bytesWritten: 1047621,
     closed: true } 
}

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

  • মূকাভিনয়
  • মাইম-ধরনের

এবং তাদের ব্যবহারও সহজ:

 app.post('/upload2', function (req, res) {
  console.log(mime.extension(req.files.image.type));
 }

উপরে স্নিপেট কনসোল থেকে png মুদ্রণ করবে ।


2
var fileName = req.files.upload.name;

var arr = fileName.split('.');

var extension = arr[length-1];

1
দৈর্ঘ্য পরিবর্তনশীল কোথা থেকে আসে?
এঞ্জেল এস মোরেনো

3
আপনার উত্তরে কিছু ব্যাখ্যা যুক্ত করার চেষ্টা করুন। এইভাবে, ওপি আসলে বুঝতে পারে যে আপনি কী করেছেন এবং আপনি কেন এটি করেছেন। এইভাবে ওপি আপনার উত্তরটি শিখতে পারে, কেবল এটি অনুলিপি / আটকানোর চেয়ে।
ওল্ডস্কুল

1

path.extnameবেশিরভাগ ক্ষেত্রে কৌতুক করবে। যাইহোক, এটিতে শেষের পরে সমস্ত কিছু অন্তর্ভুক্ত থাকবে ., এই জাতীয় কোনও HTTP অনুরোধের ক্যোরি স্ট্রিং এবং হ্যাশ খণ্ড সহ:

var path = require('path')
var extname = path.extname('index.html?username=asdf')
// extname contains '.html?username=asdf'

যেমন উদাহরণস্বরূপ, আপনি এই জাতীয় কিছু চেষ্টা করতে চাই:

var regex = /[#\\?]/g; // regex of illegal extension characters
var extname = path.extname('index.html?username=asdf');
var endOfExt = extname.search(regex);
if (endOfExt > -1) {
    extname = extname.substring(0, endOfExt);
}
// extname contains '.html'

নোট করুন যে একাধিক পিরিয়ড (যেমন .tar.gz) এর সাথে এক্সটেনশনগুলি মোটেই কার্যকর হবে না path.extname


0

নিম্নলিখিত ফাংশনটি স্ট্রিংকে বিভক্ত করে এবং এক্সটেনশনে যতগুলি বিন্দু রয়েছে তা নাম এবং এক্সটেনশানটি প্রদান করে। এটি যদি কিছু না থাকে তবে এটি এক্সটেনশনের জন্য একটি খালি স্ট্রিং দেয়। যে নামগুলি বিন্দু এবং / অথবা সাদা স্থানের কাজ দিয়ে শুরু হয়।

function basext(name) {
  name = name.trim()
  const match = name.match(/^(\.+)/)
  let prefix = ''
  if (match) {
    prefix = match[0]
    name = name.replace(prefix, '')
  }
  const index = name.indexOf('.')
  const ext = name.substring(index + 1)
  const base = name.substring(0, index) || ext
  return [prefix + base, base === ext ? '' : ext]
}

const [base, ext] = basext('hello.txt')

0

এক্সটেনশনটি ফাইলটি ফিরিয়ে আনার জন্য এক্সটামনেম আমদানি করুন:

import { extname } from 'path';
extname(file.originalname);

যেখানে ফাইলটি ফর্মের ফাইলের নাম


0

উদাহরণস্বরূপ আপনি path.parse (পাথ) ব্যবহার করতে পারেন

const path = require('path');
const { ext } = path.parse('/home/user/dir/file.txt');

0

আর একবার চেষ্টা কর

const path = require('path');

function getExt(str) {
  const basename = path.basename(str);
  const firstDot = basename.indexOf('.');
  const lastDot = basename.lastIndexOf('.');
  const extname = path.extname(basename).replace(/(\.[a-z0-9]+).*/i, '$1');

  if (firstDot === lastDot) {
    return extname;
  }

  return basename.slice(firstDot, lastDot) + extname;
}

// all are `.gz`
console.log(getExt('/home/charlike/bar/file.gz'));
console.log(getExt('/home/charlike/bar/file.gz~'));
console.log(getExt('/home/charlike/bar/file.gz+cdf2'));
console.log(getExt('/home/charlike/bar/file.gz?quz=zaz'));

// all are `.tar.gz`
console.log(getExt('/home/charlike/bar/file.tar.gz'));
console.log(getExt('/home/charlike/bar/file.tar.gz~'));
console.log(getExt('/home/charlike/bar/file.tar.gz+cdf2'));
console.log(getExt('/home/charlike/bar/file.tar.gz?quz=zaz'));
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.