Node.js dosya uzantısı


209

Im express 3 ile node.js dosya yükleme işlevi oluşturma.

Resmin dosya uzantısını almak istiyorum. böylece dosyayı yeniden adlandırabilir ve daha sonra dosya uzantısını ekleyebilirsiniz.

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'de resmin uzantısını nasıl alabilirim?



3
Mime türleri hakkında bu soru değil, dosya uzantısını istiyorum
georgesamper

Yanıtlar:


473

Bir dosya adının uzantısını almak için aşağıdakileri yapabileceğinize inanıyorum.

var path = require('path')

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

54
Sadece dikkatli olun, sadece son noktadan sonra karakterleri alacaktır, bu nedenle gibi dosya adları app.css.gzsadece geri döner .gzve dönmez .css.gz, bu da istediğiniz gibi olabilir veya olmayabilir.
xentek

18
Bu durumda, sadece şunu kullanınfilename.split('.').pop();
Aamir Afridi

12
@AamirAfridi Bu, aynı dizeyi ..
undefined

13
Tüm uzantıları 'filename.css.gz'.split('.').slice(1).join('.')almaya çalışın
Trevor

10
Genellikle uzantı sonuncusudur. Ve mesela tar.gz gibi birinden daha fazlasını beklediğimizde. sonunda olup olmadığını kontrol etmek daha iyidir. regex kullanarak. "tar.gz $" veya bunu yapan bir işlev oluşturarak. bunu sonuna kadar kontrol edip geri dönüp tamamen eşleşip eşleşmediğini görmek gibi. ve uzantıyı kontrol eden bir işleve sahip olacaksınız. NEDEN? çünkü jone.lastTest.654654556.tar.gz buradaki dosyalar hakkında beklenen uzantı tar.gz'dir, ancak 1. nokta veren herhangi bir işlev uygularsanız, gördüğünüz gibi çalışmaz
Mohamed Allal

33

Güncelleme

Modüle orijinal yanıt olan extname () eklendiğinden path, Snowfish yanıtı bölümüne bakın.

Orijinal cevap:

Bir dosya uzantısı almak için bu işlevi kullanıyorum, çünkü daha kolay bir şekilde yapmak için bir yol bulamadık (ama sanırım):

function getExtension(filename) {
    var ext = path.extname(filename||'').split('.');
    return ext[ext.length - 1];
}

kullanmak için 'yol' gerekir.

yol modülünü kullanmayan başka bir yöntem:

function getExtension(filename) {
    var i = filename.lastIndexOf('.');
    return (i < 0) ? '' : filename.substr(i);
}

4
Evet, işe yarıyor. Düğümü kullanmanın daha kolay bir yolu olacağını düşündüm. var is = fs.createReadStream(req.files.upload.path), fileType = is.path.split(/[. ]+/).pop();
Yaptığım

6
@ Snowfish'in cevabının işaret ettiği ve kendi yazdığınız gibi, sadece yol modülünü kullanmalısınız. Daha fazla bilgi: nodejs.org/api/path.html#path_path_extname_p
xentek

ve ne zaman dosyaları uzantıları gösteren öyle değil mi ??
oldboy

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

Express kullanıyorsanız, ara katman yazılımını (bodyParser) yapılandırırken lütfen aşağıdaki satırı ekleyin

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

12

substr()Yöntemi kullanmak yerine split()&pop()

Performans farklılıklarına bir göz atın: http://jsperf.com/remove-first-character-from-string

// returns: 'html'
var path = require('path');
path.extname('index.html').substr(1);

resim açıklamasını buraya girin

Güncelleme Ağustos 2019 @xentek tarafından yorumlarda belirtildiği gibi; substr()artık eski bir işlev olarak kabul edilmektedir ( MDN belgeleri ). Bunun substring()yerine kullanabilirsiniz . Arasındaki fark substr()ve substring()ikinci bağımsız değişken olmasıdır substr()ikinci bağımsız değişken ise geri maksimum uzunluğu substring()durağında dizin (yani bir karakteri içeren olmadan). Ayrıca, substr()dizenin sonundan öteleme olarak kullanılacak negatif başlangıç ​​konumlarını kabul substring()etmez, kabul etmez.


Artık substreski bir işlev olarak kabul edildiğinden ve mümkün olduğunda kaçınılması gereken bir uyarı var - MDN hakkında daha fazla bilgi
Core972 10

Substr (1) testi yaparken, path.extname için harcanan zamanı da dikkate almalısınız
eugenekr

11

Bu çözüm sorgu dizelerini destekler!

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

Çoklu dönem uzatma problemini çözen, ihtiyaç duymadan basit bir çözüm:

var filename = 'file.with.long.extension';
var ext = filename.substring(filename.indexOf('.')); 
//ext = '.with.long.extension'

Veya önde gelen noktayı istemiyorsanız:

var filename = 'file.with.long.extension';
var ext = filename.substring(filename.indexOf('.')+1); 
//ext = 'with.long.extension'

Dosyanın da bir uzantısı olduğunu test ettiğinizden emin olun.


4

İstekte İçerik Türü başlığının eşleştirilmesinin de işe yarayacağını düşünüyorum. Bu, uzantısız bir dosya yüklediğiniz durumlarda bile işe yarar. (dosya adının istekte bir uzantısı yoksa)

Verilerinizi HTTP POST kullanarak gönderdiğinizi varsayın:

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

Burada ad Content-Type üstbilgisi, verilerin mime türünü içerir. Bu mime türünü bir uzantıyla eşleştirmek size dosya uzantısını sağlar :).

BodyParser, bu üstbilgiyi ad türündeki bir özelliğe dönüştürür

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 } 
}

Bu üstbilgiyi kullanabilir ve uzantı eşlemesini (alt dize vb.) Elle yapabilirsiniz, ancak bunun için hazır kütüphaneler de vardır. Google arama yaptığımda en iyi iki sonuç aşağıdaydı

  • mim
  • mim-tipleri

ve kullanımları da basittir:

 app.post('/upload2', function (req, res) {
  console.log(mime.extension(req.files.image.type));
 }

yukarıdaki pasaj, konsola png basacaktır .


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

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

var extension = arr[length-1];

1
length değişkeni nereden geliyor?
Angel S. Moreno

3
Cevabınıza bir açıklama eklemeye çalışın. Bu şekilde OP aslında ne yaptığınızı ve bunu neden yaptığınızı anlayabilir. Bu şekilde OP, yalnızca kopyalamak / yapıştırmak yerine cevabınızdan öğrenebilir.
Oldskool

1

path.extnameçoğu durumda hile yapacak. Ancak, .bir http isteğinin sorgu dizesi ve karma parçası da dahil olmak üzere sondan sonraki her şeyi içerir :

var path = require('path')
var extname = path.extname('index.html?username=asdf')
// extname contains '.html?username=asdf'

Bu gibi durumlarda, böyle bir şey denemek isteyeceksiniz:

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'

Birden fazla periyodu olan uzantılar (örneğin .tar.gz) ile hiç çalışmaz path.extname.


0

Aşağıdaki işlev dizeyi böler ve uzantıda kaç nokta olursa olsun adı ve uzantıyı döndürür. Hiçbiri yoksa uzantı için boş bir dize döndürür. Nokta ve / veya boşluk ile başlayan isimler de işe yarar.

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

uzantıyı dosyaya döndürmek için extname dosyasını içe aktarın:

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

burada dosya formun 'adı' dosyasıdır


0

Path.parse (yol) kullanabilirsiniz , örneğin

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

0

Bunu dene

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'));
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.