2012-06-02 135 views
115

我使用快递3在node.js中创建文件上传功能。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中图像的扩展名?

+0

http://stackoverflow.com/questions/10431845/node-js-file-system-get-file-type repeat? –

+1

是不是关于MIME类型的问题,我想要文件扩展名 – georgesamper

+1

@Jojje所以下定决心。标题*和*您的问题的正文要求一种辨别文件*类型*的方式。那么你的问题究竟是什么?告诉我们一些代码,告诉我们你期望它做什么,以及它在做什么。 –

回答

270

我相信你能做到以下获取文件的扩展名。

var path = require('path') 

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

只需要小心,它只会抓住最后一个点后面的字符,所以像'app.css.gz'这样的文件名只会返回'。 gz',而不是'.css.gz',这可能是也可能不是你想要的。 – xentek

+9

在这种情况下,只需使用'filename.split('。')。pop();' –

+7

@AamirAfridi返回相同的字符串,不带'.'。 – undefined

28

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

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

是的,这是有效的。只是认为使用节点会更容易。这是我做的:'var is = fs.createReadStream(req.files.upload.path),fileType = is.path.split(/ [。] + /)。pop();' – georgesamper

+5

你应该真的只是使用@ Snowfish的回答指出,路径模块并不是自己写的。更多信息:http://nodejs.org/api/path.html#path_path_extname_p – xentek

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

如果使用快递请配置中间件(bodyParser)

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

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一起使用。

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

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

var extension = arr[length-1]; 
+0

哪里有长度变量从哪里来? –

+1

尝试添加一些解释给你的答案。这样,OP可以真正理解你做了什么以及你为什么这样做。这样OP可以从你的答案中学习,而不仅仅是复制/粘贴它。 – Oldskool

5

而不需要需要一个简单的解决方案解决了多期延长问题:

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' 

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

8

此解决方案支持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' 
+0

如果文件名是'Mvv4bx8.something.else.jpg' –

+0

#Aamir Afridi仍在工作 – user956584

2

我的确认为在请求中映射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-- 

这名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类型

及其用法也很简单:

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

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