NodeJS File Upload (Dosya Yükleme)
Herkese merhabalar bugun sizlerle beraber nodejs üzerinde multer paketini kullanarak sunucuya dosya yükleme işlemlerine bakıyor olacağız, uygulayacağımız küçük örnekte hem tek dosya hemde toplu dosya eklemeyi örneklendiriyor olacağız o zaman lafı fazla uzatmadan hemen başlayalım.
Proje Oluşturma;
npm init -y
npm install --save express
npm install --save cors
npm install --save body-parser
npm install --save multer
npm install --save nodemon
diyerek boş bir proje oluşturup içerisine exprees,cors,body-parser,nodemon,ve multer paketimizi kuruyoruz.
Yapılandırma;
Paketlerimizi kurduktan sonra öncelikle package.json dosyama gelip script kısmına
"start": "nodemon server.js"
start komutunu ekliyorum ve ardından server.js dosyamı oluşturuyorum.
Server.js dosyama gelip aşağıdakileri ekliyorum ve serveri 5652 numaralı portta dinleyeceğini belirtip hemen ardından app.js dosyamı oluşturuyorum
const http = require('http');const app = require('./app')const server = http.createServer(app);server.listen(5652)//ServerJS
App.js dosyamı oluşturmadan önce singleFileUpload.js dosyamı oluşturuyorum.
const multer = require('multer')const storage = multer.diskStorage({destination: function(req, file, cb) {cb(null, 'uploads')},filename: function(req, file, cb) {const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9)cb(null, file.fieldname + '-' + uniqueSuffix + "-" + file.originalname)}})const fileFilter = (req, file, cb) => {// if (file.mimetype == "image/png" || file.mimetype == "image/jpg" || file.mimetype == "image/jpeg") {// cb(null, true)// } else {// return cb(new Error('Dosya Türü Desteklenmiyor'), false);// }cb(null, true)}const upload = multer({ storage: storage, fileFilter: fileFilter }).single("file")module.exports = upload
öncelikle destinationımın uploads klasörü olacağını söylüyorum(Klasörü ben kendim elimle oluşturdum siz klasörün varlıgını kontrol edip eğer klasör yoksa bu klasörü oluştur diyebilirsiniz) daha sonra filename alanında unique(tekil) olacak şekilde bir dosya ismi oluşturuyorum siz dilerseniz (uuid) kullanabilirsiniz, daha sonra eğer isterseniz filteFilter diyerek dosya ile ilgili kontroller gerçekleştirilebilir örnek olması açısından resim dosyalarını destekleyen bir örnek bırakıp açıklama satırına aldım, ve ardından multer’a kullanacağı storage ve fileFilteri verip single olacağını (tek dosya yükleyeceğimizi) ve bunu api üzerinden gönderirken file adında göndereceğimizi belirtip export ediyoruz.
Şimdi App.js dosyamıza geçebiliriz
const express = require('express')const bodyParser = require('body-parser')const app = express();const path = require('path');const cors = require('cors')const singleFileUpload=require('./singleFileUpload')app.use(bodyParser.urlencoded({ extended: false }))app.use(bodyParser.json());app.use(cors());app.use('/uploads', express.static(path.join(__dirname, 'uploads')));app.post("/fileUpload",(req,res,next)=>{try {singleFileUpload(req, res, function(error) {if (error) {console.log("err",error)} else {res.json(req.file).status(200)}})} catch (error) {console.log("error",error)}})module.exports = app
App.js dosyamı ayarladıktan sonra npm start diyerek çalıştırıp Postman üzerinden bir istek atıyorum.
görmüş oldugunuz gibi isteğimi gönderdikten sonra dosyamız uploads klasörüne yüklenip geriye file ile ilgili bilgileri gönderiyoruz.
Şimdi gelelim çoklu dosya yüklemeye;
Çoklu dosya yüklemek için ise multipleFileUpload.js adında bir dosya oluşturuyorum.
const multer = require('multer')const storage = multer.diskStorage({destination: function (req, file, cb) {cb(null, 'uploads/')},filename: function (req, file, cb) {const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9)cb(null, file.fieldname + '-' + uniqueSuffix+ "-"+file.originalname)}})const fileFilter = (req, file, cb) => {// if (file.mimetype == "image/png" || file.mimetype == "image/jpg" || file.mimetype == "image/jpeg") {// cb(null, true)// } else {// return cb(new Error('Dosya Türü Desteklenmiyor'), false);// }cb(null, true)}const upload = multer({storage: storage, fileFilter: fileFilter}).array("files",10)module.exports = upload
ve singleFileUpload.js de yaptıklarımın aynısını yapıp bir farkla artık multer single değil array olacak diyorum sana gelecek olan api üzerindeki alan files olacak ve max 10 adet dosya kabul edeceksin dedikten sonra app.js dönüp yeni bir ekleme yapıyoruz.
const multipleUpload=require('./multipleFileUpload')app.post("/fileUploads",(req,res,next)=>{try {multipleUpload(req, res, function(error) {if (error) {console.log("err",error)} else {res.json(req.files).status(200)}})} catch (error) {console.log("error",error)}})
yeni end pointimizi tanımlayıp ardından Postman üzerinden test ediyoruz.
Herkese İyi Çalışmalar Dilerim.