Programing

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

crosscheck 2020. 5. 31. 10:04
반응형

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

반응형