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.