Node.js get file extension

后端 未结 13 888
后悔当初
后悔当初 2020-12-23 00:16

Im creating a file upload function in node.js with express 3.

I would like to grab the file extension of the image. so i can rename the file and then append the file

相关标签:
13条回答
  • 2020-12-23 00:42

    I believe you can do the following to get the extension of a file name.

    var path = require('path')
    
    path.extname('index.html')
    // returns
    '.html'
    
    0 讨论(0)
  • 2020-12-23 00:44

    Try this one

    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'));
    
    
    0 讨论(0)
  • 2020-12-23 00:45
    // you can send full url here
    function getExtension(filename) {
        return filename.split('.').pop();
    }
    

    If you are using express please add the following line when configuring middleware (bodyParser)

    app.use(express.bodyParser({ keepExtensions: true}));
    
    0 讨论(0)
  • 2020-12-23 00:45

    I do think mapping the Content-Type header in the request will also work. This will work even for cases when you upload a file with no extension. (when filename does not have an extension in the request)

    Assume you are sending your data using 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--
    

    Here name Content-Type header contains the mime type of the data. Mapping this mime type to an extension will get you the file extension :).

    Restify BodyParser converts this header in to a property with name type

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

    You can use this header and do the extension mapping (substring etc ...) manually, but there are also ready made libraries for this. Below two were the top results when i did a google search

    • mime
    • mime-types

    and their usage is simple as well:

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

    above snippet will print png to console.

    0 讨论(0)
  • 2020-12-23 00:49
    var fileName = req.files.upload.name;
    
    var arr = fileName.split('.');
    
    var extension = arr[length-1];
    
    0 讨论(0)
  • 2020-12-23 00:51

    Update

    Since the original answer, extname() has been added to the path module, see Snowfish answer

    Original answer:

    I'm using this function to get a file extension, because I didn't find a way to do it in an easier way (but I think there is) :

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

    you must require 'path' to use it.

    another method which does not use the path module :

    function getExtension(filename) {
        var i = filename.lastIndexOf('.');
        return (i < 0) ? '' : filename.substr(i);
    }
    
    0 讨论(0)
提交回复
热议问题