Node.js 파일 확장명 가져 오기


209

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에서 이미지의 확장자를 어떻게 얻을 수 있습니까?



3
mime-types에 관한 질문은 아닙니다. 파일 확장자를 원합니다
georgesamper

답변:


472

파일 이름의 확장자를 얻으려면 다음을 수행 할 수 있다고 생각합니다.

var path = require('path')

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

54
마지막 점 뒤에 문자 만 가져 오므로주의하십시오. 따라서 같은 파일 이름 app.css.gz은 반환 .gz되지 않고 .css.gz원하지 않을 수도 있습니다.
xentek

18
이 경우 간단히 사용하십시오filename.split('.').pop();
Aamir Afridi

12
@AamirAfridi .. 없이 동일한 문자열을 반환합니다 .
정의되지 않은

13
시도 'filename.css.gz'.split('.').slice(1).join('.')얻기 위해 모든 확장
트레버

10
일반적으로 확장은 마지막 확장입니다. 예를 들어 tar.gz와 같이 하나 이상을 기대할 때. 마지막에 존재하는지 확인하는 것이 좋습니다. 예를 들어 정규식을 사용합니다. "tar.gz $"또는이를 수행하는 함수를 빌드하여. 끝에서 확인하고 돌아가서 완전히 일치하는지 확인하십시오. 확장을 확인하는 기능이 있습니다. 왜? jone.lastTest.654654556.tar.gz 여기에 예상되는 확장자는 tar.gz이지만 파일에 1 점을 제공하는 함수를 적용하면 알 수없는 것처럼 작동하지 않습니다.
Mohamed Allal

33

최신 정보

원래 답변 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);
}

4
그래 그게 효과가있어 노드를 사용하는 더 쉬운 방법이 있다고 생각했습니다. 이것이 내가 한 일이다 :var is = fs.createReadStream(req.files.upload.path), fileType = is.path.split(/[. ]+/).pop();
georgesamper 2016 년

6
@Snowfish의 답변에서 지적했듯이 직접 경로 모듈을 사용해야하며 직접 작성하지 마십시오. 추가 정보 : nodejs.org/api/path.html#path_path_extname_p
xentek

파일이 확장명을 표시하지 않는 경우는 어떻습니까 ??
oldboy

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

express를 사용하는 경우 미들웨어 (bodyParser)를 구성 할 때 다음 행을 추가하십시오

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

12

& 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()하지는 않습니다.


에 대한 경고가 지금있다 substr- 그것이 기존의 기능으로 간주되며 가능하면 피해야한다 MDN에 대한 정보
Core972

SUBSTR을 수행 할 때 (1) 테스트 당신은 또한 path.extname에 대한 지출을 고려하여 시간에해야
eugenekr

11

이 솔루션은 쿼리 문자열을 지원합니다!

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'

6

여러 기간 연장 문제를 해결하는 요구 사항이없는 간단한 솔루션 :

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'

파일 확장자가 있는지 테스트하십시오.


4

요청에 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 를 콘솔에 인쇄 합니다.


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

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

var extension = arr[length-1];

1
길이 변수는 어디에서 왔습니까?
Angel S. Moreno

3
답변에 설명을 추가하십시오. 그러면 OP는 실제로 수행 한 작업과 수행 한 이유를 이해할 수 있습니다. 이렇게하면 OP가 복사 / 붙여 넣기가 아니라 답변에서 배울 수 있습니다.
Oldskool

1

path.extname대부분의 경우 트릭을 수행합니다. 그러나 .http 요청의 쿼리 문자열 및 해시 조각을 포함하여 last 이후의 모든 항목이 포함됩니다 .

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.


0

다음 함수는 확장에 점이 몇 개 있더라도 문자열을 분할하고 이름과 확장명을 반환합니다. 확장이 없으면 빈 문자열을 반환합니다. 점 및 / 또는 공백으로 시작하는 이름도 작동합니다.

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

0

확장자를 파일로 리턴하려면 extname을 가져 오십시오.

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

여기서 file은 양식의 파일 'name'입니다.


0

예를 들어 path.parse (path) 사용할 수 있습니다

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

0

이거 한번 해봐

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'));
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.