[英]Node.js get file extension
我正在使用 express 3 在 node.js 中創建文件上傳 function。
我想獲取圖像的文件擴展名。 所以我可以重命名文件,然后 append 文件擴展名。
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中圖像的擴展名?
我相信您可以執行以下操作來獲取文件名的擴展名。
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'
更新
由於原始答案, 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);
}
// 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);
正如@xentek 在評論中指出的那樣, 2019 年 8 月更新; substr()
現在被認為是一個遺留函數( MDN 文檔)。 您可以改用substring()
。 substr()
和substring()
之間的區別在於 substr( substr()
的第二個參數是要返回的最大長度,而substring()
的第二個參數是要停止的索引(不包括該字符)。 此外, substr()
接受負的起始位置作為從字符串末尾的偏移量,而substring()
不接受。
此解決方案支持查詢字符串!
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'
一個不需要 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'
確保測試該文件是否也具有擴展名。
例如,您可以使用path.parse(path)
const path = require('path');
const { ext } = path.parse('/home/user/dir/file.txt');
我確實認為在請求中映射 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 }
}
您可以使用此標頭並手動執行擴展映射(子字符串等...),但也有現成的庫。 以下兩個是我進行谷歌搜索時的最佳結果
它們的用法也很簡單:
app.post('/upload2', function (req, res) {
console.log(mime.extension(req.files.image.type));
}
上面的代碼片段會將png打印到控制台。
import extname 以返回文件的擴展名:
import { extname } from 'path';
extname(file.originalname);
其中文件是表單的文件“名稱”
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];
以下函數拆分字符串並返回名稱和擴展名,無論擴展名中有多少個點。 如果沒有,它將為擴展返回一個空字符串。 以點和/或空格開頭的名稱也可以使用。
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')
試試這個
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'));
const path = require('path');
function getExt(str) {
const basename = path
.basename(str)
// Patch: for hidden files
// Removes all dots at the beginning of a line
.replace(/^(\.+)/i, '');
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;
}
const files = [
'/home/charlike/bar/.hidden.tar.gz~', // ".tar.gz"
'/home/charlike/bar/file.tar.gz~', // ".tar.gz"
'/home/charlike/bar/file.tar.gz+cdf2', // ".tar.gz"
'/home/charlike/bar/file.tar.gz?quz=zaz', // ".tar.gz"
];
const fileAndExt = files.map((file) => [ file, getExt(file) ]);
console.log(JSON.stringify(fileAndExt, null, 2));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.