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}));
답변
& 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()
하지는 않습니다.
답변
이 솔루션은 쿼리 문자열을 지원합니다!
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'
답변
여러 기간 연장 문제를 해결하는 요구 사항이없는 간단한 솔루션 :
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'
파일 확장자가 있는지 테스트하십시오.
답변
요청에 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-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 를 콘솔에 인쇄 합니다.