Node.js 파일 확장명 가져 오기
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에서 이미지의 확장자를 어떻게 얻을 수 있습니까?
파일 이름의 확장자를 얻으려면 다음을 수행 할 수 있다고 생각합니다.
var path = require('path')
path.extname('index.html')
// returns
'.html'
최신 정보
원래 답변 extname () 이 path
모듈 에 추가 되었으므로 Snowfish 답변을 참조하십시오.
원래 답변 :
이 기능을 사용하여 파일 확장명을 얻는 것이 더 쉬운 방법을 찾지 못했기 때문에 파일 확장자를 얻습니다.
function getExtension(filename) {
var ext = path.extname(filename||'').split('.');
return ext[ext.length - 1];
}
사용하려면 'path'가 필요합니다.
경로 모듈을 사용하지 않는 다른 방법 :
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}));
이 솔루션은 쿼리 문자열을 지원합니다!
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'
& 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 documentation ). substring()
대신 사용할 수 있습니다 . 차이 substr()
와 substring()
두 번째 인자이다 substr()
번째 인수하면서 반환하는 최대 길이 substring()
의 정지 인덱스 (즉 문자를 포함하지 않음). 또한 substr()
음수 시작 위치를 허용하지만 문자열의 끝에서 오프셋으로 사용 substring()
하지는 않습니다.
A simple solution without need for require which solves the multiple period extension problem:
var filename = 'file.with.long.extension';
var ext = filename.substring(filename.indexOf('.'));
//ext = '.with.long.extension'
Or if you don't want the leading dot:
var filename = 'file.with.long.extension';
var ext = filename.substring(filename.indexOf('.')+1);
//ext = 'with.long.extension'
Make sure to test that the file has an extension too.
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.
var fileName = req.files.upload.name;
var arr = fileName.split('.');
var extension = arr[length-1];
path.extname
will do the trick in most cases. However, it will include everything after the last .
, including the query string and hash fragment of an http request:
var path = require('path')
var extname = path.extname('index.html?username=asdf')
// extname contains '.html?username=asdf'
In such instances, you'll want to try something like this:
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'
Note that extensions with multiple periods (such as .tar.gz
), will not work at all with path.extname
.
다음 함수는 확장에 점이 몇 개 있더라도 문자열을 분할하고 이름과 확장명을 반환합니다. 확장이 없으면 빈 문자열을 반환합니다. 점 및 / 또는 공백으로 시작하는 이름도 작동합니다.
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);
여기서 file은 양식의 파일 'name'입니다.
참고 URL : https://stackoverflow.com/questions/10865347/node-js-get-file-extension
'Programing' 카테고리의 다른 글
C에서 포인터에 대한 포인터는 어떻게 작동합니까? (0) | 2020.05.31 |
---|---|
HttpResponseMessage 객체에 내용을 넣습니까? (0) | 2020.05.31 |
cat을 사용하여 파일의 첫 줄을 어떻게 읽습니까? (0) | 2020.05.31 |
Python "SyntaxError : 파일의 ASCII가 아닌 문자 '\ xe2'" (0) | 2020.05.31 |
sed에서 환경 변수 대체 (0) | 2020.05.31 |