Node.js mendapatkan ekstensi file

209

Saya membuat fungsi unggah file di node.js dengan express 3.

Saya ingin mengambil ekstensi file gambar. jadi saya bisa mengganti nama file dan kemudian menambahkan ekstensi file untuk itu.

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

Bagaimana saya bisa mendapatkan ekstensi gambar di node.js?

georgesamper
sumber
1
stackoverflow.com/questions/10431845/... ulangi?
tagihan automata
3
Bukankah itu pertanyaan tentang tipe-pantomim, saya ingin ekstensi file
georgesamper

Jawaban:

473

Saya yakin Anda dapat melakukan hal berikut untuk mendapatkan ekstensi nama file.

var path = require('path')

path.extname('index.html')
// returns
'.html'
Snowfish
sumber
54
Hanya hati-hati, itu hanya akan mengambil karakter setelah titik terakhir, jadi nama file seperti app.css.gzhanya akan kembali .gzdan tidak .css.gz, yang mungkin atau mungkin tidak seperti yang Anda inginkan.
xentek
18
Dalam hal ini, cukup gunakanfilename.split('.').pop();
Aamir Afridi
12
@ AmirAfridi Itu mengembalikan string yang sama hanya tanpa ..
undefined
13
Cobalah 'filename.css.gz'.split('.').slice(1).join('.')untuk mendapatkan semua ekstensi
Trevor
10
Umumnya ekstensi adalah yang terakhir. Dan untuk saat kita mengharapkan lebih dari satu, seperti tar.gz misalnya. lebih baik untuk memeriksa apakah ada pada akhirnya atau tidak. menggunakan regex misalnya. "tar.gz $" atau dengan membangun fungsi yang melakukan itu. seperti memeriksa itu dari akhir dan kembali dan melihat apakah itu benar-benar cocok. dan Anda akan memiliki fungsi yang memeriksa ekstensi. MENGAPA? karena bagaimana dengan file seperti di jone.lastTest.654654556.tar.gz sini ekstensi yang diharapkan adalah tar.gz tetapi jika Anda menerapkan fungsi apa pun yang memberikan bentuk 1 titik, itu tidak akan berfungsi seperti yang Anda lihat
Mohamed Allal
33

Memperbarui

Karena jawaban awal, extname () telah ditambahkan ke pathmodul, lihat jawaban Snowfish

Jawaban asli:

Saya menggunakan fungsi ini untuk mendapatkan ekstensi file, karena saya tidak menemukan cara untuk melakukannya dengan cara yang lebih mudah (tapi saya rasa ada):

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

Anda harus meminta 'jalur' untuk menggunakannya.

metode lain yang tidak menggunakan modul path:

function getExtension(filename) {
    var i = filename.lastIndexOf('.');
    return (i < 0) ? '' : filename.substr(i);
}
dievardump
sumber
4
Ya itu berhasil. Hanya berpikir akan ada cara yang lebih mudah menggunakan simpul. Inilah yang saya lakukan:var is = fs.createReadStream(req.files.upload.path), fileType = is.path.split(/[. ]+/).pop();
georgesamper
6
Anda harus benar-benar hanya menggunakan modul path, seperti yang ditunjukkan oleh jawaban Snowfish, dan bukan menulis sendiri. Info lebih lanjut: nodejs.org/api/path.html#path_path_extname_p
xentek
dan bagaimana ketika file tidak menampilkan ekstensi ??
oldboy
19
// you can send full url here
function getExtension(filename) {
    return filename.split('.').pop();
}

Jika Anda menggunakan express, tambahkan baris berikut saat mengkonfigurasi middleware (bodyParser)

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

Jauh lebih efisien menggunakan substr()metode daripada split()&pop()

Lihat perbedaan kinerja di sini: http://jsperf.com/remove-first-character-from-string

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

masukkan deskripsi gambar di sini

Pembaruan Agustus 2019 Seperti yang ditunjukkan oleh @xentek di komentar; substr()sekarang dianggap sebagai fungsi warisan ( dokumentasi MDN ). Anda bisa menggunakannya substring(). Perbedaan antara substr()dan substring()adalah bahwa argumen kedua substr()adalah panjang maksimum untuk kembali sedangkan argumen kedua substring()adalah indeks untuk berhenti (tanpa termasuk karakter itu). Juga, substr()menerima posisi awal negatif untuk digunakan sebagai offset dari ujung string sementara substring()tidak.

pembuat magik
sumber
Ada peringatan sekarang karena substritu dianggap sebagai fungsi warisan dan harus dihindari jika memungkinkan - Informasi lebih lanjut tentang MDN
Core972
Saat melakukan tes substr (1), Anda juga harus mempertimbangkan waktu yang dihabiskan untuk path.extname
eugenekr
11

Solusi ini mendukung querystrings!

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'
aleclarson
sumber
6

Solusi sederhana tanpa perlu untuk yang memecahkan masalah ekstensi beberapa periode:

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

Atau jika Anda tidak ingin titik utama:

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

Pastikan untuk menguji apakah file tersebut juga memiliki ekstensi.

smileham
sumber
4

Saya pikir pemetaan header Tipe-Konten dalam permintaan juga akan berfungsi. Ini akan berfungsi bahkan untuk kasus-kasus ketika Anda mengunggah file tanpa ekstensi. (saat nama file tidak memiliki ekstensi dalam permintaan)

Anggap Anda mengirim data Anda menggunakan 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--

Di sini nama Content-Type header berisi tipe pantomim data. Memetakan tipe mime ini ke ekstensi akan membuat Anda mendapatkan ekstensi file :).

Restify BodyParser mengonversi tajuk ini menjadi properti dengan jenis nama

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

Anda dapat menggunakan header ini dan melakukan pemetaan ekstensi (substring dll ...) secara manual, tetapi ada juga pustaka siap pakai untuk ini. Di bawah dua adalah hasil teratas ketika saya melakukan pencarian google

  • pantomim
  • tipe pantomim

dan penggunaannya juga sederhana:

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

cuplikan di atas akan mencetak png ke konsol.

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

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

var extension = arr[length-1];
rajesh
sumber
1
dari mana variabel panjang berasal?
Angel S. Moreno
3
Cobalah untuk menambahkan penjelasan pada jawaban Anda. Dengan begitu, OP dapat benar-benar memahami apa yang Anda lakukan dan mengapa Anda melakukan ini. Dengan begitu OP dapat belajar dari jawaban Anda, bukan hanya menyalin / menempelnya.
Oldskool
1

path.extnameakan melakukan trik dalam banyak kasus. Namun, itu akan mencakup semuanya setelah yang terakhir ., termasuk string kueri dan fragmen hash dari permintaan http:

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

Dalam keadaan seperti itu, Anda ingin mencoba sesuatu seperti ini:

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'

Perhatikan bahwa ekstensi dengan beberapa periode (seperti .tar.gz), tidak akan berfungsi sama sekali path.extname.

menggali
sumber
0

Fungsi berikut memecah string dan mengembalikan nama dan ekstensi tidak peduli berapa banyak titik yang ada di ekstensi. Ini mengembalikan string kosong untuk ekstensi jika tidak ada. Nama yang dimulai dengan titik dan / atau ruang putih juga berfungsi.

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')
Vidar
sumber
0

impor extname untuk mengembalikan ekstensi file:

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

dimana file adalah file 'nama' form

Vitalitas
sumber
0

Anda dapat menggunakan path.parse (path) , misalnya

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

Coba yang ini

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'));
tunnckoCore
sumber