获取文件扩展名

我用express 3在node.js中创建了一个文件上传函数。

我想抓取图像的文件扩展名。所以我可以重命名文件,然后附加文件扩展名。

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

如何在node.js中获得图像的扩展名?

306065 次浏览

更新

从最初的答案开始,extname ()已经被添加到path模块中,参见雪鱼的答案

最初的回答:

我使用这个函数来获得文件扩展名,因为我没有找到一种更简单的方法(但我认为有):

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

你必须要求'path'才能使用它。

另一个不使用path模块的方法:

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

我相信您可以执行以下操作来获取文件名的扩展名。

var path = require('path')


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

如果你想获得一个文件名中的所有扩展名(例如filename.css.gz =>css.gz),试试这个:

const ext = 'filename.css.gz'
.split('.')
.filter(Boolean) // removes empty extensions (e.g. `filename...txt`)
.slice(1)
.join('.')


console.log(ext) // prints 'css.gz'
// you can send full url here
function getExtension(filename) {
return filename.split('.').pop();
}

如果您正在使用express,请在配置中间件时添加以下行(bodyParser)

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

使用substr()方法比使用split() &pop()

看看这里的性能差异:http://jsperf.com/remove-first-character-from-string

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

enter image description here

2019年8月更新 正如@xentek在评论中指出的那样;substr()现在被认为是遗留函数(MDN文档)。你可以使用substring()代替。substr()substring()的区别在于substr()的第二个参数是要返回的最大长度,而substring()的第二个参数是要停止的索引(不包括该字符)。此外,substr()接受负的起始位置作为字符串结束的偏移量,而substring()不接受

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

var fileName = req.files.upload.name;


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


var extension = arr[length-1];

一个简单的解决方案,不需要require,解决了多个周期的扩展问题:

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'

确保测试文件也有扩展名。

这个解决方案支持查询字符串!

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'
我确实认为在请求中映射Content-Type头也可以工作。这将工作的情况下,即使你上传的文件没有扩展名。 (当文件名在请求中没有扩展名时)

假设您正在使用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--

这里name Content-Type头包含数据的mime类型。 将此mime类型映射到扩展名将得到文件扩展名:)

Restify BodyParser将此头文件转换为名称为类型的属性

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

你可以使用这个头文件并手动进行扩展映射(子字符串等),但也有现成的库。下面两个是我做谷歌搜索时最重要的结果

  • mime
  • mime类型

它们的用法也很简单:

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

上面的代码段将打印png到控制台。

下面的函数分割字符串并返回名称和扩展名,无论扩展名中有多少个点。如果没有扩展名,则返回空字符串。以点和/或空格开头的名字也可以。

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')

导入extname以返回文件的扩展名:

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

表格的文件名称在哪里

例如,你可以使用path.parse(路径)

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

试试这个

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'));


扩展String.prototype的一行代码:

Object.defineProperty(String.prototype, "ext", {get: function(x) {return this.split('.').pop()}})
str = 'fox.fbx';
str.ext

结果:

enter image description here