Node.js को फ़ाइल एक्सटेंशन मिलता है


209

Im व्यक्त 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);
});

मैं नोड.जेएस में छवि का विस्तार कैसे प्राप्त कर सकता हूं?



3
ऐसा नहीं है कि के बारे में माइम-प्रकार सवाल है, मैं फाइल एक्सटेंशन चाहते है
georgesamper

जवाबों:


472

मेरा मानना ​​है कि आप फ़ाइल नाम का विस्तार प्राप्त करने के लिए निम्नलिखित कर सकते हैं।

var path = require('path')

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

54
बस सावधान रहें, यह केवल अंतिम बिंदु के बाद वर्णों को पकड़ लेगा, इसलिए फ़ाइल नाम app.css.gzकेवल वापस आ जाएंगे .gzऔर नहीं .css.gz, जो आप चाहते हैं या नहीं हो सकता है।
xentek

18
उस मामले में, बस का उपयोग करेंfilename.split('.').pop();
आमिर अफरीदी

12
@AamirAfridi वही स्ट्रिंग लौटाता है जिसके बिना .
अपरिष्कृत

13
सभी एक्सटेंशन 'filename.css.gz'.split('.').slice(1).join('.')पाने की कोशिश करें
ट्रेवर

10
आम तौर पर विस्तार अंतिम होता है। और जब हम और अधिक की उम्मीद कर रहे हैं, तो उदाहरण के लिए tar.gz की तरह। यह जांचना बेहतर है कि यह अंत में मौजूद है या नहीं। उदाहरण के लिए रेगेक्स का उपयोग करना। "tar.gz $" या ऐसा फ़ंक्शन बनाने के लिए जो ऐसा करता है। जैसे कि अंत से जाँच करना और वापस जाना और देखें कि क्या यह पूरी तरह से मेल खाता है। और आपके पास वह फ़ंक्शन होगा जो एक्सटेंशन की जांच करेगा। क्यों? क्योंकि jone.lastTest.654654556.tar.gz यहाँ फ़ाइलों के बारे में क्या है जो विस्तार की उम्मीद की जा रही है, tar.gz है, लेकिन यदि आप किसी भी फ़ंक्शन को फॉर्म 1 डॉट देते हैं, तो यह काम नहीं करेगा जैसा कि आप देख सकते हैं
मोहम्मद अल्ल

33

अपडेट करें

चूंकि मूल उत्तर, extname ()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);

यहां छवि विवरण दर्ज करें

अगस्त 2019 अपडेट करें जैसा कि टिप्पणियों में @xentek द्वारा बताया गया है; substr()अब एक विरासत समारोह ( MDN प्रलेखन ) माना जाता है । आप substring()इसके बजाय उपयोग कर सकते हैं । के बीच अंतर है substr()और substring()यह है कि दूसरे तर्क की substr()वापसी की अधिकतम लंबाई है, जबकि दूसरा तर्क substring()सूचकांक को "चरित्र सहित" (बिना) को रोकने के लिए है। इसके अलावा, substr()स्ट्रिंग के अंत से ऑफसेट के रूप में उपयोग किए जाने वाले नकारात्मक प्रारंभ पदों को स्वीकार substring()नहीं करता है।


substrइसके लिए एक चेतावनी है कि इसे एक विरासत समारोह माना जाता है और जब संभव हो तो इसे टाला जाना चाहिए - MDN पर अधिक जानकारी
Core972

जब रूट (1) टेस्ट कर रहे हों, तो आपको पथ के लिए बिताए समय पर भी ध्यान देना चाहिए। customname
eugenekr

11

यह समाधान querystrings का समर्थन करता है!

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

मुझे लगता है कि अनुरोध में सामग्री-प्रकार के हेडर को मैप करना भी काम करेगा। यह उन मामलों के लिए भी काम करेगा जब आप किसी एक्सटेंशन के साथ फाइल अपलोड करते हैं। (जब फ़ाइलनाम में अनुरोध में एक्सटेंशन नहीं है)

मान लें कि आप HTTP POST का उपयोग करके अपना डेटा भेज रहे हैं:

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 } 
}

आप इस शीर्ष लेख का उपयोग कर सकते हैं और मैन्युअल रूप से विस्तार (मैपिंग आदि ...) कर सकते हैं, लेकिन इसके लिए तैयार पुस्तकालय भी हैं। जब मैंने Google खोज की थी तो नीचे दो शीर्ष परिणाम थे

  • अंगविक्षेप
  • माइम-प्रकार

और उनका उपयोग सरल है:

 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

फ़ाइल को एक्सटेंशन वापस करने के लिए extname आयात करें:

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

फ़ाइल फॉर्म का 'फ़ाइल' नाम है



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'));
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.