{"id":31852,"date":"2025-10-14T21:41:15","date_gmt":"2025-10-14T18:41:15","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=31852"},"modified":"2025-10-14T21:41:15","modified_gmt":"2025-10-14T18:41:15","slug":"node-js-express-ve-multer-kullanarak-resim-yukleme-kapsamli-bir-rehber","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/node-js-express-ve-multer-kullanarak-resim-yukleme-kapsamli-bir-rehber\/","title":{"rendered":"Node.js, Express ve Multer Kullanarak Resim Y\u00fckleme: Kapsaml\u0131 Bir Rehber"},"content":{"rendered":"<p><body><\/p>\n<h2>Node.js, Express ve Multer Kullanarak Resim Y\u00fckleme: Kapsaml\u0131 Bir Rehber<\/h2>\n<p>Modern web uygulamalar\u0131n\u0131n vazge\u00e7ilmez bir par\u00e7as\u0131 olan dosya y\u00fckleme, kullan\u0131c\u0131lar\u0131n i\u00e7erik olu\u015fturmas\u0131na, profillerini ki\u015fiselle\u015ftirmesine ve zengin medya deneyimleri sunmas\u0131na olanak tan\u0131r. \u00d6zellikle resim y\u00fckleme, e-ticaret sitelerinden sosyal medya platformlar\u0131na, bloglardan portf\u00f6y sitelerine kadar bir\u00e7ok uygulaman\u0131n temel bir gereksinimidir. Bu s\u00fcre\u00e7, hem sunucu taraf\u0131nda g\u00fcvenli ve verimli bir \u015fekilde dosya i\u015fleme hem de istemci taraf\u0131nda kullan\u0131c\u0131 dostu bir aray\u00fcz sunma yetene\u011fi gerektirir. Node.js ekosistemi, bu t\u00fcr g\u00f6revleri yerine getirmek i\u00e7in g\u00fc\u00e7l\u00fc ara\u00e7lar sunar. Express.js, hafif ve esnek bir web \u00e7at\u0131s\u0131 olarak sunucu taraf\u0131 mant\u0131\u011f\u0131n\u0131 kurmay\u0131 kolayla\u015ft\u0131r\u0131rken, Multer k\u00fct\u00fcphanesi \u00f6zellikle <code>multipart\/form-data<\/code> format\u0131ndaki dosya y\u00fcklemelerini ele almak i\u00e7in tasarlanm\u0131\u015f bir ara yaz\u0131l\u0131md\u0131r.<\/p>\n<p>Bu kapsaml\u0131 rehberde, Node.js, Express ve Multer kullanarak resim y\u00fckleme i\u015flemini ad\u0131m ad\u0131m nas\u0131l ger\u00e7ekle\u015ftirece\u011fimizi \u00f6\u011frenece\u011fiz. Proje kurulumundan Multer yap\u0131land\u0131rmas\u0131na, dosya filtrelemeden hata y\u00f6netimine ve g\u00fcvenlik en iyi uygulamalar\u0131na kadar t\u00fcm detaylar\u0131 ele alaca\u011f\u0131z. Amac\u0131m\u0131z, hem \u00e7al\u0131\u015fan bir uygulama olu\u015fturmak hem de dosya y\u00fckleme s\u00fcre\u00e7lerinin arkas\u0131ndaki temel prensipleri ve dikkat edilmesi gereken noktalar\u0131 derinlemesine anlamakt\u0131r. Bu rehberin sonunda, kendi Node.js uygulamalar\u0131n\u0131za g\u00fcvenli ve etkili bir resim y\u00fckleme \u00f6zelli\u011fi entegre edebilecek bilgiye sahip olacaks\u0131n\u0131z.<\/p>\n<h3>Neden Node.js, Express ve Multer?<\/h3>\n<p>Bir web uygulamas\u0131nda dosya y\u00fckleme \u00f6zelli\u011fi geli\u015ftirmek i\u00e7in bir\u00e7ok teknoloji ve yakla\u015f\u0131m mevcuttur. Ancak Node.js, Express ve Multer \u00fc\u00e7l\u00fcs\u00fc, \u00f6zellikle JavaScript tabanl\u0131 geli\u015ftiriciler i\u00e7in olduk\u00e7a pop\u00fcler ve g\u00fc\u00e7l\u00fc bir kombinasyon sunar. Bu se\u00e7imin arkas\u0131ndaki nedenleri daha yak\u0131ndan inceleyelim:<\/p>\n<h4>Node.js: Sunucu Taraf\u0131 JavaScript G\u00fcc\u00fc<\/h4>\n<p>Node.js, Google Chrome&#8217;un V8 JavaScript motoru \u00fczerine kurulu, sunucu taraf\u0131 uygulamalar geli\u015ftirmek i\u00e7in kullan\u0131lan bir \u00e7al\u0131\u015fma zaman\u0131 ortam\u0131d\u0131r. Temel \u00f6zellikleri \u015funlard\u0131r:<\/p>\n<p>*   <strong>Asenkron ve Non-Blocking I\/O:<\/strong> Node.js, geleneksel sunucu dillerinin aksine, i\u015flemlerini asenkron olarak ve engellemeyen (non-blocking) I\/O modeliyle y\u00fcr\u00fct\u00fcr. Bu, bir dosya y\u00fckleme veya veritaban\u0131 sorgusu gibi uzun s\u00fcren bir i\u015flem devam ederken, Node.js&#8217;in di\u011fer istekleri i\u015flemeye devam edebilece\u011fi anlam\u0131na gelir. Bu model, \u00f6zellikle y\u00fcksek trafikli uygulamalarda performans\u0131 ve \u00f6l\u00e7eklenebilirli\u011fi art\u0131r\u0131r. Dosya y\u00fckleme gibi I\/O yo\u011fun i\u015flemler i\u00e7in bu olduk\u00e7a avantajl\u0131d\u0131r.<br \/>\n*   <strong>Tek Dil (JavaScript Everywhere):<\/strong> Geli\u015ftiricilerin hem frontend hem de backend i\u00e7in ayn\u0131 dili (JavaScript) kullanabilmesi, geli\u015ftirme s\u00fcrecini basitle\u015ftirir, ekip i\u00e7indeki bilgi payla\u015f\u0131m\u0131n\u0131 kolayla\u015ft\u0131r\u0131r ve ba\u011flam de\u011fi\u015ftirme maliyetlerini azalt\u0131r.<br \/>\n*   <strong>Geni\u015f Ekosistem (NPM):<\/strong> Node.js&#8217;in paket y\u00f6neticisi olan npm (Node Package Manager), d\u00fcnyan\u0131n en b\u00fcy\u00fck a\u00e7\u0131k kaynak k\u00fct\u00fcphane ekosistemine sahiptir. Multer gibi \u00f6zel ama\u00e7l\u0131 k\u00fct\u00fcphaneler, npm arac\u0131l\u0131\u011f\u0131yla kolayca projelere dahil edilebilir. Bu zengin ekosistem, geli\u015ftirme s\u00fcrecini h\u0131zland\u0131r\u0131r ve bir\u00e7ok yayg\u0131n soruna haz\u0131r \u00e7\u00f6z\u00fcmler sunar.<br \/>\n*   <strong>\u00d6l\u00e7eklenebilirlik:<\/strong> Node.js&#8217;in olay tabanl\u0131, asenkron yap\u0131s\u0131, uygulamalar\u0131n yatay olarak kolayca \u00f6l\u00e7eklenebilmesini sa\u011flar. Y\u00fcklenen dosyalar\u0131n i\u015flenmesi ve depolanmas\u0131 gibi g\u00f6revler, bu yap\u0131n\u0131n sa\u011flad\u0131\u011f\u0131 avantajlarla daha verimli hale getirilebilir.<\/p>\n<h4>Express.js: Node.js \u0130\u00e7in H\u0131zl\u0131 ve Minimalist Web \u00c7at\u0131s\u0131<\/h4>\n<p>Express.js, Node.js i\u00e7in minimalist ve esnek bir web uygulama \u00e7at\u0131s\u0131d\u0131r. Sunucu taraf\u0131 uygulamalar\u0131n geli\u015ftirilmesini b\u00fcy\u00fck \u00f6l\u00e7\u00fcde basitle\u015ftirir ve h\u0131zland\u0131r\u0131r. Ba\u015fl\u0131ca avantajlar\u0131 \u015funlard\u0131r:<\/p>\n<p>*   <strong>Basit API:<\/strong> Express.js, HTTP isteklerini ve yan\u0131tlar\u0131n\u0131 y\u00f6netmek i\u00e7in basit ve anla\u015f\u0131l\u0131r bir API sunar. Rota tan\u0131mlama, ara yaz\u0131l\u0131m kullan\u0131m\u0131 ve sunucu yap\u0131land\u0131rmas\u0131 gibi temel g\u00f6revler olduk\u00e7a kolayd\u0131r.<br \/>\n*   <strong>Ara Yaz\u0131l\u0131m (Middleware) Deste\u011fi:<\/strong> Express, ara yaz\u0131l\u0131m kavram\u0131n\u0131 merkeze al\u0131r. Ara yaz\u0131l\u0131mlar, bir HTTP iste\u011fi sunucuya ula\u015ft\u0131\u011f\u0131nda ve bir yan\u0131t g\u00f6nderilmeden \u00f6nce \u00e7al\u0131\u015fan fonksiyonlard\u0131r. Kimlik do\u011frulama, oturum y\u00f6netimi, loglama ve tabii ki dosya y\u00fckleme (Multer gibi) gibi bir\u00e7ok i\u015flev ara yaz\u0131l\u0131mlar arac\u0131l\u0131\u011f\u0131yla kolayca entegre edilebilir.<br \/>\n*   <strong>H\u0131zl\u0131 Geli\u015ftirme:<\/strong> Express.js, &#8220;unopinionated&#8221; (fikirsiz) bir yap\u0131ya sahiptir; yani geli\u015ftiricilere belirli bir proje yap\u0131s\u0131 veya teknoloji y\u0131\u011f\u0131n\u0131 dayatmaz. Bu esneklik, projelerin gereksinimlerine g\u00f6re \u00f6zelle\u015ftirilmi\u015f \u00e7\u00f6z\u00fcmler geli\u015ftirmeyi m\u00fcmk\u00fcn k\u0131lar ve h\u0131zl\u0131 prototipleme i\u00e7in idealdir.<br \/>\n*   <strong>B\u00fcy\u00fck Topluluk Deste\u011fi:<\/strong> Express, Node.js ekosisteminin en pop\u00fcler \u00e7at\u0131lar\u0131ndan biridir ve geni\u015f bir geli\u015ftirici toplulu\u011funa sahiptir. Bu, sorunlarla kar\u015f\u0131la\u015f\u0131ld\u0131\u011f\u0131nda kolayca destek bulabilece\u011finiz ve bir\u00e7ok kaynak ve \u00f6rnek koda eri\u015febilece\u011finiz anlam\u0131na gelir.<\/p>\n<h4>Multer: <code>multipart\/form-data<\/code> \u0130\u015flemleri \u0130\u00e7in \u00d6zel Ara Yaz\u0131l\u0131m<\/h4>\n<p>Multer, \u00f6zellikle Express.js ile birlikte kullan\u0131lmak \u00fczere tasarlanm\u0131\u015f bir Node.js ara yaz\u0131l\u0131m\u0131d\u0131r. Temel amac\u0131, HTTP isteklerinde <code>multipart\/form-data<\/code> format\u0131ndaki verileri, yani dosya y\u00fcklemelerini i\u015flemek ve y\u00f6netmektir.<\/p>\n<p>*   <strong>Kolay Entegrasyon:<\/strong> Multer, Express ara yaz\u0131l\u0131m\u0131 olarak do\u011frudan uygulaman\u0131za entegre edilebilir. Y\u00fckleme rotalar\u0131n\u0131zda Multer&#8217;\u0131 kullanarak gelen dosya verilerini otomatik olarak ayr\u0131\u015ft\u0131rabilir ve diskte veya bellek \u00fczerinde depolayabilirsiniz.<br \/>\n*   <strong>Depolama Kontrol\u00fc:<\/strong> Multer, dosyalar\u0131n nereye ve nas\u0131l kaydedilece\u011fi konusunda esneklik sunar. <code>diskStorage<\/code> ile dosyalar\u0131 sunucunun dosya sistemine kaydedebilir veya <code>memoryStorage<\/code> ile bellekte tutabilirsiniz (genellikle k\u00fc\u00e7\u00fck dosyalar veya bulut depolamaya direkt aktar\u0131m i\u00e7in kullan\u0131l\u0131r).<br \/>\n*   <strong>Dosya Filtreleme ve Limitler:<\/strong> G\u00fcvenlik ve performans a\u00e7\u0131s\u0131ndan kritik olan dosya t\u00fcr\u00fc do\u011frulama (sadece resim dosyalar\u0131n\u0131 kabul etme) ve dosya boyutu limitleri gibi \u00f6zellikleri Multer kolayca yap\u0131land\u0131rman\u0131za olanak tan\u0131r.<br \/>\n*   <strong>\u00c7oklu Dosya Y\u00fckleme:<\/strong> Multer, tek bir dosya, birden fazla dosya (ayn\u0131 form alan\u0131ndan) veya farkl\u0131 form alanlar\u0131ndan gelen farkl\u0131 dosya t\u00fcrlerini (\u00f6rne\u011fin, profil resmi ve galeri resimleri) y\u00f6netmek i\u00e7in \u00e7e\u015fitli y\u00f6ntemler sunar.<\/p>\n<p>Bu \u00fc\u00e7l\u00fcn\u00fcn birle\u015fimi, geli\u015ftiricilere dosya y\u00fckleme i\u015flemlerini g\u00fcvenli, verimli ve h\u0131zl\u0131 bir \u015fekilde ger\u00e7ekle\u015ftirebilecekleri sa\u011flam bir temel sa\u011flar.<\/p>\n<h3>\u00d6n Gereksinimler ve Proje Kurulumu<\/h3>\n<p>Bu rehbere ba\u015flamadan \u00f6nce, sisteminizde baz\u0131 temel ara\u00e7lar\u0131n kurulu olmas\u0131 gerekmektedir.<\/p>\n<h4>\u00d6n Gereksinimler:<\/h4>\n<p>*   <strong>Node.js ve npm:<\/strong> Sisteminizde Node.js ve npm&#8217;in (Node.js ile birlikte gelir) kurulu oldu\u011fundan emin olun. Komut istemcinizde <code>node -v<\/code> ve <code>npm -v<\/code> komutlar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rarak s\u00fcr\u00fcmlerini kontrol edebilirsiniz.<br \/>\n*   <strong>Temel Node.js ve Express Bilgisi:<\/strong> Node.js mod\u00fcl sistemine, Express.js&#8217;in temel routing ve middleware kavramlar\u0131na a\u015fina olmak faydal\u0131 olacakt\u0131r.<br \/>\n*   <strong>Tercih Edilen Bir Kod D\u00fczenleyici:<\/strong> Visual Studio Code, Sublime Text gibi bir kod d\u00fczenleyici kullanabilirsiniz.<\/p>\n<h4>Proje Kurulumu:<\/h4>\n<p>\u015eimdi projemizi olu\u015ftural\u0131m ve gerekli ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fckleyelim.<\/p>\n<p>1.  <strong>Yeni Bir Dizin Olu\u015fturun:<\/strong> Projeniz i\u00e7in yeni bir klas\u00f6r olu\u015fturun ve i\u00e7ine girin.<\/p>\n<pre><code class=\"language-bash\">mkdir image-upload-app\n    cd image-upload-app<\/code><\/pre>\n<p>2.  <strong>npm Projesini Ba\u015flat\u0131n:<\/strong> <code>package.json<\/code> dosyas\u0131n\u0131 olu\u015fturmak i\u00e7in <code>npm init<\/code> komutunu kullan\u0131n. <code>-y<\/code> bayra\u011f\u0131, t\u00fcm sorulara varsay\u0131lan yan\u0131tlar\u0131 vermenizi sa\u011flar.<\/p>\n<pre><code class=\"language-bash\">npm init -y<\/code><\/pre>\n<p>3.  <strong>Gerekli Paketleri Y\u00fckleyin:<\/strong> Express, Multer ve basit bir frontend i\u00e7in EJS (Embedded JavaScript) \u015fablon motorunu y\u00fckleyelim. EJS, HTML dosyalar\u0131m\u0131za dinamik i\u00e7erik eklememizi ve sunucu taraf\u0131ndan render etmemizi sa\u011flar.<\/p>\n<pre><code class=\"language-bash\">npm install express multer ejs<\/code><\/pre>\n<p>Bu ad\u0131mlar\u0131n ard\u0131ndan <code>package.json<\/code> dosyan\u0131zda bu ba\u011f\u0131ml\u0131l\u0131klar\u0131n listelendi\u011fini g\u00f6receksiniz. Proje dizininiz art\u0131k gerekli t\u00fcm temel yap\u0131ya sahip.<\/p>\n<h3>Backend Uygulamas\u0131n\u0131n Geli\u015ftirilmesi<\/h3>\n<p>\u015eimdi Node.js ve Express kullanarak sunucu taraf\u0131 mant\u0131\u011f\u0131n\u0131 olu\u015ftural\u0131m ve Multer&#8217;\u0131 dosya y\u00fckleme i\u015flemlerini y\u00f6netmek i\u00e7in yap\u0131land\u0131ral\u0131m.<\/p>\n<h4>1. Temel Express Uygulamas\u0131 Olu\u015fturma (<code>server.js<\/code>)<\/h4>\n<p>Proje dizininizin k\u00f6k\u00fcnde <code>server.js<\/code> ad\u0131nda bir dosya olu\u015fturun ve i\u00e7ine a\u015fa\u011f\u0131daki kodu ekleyin. Bu, temel bir Express uygulamas\u0131n\u0131 ba\u015flatacak ve bir ana sayfa rotas\u0131 tan\u0131mlayacakt\u0131r.<\/p>\n<pre><code class=\"language-javascript\">\/\/ server.js\nconst express = require('express');\nconst path = require('path');\nconst app = express();\nconst PORT = process.env.PORT || 3000;\n\n\/\/ EJS'i \u015fablon motoru olarak ayarla\napp.set('view engine', 'ejs');\napp.set('views', path.join(__dirname, 'views'));\n\n\/\/ Ana sayfa rotas\u0131\napp.get('\/', (req, res) => {\n    res.render('index', { message: null, error: null });\n});\n\n\/\/ Sunucuyu ba\u015flat\napp.listen(PORT, () => {\n    console.log(<code>Sunucu http:\/\/localhost:${PORT} adresinde \u00e7al\u0131\u015f\u0131yor.<\/code>);\n});<\/code><\/pre>\n<p>Bu kod, Express uygulamas\u0131n\u0131 ba\u015flat\u0131r, EJS&#8217;i view motoru olarak ayarlar ve varsay\u0131lan olarak <code>views<\/code> klas\u00f6r\u00fcndeki <code>index.ejs<\/code> dosyas\u0131n\u0131 render eden bir ana sayfa rotas\u0131 tan\u0131mlar.<\/p>\n<h4>2. Multer&#8217;\u0131 Yap\u0131land\u0131rma<\/h4>\n<p>Multer&#8217;\u0131 dosya y\u00fckleme i\u015flemleri i\u00e7in yap\u0131land\u0131rmam\u0131z gerekiyor. Bu yap\u0131land\u0131rma, dosyalar\u0131n nereye kaydedilece\u011fini, nas\u0131l adland\u0131r\u0131laca\u011f\u0131n\u0131 ve hangi t\u00fcr dosyalar\u0131n kabul edilece\u011fini belirler.<\/p>\n<p><code>server.js<\/code> dosyan\u0131z\u0131n ba\u015f\u0131na veya ilgili bir b\u00f6l\u00fcm\u00fcne Multer yap\u0131land\u0131rmas\u0131n\u0131 ekleyin:<\/p>\n<pre><code class=\"language-javascript\">\/\/ server.js (devam\u0131)\nconst multer = require('multer');\nconst fs = require('fs'); \/\/ Dosya sistemi i\u015flemleri i\u00e7in\n\n\/\/ Y\u00fcklenen dosyalar\u0131n depolanaca\u011f\u0131 dizini olu\u015ftur (e\u011fer yoksa)\nconst uploadDir = '.\/uploads';\nif (!fs.existsSync(uploadDir)) {\n    fs.mkdirSync(uploadDir);\n}\n\n\/\/ Multer depolama ayarlar\u0131\nconst storage = multer.diskStorage({\n    destination: (req, file, cb) => {\n        \/\/ Dosyalar\u0131n kaydedilece\u011fi dizin\n        cb(null, uploadDir);\n    },\n    filename: (req, file, cb) => {\n        \/\/ Dosya ad\u0131: orijinal ad + tarih damgas\u0131 + uzant\u0131\n        \/\/ G\u00fcvenlik ve benzersizlik i\u00e7in genellikle UUID kullan\u0131l\u0131r.\n        \/\/ Burada basit bir \u00f6rnek i\u00e7in tarih damgas\u0131 kullan\u0131yoruz.\n        const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9);\n        cb(null, file.fieldname + '-' + uniqueSuffix + path.extname(file.originalname));\n    }\n});\n\n\/\/ Multer dosya filtreleme ayarlar\u0131\nconst fileFilter = (req, file, cb) => {\n    \/\/ Sadece belirli dosya t\u00fcrlerini kabul et (\u00f6rne\u011fin, JPEG ve PNG)\n    if (file.mimetype === 'image\/jpeg' || file.mimetype === 'image\/png' || file.mimetype === 'image\/gif') {\n        cb(null, true); \/\/ Dosyay\u0131 kabul et\n    } else {\n        cb(new Error('Yaln\u0131zca JPG, PNG veya GIF resim dosyalar\u0131 y\u00fcklenebilir!'), false); \/\/ Dosyay\u0131 reddet\n    }\n};\n\n\/\/ Multer instance olu\u015fturma\nconst upload = multer({\n    storage: storage,\n    fileFilter: fileFilter,\n    limits: {\n        fileSize: 1024 <em> 1024 <\/em> 5 \/\/ 5 MB dosya boyutu limiti\n    }\n});<\/code><\/pre>\n<p><strong>A\u00e7\u0131klamalar:<\/strong><\/p>\n<p>*   <strong><code>fs.existsSync<\/code> ve <code>fs.mkdirSync<\/code>:<\/strong> <code>uploads<\/code> ad\u0131nda bir dizin olup olmad\u0131\u011f\u0131n\u0131 kontrol eder ve yoksa olu\u015fturur. Y\u00fcklenen dosyalar\u0131n bu dizine kaydedilmesi i\u00e7in gereklidir.<br \/>\n*   <strong><code>multer.diskStorage<\/code>:<\/strong> Dosyalar\u0131n sunucunun diskine kaydedilece\u011fini belirtir.<br \/>\n    *   <code>destination<\/code>: Dosyan\u0131n kaydedilece\u011fi dizini belirleyen bir fonksiyondur. <code>cb(null, 'uploads\/')<\/code> ile dosyalar\u0131n <code>uploads<\/code> klas\u00f6r\u00fcne kaydedilece\u011fini belirtiriz.<br \/>\n    *   <code>filename<\/code>: Dosyan\u0131n diske kaydedilirken hangi isimle kaydedilece\u011fini belirleyen bir fonksiyondur. G\u00fcvenlik ve \u00e7ak\u0131\u015fmalar\u0131 \u00f6nlemek i\u00e7in genellikle orijinal dosya ad\u0131 yerine benzersiz bir isim (\u00f6rne\u011fin, UUID veya zaman damgas\u0131) kullan\u0131lmas\u0131 \u00f6nerilir. Burada <code>Date.now()<\/code> ve <code>Math.random()<\/code> ile benzersiz bir sonek olu\u015fturulur ve orijinal dosya uzant\u0131s\u0131 (<code>path.extname<\/code>) korunur.<br \/>\n*   <strong><code>fileFilter<\/code>:<\/strong> Y\u00fcklenen dosyalar\u0131n belirli kriterlere g\u00f6re filtrelenmesini sa\u011flar. Bu \u00f6rnekte, sadece JPEG, PNG ve GIF resim dosyalar\u0131 kabul edilir. Di\u011fer dosya t\u00fcrleri bir hata mesaj\u0131yla reddedilir. <code>cb(null, true)<\/code> dosyay\u0131 kabul ederken, <code>cb(new Error('...'), false)<\/code> dosyay\u0131 reddeder ve hata d\u00f6nd\u00fcr\u00fcr.<br \/>\n*   <strong><code>multer<\/code> instance:<\/strong> <code>multer<\/code> fonksiyonu, <code>storage<\/code>, <code>fileFilter<\/code> ve <code>limits<\/code> gibi yap\u0131land\u0131rma se\u00e7eneklerini al\u0131r.<br \/>\n    <em>   <code>limits.fileSize<\/code>: Y\u00fcklenen dosyan\u0131n maksimum boyutunu bayt cinsinden belirler. Burada 5 MB olarak ayarlanm\u0131\u015ft\u0131r (1024 <\/em> 1024 * 5).<\/p>\n<h4>3. Y\u00fckleme Rotas\u0131 Olu\u015fturma<\/h4>\n<p>\u015eimdi, Multer ara yaz\u0131l\u0131m\u0131n\u0131 kullanarak resim y\u00fckleme i\u015flemini ger\u00e7ekle\u015ftirecek bir POST rotas\u0131 olu\u015ftural\u0131m.<\/p>\n<p><code>server.js<\/code> dosyan\u0131za a\u015fa\u011f\u0131daki rotay\u0131 ekleyin:<\/p>\n<pre><code class=\"language-javascript\">\/\/ server.js (devam\u0131)\n\n\/\/ Resim y\u00fckleme rotas\u0131\napp.post('\/upload', upload.single('image'), (req, res) => {\n    \/\/ <code>upload.single('image')<\/code> Multer ara yaz\u0131l\u0131m\u0131d\u0131r.\n    \/\/ 'image', frontend'deki <input type=\"file\" name=\"image\"> etiketindeki name \u00f6zelli\u011fidir.\n\n    if (req.file) {\n        \/\/ Dosya ba\u015far\u0131yla y\u00fcklendi\n        res.render('index', { \n            message: 'Dosya ba\u015far\u0131yla y\u00fcklendi!', \n            error: null,\n            filePath: <code>\/uploads\/${req.file.filename}<\/code> \/\/ Y\u00fcklenen dosyan\u0131n yolu\n        });\n    } else {\n        \/\/ Dosya y\u00fcklenemedi (Multer taraf\u0131ndan yakalanmayan bir durum)\n        res.render('index', { \n            message: null, \n            error: 'Dosya y\u00fcklenirken bir sorun olu\u015ftu.' \n        });\n    }\n});\n\n\/\/ Multer hata y\u00f6netimi ara yaz\u0131l\u0131m\u0131\napp.use((err, req, res, next) => {\n    if (err instanceof multer.MulterError) {\n        \/\/ Multer'a \u00f6zg\u00fc hatalar (\u00f6rn: dosya boyutu limiti)\n        let errorMessage = 'Dosya y\u00fckleme hatas\u0131: ';\n        if (err.code === 'LIMIT_FILE_SIZE') {\n            errorMessage += 'Y\u00fcklenen dosya \u00e7ok b\u00fcy\u00fck. Maksimum 5 MB olabilir.';\n        } else if (err.code === 'LIMIT_UNEXPECTED_FILE') {\n            errorMessage += 'Beklenmeyen bir dosya alan\u0131.';\n        } else {\n            errorMessage += err.message;\n        }\n        return res.render('index', { message: null, error: errorMessage });\n    } else if (err) {\n        \/\/ Kendi dosya filtreleme hatam\u0131z veya di\u011fer genel hatalar\n        return res.render('index', { message: null, error: err.message });\n    }\n    next(); \/\/ Hata yoksa sonraki ara yaz\u0131l\u0131ma ge\u00e7\n});<\/code><\/pre>\n<p><strong>A\u00e7\u0131klamalar:<\/strong><\/p>\n<p>*   <strong><code>upload.single('image')<\/code>:<\/strong> Bu, Multer&#8217;\u0131n sa\u011flad\u0131\u011f\u0131 bir ara yaz\u0131l\u0131md\u0131r.<br \/>\n    *   <code>single()<\/code> metodu, tek bir dosya y\u00fcklemesini bekledi\u011fini belirtir.<br \/>\n    *   <code>'image'<\/code> parametresi, HTML formundaki <code>input type=\"file\"<\/code> etiketinin <code>name<\/code> \u00f6zelli\u011finin de\u011feriyle e\u015fle\u015fmelidir. Multer, bu isimle gelen dosyay\u0131 i\u015fleyecektir.<br \/>\n    *   Bu ara yaz\u0131l\u0131m \u00e7al\u0131\u015ft\u0131ktan sonra, y\u00fcklenen dosya bilgileri <code>req.file<\/code> nesnesinde mevcut olacakt\u0131r.<br \/>\n*   <strong><code>req.file<\/code>:<\/strong> E\u011fer bir dosya ba\u015far\u0131yla y\u00fcklenirse, <code>req.file<\/code> nesnesi a\u015fa\u011f\u0131daki gibi bilgiler i\u00e7erir:<\/p>\n<pre><code class=\"language-json\">{\n      \"fieldname\": \"image\",\n      \"originalname\": \"my-image.jpg\",\n      \"encoding\": \"7bit\",\n      \"mimetype\": \"image\/jpeg\",\n      \"destination\": \"uploads\",\n      \"filename\": \"image-1678886400000-123456789.jpg\",\n      \"path\": \"uploads\/image-1678886400000-123456789.jpg\",\n      \"size\": 123456\n    }<\/code><\/pre>\n<p>*   <strong>Hata Y\u00f6netimi Ara Yaz\u0131l\u0131m\u0131:<\/strong> Express&#8217;te 4 parametreli bir ara yaz\u0131l\u0131m (<code>(err, req, res, next)<\/code>) hata y\u00f6netimi i\u00e7in kullan\u0131l\u0131r.<br \/>\n    *   Bu ara yaz\u0131l\u0131m, Multer&#8217;dan veya <code>fileFilter<\/code> fonksiyonumuzdan kaynaklanan hatalar\u0131 yakalar.<br \/>\n    *   <code>err instanceof multer.MulterError<\/code> kontrol\u00fc ile Multer&#8217;\u0131n kendi i\u00e7 hatalar\u0131n\u0131 (\u00f6rn. <code>LIMIT_FILE_SIZE<\/code>) tespit edebilir ve kullan\u0131c\u0131ya \u00f6zel hata mesajlar\u0131 d\u00f6nd\u00fcrebiliriz.<br \/>\n    *   Genel hatalar (\u00f6rne\u011fin, <code>fileFilter<\/code>&#8216;dan gelen hata) <code>err.message<\/code> ile yakalan\u0131r.<\/p>\n<h4>4. Statik Dosyalar\u0131 Sunma<\/h4>\n<p>Y\u00fcklenen resimlerin web taray\u0131c\u0131s\u0131 \u00fczerinden g\u00f6r\u00fcnt\u00fclenebilmesi i\u00e7in, <code>uploads<\/code> dizinini statik dosya sunumu i\u00e7in yap\u0131land\u0131rmam\u0131z gerekir.<\/p>\n<p><code>server.js<\/code> dosyan\u0131za, ana sayfa rotas\u0131ndan \u00f6nce a\u015fa\u011f\u0131daki sat\u0131r\u0131 ekleyin:<\/p>\n<pre><code class=\"language-javascript\">\/\/ server.js (devam\u0131)\n\n\/\/ 'uploads' klas\u00f6r\u00fcndeki dosyalar\u0131 statik olarak sun\napp.use('\/uploads', express.static(path.join(__dirname, 'uploads')));\n\n\/\/ ... di\u011fer rotalar ve Multer yap\u0131land\u0131rmas\u0131 ...<\/code><\/pre>\n<p>Bu kod, <code>\/uploads<\/code> URL \u00f6n eki ile gelen istekleri <code>uploads<\/code> dizinindeki dosyalara y\u00f6nlendirecektir. \u00d6rne\u011fin, <code>http:\/\/localhost:3000\/uploads\/image-1678886400000-123456789.jpg<\/code> adresinden y\u00fcklenen resme eri\u015filebilir olacakt\u0131r.<\/p>\n<h3>Frontend Olu\u015fturma (Basit Bir Form)<\/h3>\n<p>\u015eimdi, kullan\u0131c\u0131lar\u0131n resim se\u00e7ip y\u00fckleyebilece\u011fi basit bir HTML formu olu\u015ftural\u0131m. Bunun i\u00e7in EJS \u015fablon motorunu kullanaca\u011f\u0131z.<\/p>\n<p>Proje dizininizin k\u00f6k\u00fcnde <code>views<\/code> ad\u0131nda bir klas\u00f6r olu\u015fturun ve i\u00e7ine <code>index.ejs<\/code> ad\u0131nda bir dosya ekleyin:<\/p>\n<pre><code class=\"language-html\"><!-- views\/index.ejs -->\n<!DOCTYPE html>\n<html lang=\"tr\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Resim Y\u00fckleme Uygulamas\u0131<\/title>\n    <style>\n        body { font-family: Arial, sans-serif; margin: 20px; background-color: #f4f4f4; }\n        .container { max-width: 600px; margin: auto; background: #fff; padding: 20px; border-radius: 8px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); }\n        h1 { text-align: center; color: #333; }\n        form { display: flex; flex-direction: column; gap: 15px; }\n        input[type=\"file\"] { border: 1px solid #ddd; padding: 10px; border-radius: 4px; }\n        input[type=\"submit\"] { background-color: #007bff; color: white; padding: 10px 15px; border: none; border-radius: 4px; cursor: pointer; font-size: 16px; }\n        input[type=\"submit\"]:hover { background-color: #0056b3; }\n        .message { padding: 10px; border-radius: 4px; margin-top: 20px; }\n        .success { background-color: #d4edda; color: #155724; border: 1px solid #c3e6cb; }\n        .error { background-color: #f8d7da; color: #721c24; border: 1px solid #f5c6cb; }\n        .uploaded-image { margin-top: 20px; text-align: center; }\n        .uploaded-image img { max-width: 100%; height: auto; border: 1px solid #ddd; border-radius: 4px; }\n    <\/style>\n<\/head>\n<body>\n    <div class=\"container\">\n        \n\n        <% if (message) { %>\n            <div class=\"message success\">\n                <%= message %>\n            <\/div>\n        <% } %>\n\n        <% if (error) { %>\n            <div class=\"message error\">\n                <%= error %>\n            <\/div>\n        <% } %>\n\n        <form action=\"\/upload\" method=\"POST\" enctype=\"multipart\/form-data\">\n            <label for=\"image\">Y\u00fcklenecek Resim Se\u00e7in:<\/label>\n            <input type=\"file\" name=\"image\" id=\"image\" accept=\"image\/*\" required>\n            <input type=\"submit\" value=\"Resmi Y\u00fckle\">\n        <\/form>\n\n        <% if (filePath) { %>\n            <div class=\"uploaded-image\">\n                <h2>Y\u00fcklenen Resim:<\/h2>\n                <img decoding=\"async\" src=\"<%= filePath %>\" alt=\"Y\u00fcklenen Resim\">\n                <p>Dosya Yolu: <code><%= filePath %><\/code><\/p>\n            <\/div>\n        <% } %>\n    <\/div>\n<\/body>\n<\/html><\/code><\/pre>\n<p><strong>\u00d6nemli Notlar:<\/strong><\/p>\n<p>*   <strong><code>enctype=\"multipart\/form-data\"<\/code>:<\/strong> Bu \u00f6zellik, dosya y\u00fcklemeleri i\u00e7in bir HTML formunda <strong>kesinlikle<\/strong> bulunmal\u0131d\u0131r. Aksi takdirde, sunucuya dosya verileri do\u011fru formatta g\u00f6nderilmez ve Multer dosyay\u0131 i\u015fleyemez.<br \/>\n*   <strong><code>name=\"image\"<\/code>:<\/strong> <code>input type=\"file\"<\/code> etiketinin <code>name<\/code> \u00f6zelli\u011fi, Multer yap\u0131land\u0131rmas\u0131ndaki <code>upload.single('image')<\/code> \u00e7a\u011fr\u0131s\u0131ndaki parametre ile ayn\u0131 olmal\u0131d\u0131r. Bu, Multer&#8217;\u0131n hangi form alan\u0131ndan gelen dosyay\u0131 i\u015flemesi gerekti\u011fini bilmesini sa\u011flar.<br \/>\n<em>   <strong><code>accept=\"image\/<\/em>\"<\/code>:<\/strong> Bu \u00f6zellik, dosya se\u00e7me diyalogunda sadece resim dosyalar\u0131n\u0131n g\u00f6sterilmesini sa\u011flar. Bu, bir kullan\u0131c\u0131 deneyimi iyile\u015ftirmesidir ve sunucu taraf\u0131ndaki <code>fileFilter<\/code> ile ayn\u0131 g\u00fcvenlik d\u00fczeyini sa\u011flamaz. Sunucu taraf\u0131 do\u011frulama her zaman zorunludur.<br \/>\n*   <strong>EJS \u015eablonlama:<\/strong> <code>message<\/code>, <code>error<\/code> ve <code>filePath<\/code> de\u011fi\u015fkenleri, Express taraf\u0131ndan <code>res.render()<\/code> metoduyla g\u00f6nderilen verilerdir. EJS, <code><% if (...) { %> ... <% } %><\/code> ve <code><%= variable %><\/code> s\u00f6zdizimini kullanarak bu verileri HTML i\u00e7ine dinamik olarak yerle\u015ftirir.<\/p>\n<h3>Uygulamay\u0131 \u00c7al\u0131\u015ft\u0131rma<\/h3>\n<p>T\u00fcm backend ve frontend dosyalar\u0131n\u0131 olu\u015fturduktan sonra, uygulamay\u0131 \u00e7al\u0131\u015ft\u0131rabilir ve resim y\u00fckleme i\u015flevini test edebilirsiniz.<\/p>\n<p>1.  <strong>Sunucuyu Ba\u015flat\u0131n:<\/strong> Proje dizininizin k\u00f6k\u00fcnden a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code class=\"language-bash\">node server.js<\/code><\/pre>\n<p>    Konsolda &#8220;Sunucu http:\/\/localhost:3000 adresinde \u00e7al\u0131\u015f\u0131yor.&#8221; mesaj\u0131n\u0131 g\u00f6rmelisiniz.<\/p>\n<p>2.  <strong>Taray\u0131c\u0131da A\u00e7\u0131n:<\/strong> Web taray\u0131c\u0131n\u0131z\u0131 a\u00e7\u0131n ve <code>http:\/\/localhost:3000<\/code> adresine gidin. Resim y\u00fckleme formunu g\u00f6rmelisiniz.<\/p>\n<p>3.  <strong>Resim Y\u00fckleme:<\/strong><br \/>\n    *   &#8220;Y\u00fcklenecek Resim Se\u00e7in&#8221; d\u00fc\u011fmesine t\u0131klay\u0131n ve bir resim dosyas\u0131 se\u00e7in (JPG, PNG veya GIF).<br \/>\n    *   &#8220;Resmi Y\u00fckle&#8221; d\u00fc\u011fmesine t\u0131klay\u0131n.<br \/>\n    *   E\u011fer her \u015fey yolunda giderse, &#8220;Dosya ba\u015far\u0131yla y\u00fcklendi!&#8221; mesaj\u0131n\u0131 ve y\u00fcklenen resmin \u00f6nizlemesini g\u00f6rmelisiniz.<br \/>\n    *   <code>uploads<\/code> klas\u00f6r\u00fcn\u00fc kontrol etti\u011finizde, yeni y\u00fcklenen resmin benzersiz bir adla kaydedildi\u011fini g\u00f6receksiniz.<br \/>\n    *   Farkl\u0131 dosya t\u00fcrleri veya boyutu 5 MB&#8217;tan b\u00fcy\u00fck dosyalar y\u00fcklemeyi deneyerek hata y\u00f6netimini test edin.<\/p>\n<h3>\u00c7oklu Dosya Y\u00fckleme<\/h3>\n<p>Multer, tek dosya y\u00fcklemenin yan\u0131 s\u0131ra \u00e7oklu dosya y\u00fcklemeyi de destekler. \u0130ki ana senaryo vard\u0131r:<\/p>\n<p>1.  <strong>Ayn\u0131 Form Alan\u0131ndan Birden Fazla Dosya:<\/strong><br \/>\n    HTML taraf\u0131nda <code>input<\/code> etiketine <code>multiple<\/code> \u00f6zelli\u011fini ekleyin:<\/p>\n<pre><code class=\"language-html\"><input type=\"file\" name=\"images\" multiple><\/code><\/pre>\n<p>    Backend taraf\u0131nda <code>upload.array()<\/code> kullan\u0131n:<\/p>\n<pre><code class=\"language-javascript\">app.post('\/upload-multiple', upload.array('images', 10), (req, res) => {\n        \/\/ 'images' form alan\u0131ndan en fazla 10 dosya kabul et\n        if (req.files) {\n            \/\/ req.files bir dizi olacakt\u0131r\n            console.log(req.files);\n            res.send('Birden fazla dosya ba\u015far\u0131yla y\u00fcklendi!');\n        } else {\n            res.status(400).send('Dosya y\u00fcklenemedi.');\n        }\n    });<\/code><\/pre>\n<p>    Bu durumda, <code>req.files<\/code> bir dizi dosya nesnesi i\u00e7erecektir.<\/p>\n<p>2.  <strong>Farkl\u0131 Form Alanlar\u0131ndan Farkl\u0131 Dosya T\u00fcrleri:<\/strong><br \/>\n    HTML taraf\u0131nda birden fazla <code>input<\/code> etiketi tan\u0131mlay\u0131n:<\/p>\n<pre><code class=\"language-html\"><input type=\"file\" name=\"avatar\">\n    <input type=\"file\" name=\"gallery\"><\/code><\/pre>\n<p>    Backend taraf\u0131nda <code>upload.fields()<\/code> kullan\u0131n:<\/p>\n<pre><code class=\"language-javascript\">app.post('\/upload-fields', upload.fields([\n        { name: 'avatar', maxCount: 1 },\n        { name: 'gallery', maxCount: 8 }\n    ]), (req, res) => {\n        \/\/ 'avatar' alan\u0131ndan 1 dosya, 'gallery' alan\u0131ndan en fazla 8 dosya kabul et\n        if (req.files) {\n            \/\/ req.files bir nesne olacakt\u0131r: { avatar: [...], gallery: [...] }\n            console.log(req.files.avatar);\n            console.log(req.files.gallery);\n            res.send('Farkl\u0131 alanlardan dosyalar ba\u015far\u0131yla y\u00fcklendi!');\n        } else {\n            res.status(400).send('Dosya y\u00fcklenemedi.');\n        }\n    });<\/code><\/pre>\n<p>    Bu durumda, <code>req.files<\/code> anahtarlar\u0131 form alanlar\u0131n\u0131n adlar\u0131 olan bir nesne olacakt\u0131r ve de\u011ferleri ilgili dosya nesnelerinin dizileri olacakt\u0131r.<\/p>\n<h3>Hata Y\u00f6netimi ve En \u0130yi Uygulamalar<\/h3>\n<p>Dosya y\u00fckleme, potansiyel g\u00fcvenlik a\u00e7\u0131klar\u0131 ve hata durumlar\u0131 a\u00e7\u0131s\u0131ndan dikkatle ele al\u0131nmas\u0131 gereken bir aland\u0131r. \u0130\u015fte dikkat etmeniz gereken baz\u0131 \u00f6nemli noktalar ve en iyi uygulamalar:<\/p>\n<h4>Multer Hatalar\u0131n\u0131 Yakalama<\/h4>\n<p>Yukar\u0131daki \u00f6rnekte g\u00f6sterildi\u011fi gibi, Multer&#8217;\u0131n kendi hata t\u00fcrlerini (<code>multer.MulterError<\/code>) yakalamak ve kullan\u0131c\u0131ya anlaml\u0131 geri bildirimler sunmak \u00f6nemlidir.<\/p>\n<p>*   <code>LIMIT_FILE_SIZE<\/code>: Dosya boyutu limitinin a\u015f\u0131lmas\u0131.<br \/>\n*   <code>LIMIT_FILE_COUNT<\/code>: <code>array<\/code> veya <code>fields<\/code> kullan\u0131l\u0131rken dosya say\u0131s\u0131n\u0131n a\u015f\u0131lmas\u0131.<br \/>\n*   <code>LIMIT_UNEXPECTED_FILE<\/code>: Tan\u0131mlanmayan bir form alan\u0131ndan dosya gelmesi.<\/p>\n<p>Bu hatalar\u0131 \u00f6zel olarak ele almak, kullan\u0131c\u0131 deneyimini iyile\u015ftirir ve uygulaman\u0131z\u0131n daha sa\u011flam olmas\u0131n\u0131 sa\u011flar.<\/p>\n<h4>G\u00fcvenlik \u00d6nlemleri<\/h4>\n<p>Dosya y\u00fckleme i\u015flevleri, k\u00f6t\u00fc niyetli kullan\u0131c\u0131lar taraf\u0131ndan s\u0131kl\u0131kla hedef al\u0131nan bir sald\u0131r\u0131 vekt\u00f6r\u00fcd\u00fcr. Bu nedenle, kapsaml\u0131 g\u00fcvenlik \u00f6nlemleri almak hayati \u00f6nem ta\u015f\u0131r.<\/p>\n<p>1.  <strong>Dosya Boyutu Limitleri:<\/strong> Her zaman y\u00fcklenen dosyalara maksimum bir boyut limiti uygulay\u0131n. Bu, hem sunucu kaynaklar\u0131n\u0131n a\u015f\u0131r\u0131 t\u00fcketilmesini (DDoS sald\u0131r\u0131s\u0131 gibi) \u00f6nler hem de k\u00f6t\u00fc niyetli b\u00fcy\u00fck dosyalar\u0131n y\u00fcklenmesini engeller. Multer&#8217;\u0131n <code>limits.fileSize<\/code> \u00f6zelli\u011fi bunun i\u00e7in kullan\u0131l\u0131r.<br \/>\n2.  <strong>Dosya T\u00fcr\u00fc Do\u011frulama (MIME Type Kontrol\u00fc):<\/strong><br \/>\n    <em>   <strong>Sunucu Taraf\u0131nda Do\u011frulama:<\/strong> Sadece istemci taraf\u0131ndaki <code>accept=\"image\/<\/em>\"<\/code> \u00f6zelli\u011fine g\u00fcvenmeyin. K\u00f6t\u00fc niyetli kullan\u0131c\u0131lar bu k\u0131s\u0131tlamay\u0131 kolayca atlayabilir. Multer&#8217;\u0131n <code>fileFilter<\/code> \u00f6zelli\u011fi ile sunucu taraf\u0131nda dosyan\u0131n MIME t\u00fcr\u00fcn\u00fc (<code>file.mimetype<\/code>) kontrol edin.<br \/>\n    *   <strong>Derinlemesine Kontrol:<\/strong> MIME t\u00fcr\u00fc kontrol\u00fc bile bazen yan\u0131lt\u0131c\u0131 olabilir (uzant\u0131 de\u011fi\u015ftirme gibi). Daha geli\u015fmi\u015f uygulamalarda, dosyan\u0131n ger\u00e7ek i\u00e7eri\u011fini analiz eden (\u00f6rne\u011fin, ilk birka\u00e7 bayt\u0131n\u0131 okuyarak &#8220;magic number&#8221; kontrol\u00fc) k\u00fct\u00fcphaneler kullanmak daha g\u00fcvenlidir. Ancak bu, daha karma\u015f\u0131k bir konudur ve bu rehberin kapsam\u0131 d\u0131\u015f\u0131ndad\u0131r.<br \/>\n3.  <strong>Dosya Adland\u0131rma:<\/strong><br \/>\n    *   <strong>Orijinal Ad\u0131 Kullanmaktan Ka\u00e7\u0131n\u0131n:<\/strong> Y\u00fcklenen dosyalar\u0131 do\u011frudan orijinal adlar\u0131yla kaydetmeyin. Orijinal adlar, dizin ge\u00e7i\u015fi sald\u0131r\u0131lar\u0131 (<code>..\/..\/..\/..\/etc\/passwd<\/code> gibi) veya ayn\u0131 adl\u0131 dosyalar\u0131n \u00fczerine yaz\u0131lmas\u0131 gibi sorunlara yol a\u00e7abilir.<br \/>\n    *   <strong>Benzersiz Adlar Kullan\u0131n:<\/strong> Dosyalar\u0131 UUID (Universally Unique Identifier) veya zaman damgas\u0131 gibi benzersiz bir tan\u0131mlay\u0131c\u0131 ile yeniden adland\u0131r\u0131n. Multer&#8217;\u0131n <code>filename<\/code> fonksiyonu bunun i\u00e7in idealdir.<br \/>\n    *   <strong>Uzant\u0131y\u0131 G\u00fcvenli Bir \u015eekilde Ekleme:<\/strong> Orijinal dosya uzant\u0131s\u0131n\u0131 <code>path.extname(file.originalname)<\/code> gibi g\u00fcvenli bir y\u00f6ntemle al\u0131n.<br \/>\n4.  <strong>Y\u00fckleme Dizinini Koruma:<\/strong><br \/>\n    *   <strong>Web K\u00f6k\u00fcn\u00fcn D\u0131\u015f\u0131nda Depolama (M\u00fcmk\u00fcnse):<\/strong> Hassas dosyalar\u0131 veya kullan\u0131c\u0131 taraf\u0131ndan y\u00fcklenen dosyalar\u0131 do\u011frudan web sunucusunun eri\u015febilece\u011fi dizinlerin d\u0131\u015f\u0131nda depolamak daha g\u00fcvenlidir. Ancak Multer gibi ara\u00e7lar genellikle web k\u00f6k\u00fc i\u00e7indeki bir <code>uploads<\/code> dizinine kaydeder. Bu durumda, <code>uploads<\/code> dizininde \u00e7al\u0131\u015ft\u0131r\u0131labilir dosyalar\u0131n (\u00f6rne\u011fin <code>.php<\/code>, <code>.exe<\/code>) do\u011frudan \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131n\u0131 engelleyecek sunucu yap\u0131land\u0131rmalar\u0131 uygulay\u0131n.<br \/>\n    *   <strong>Dizin Listelemeyi Devre D\u0131\u015f\u0131 B\u0131rakma:<\/strong> Web sunucunuzun (Nginx, Apache) <code>uploads<\/code> dizini i\u00e7in dizin listelemeyi devre d\u0131\u015f\u0131 b\u0131rakt\u0131\u011f\u0131ndan emin olun. Bu, k\u00f6t\u00fc niyetli ki\u015filerin y\u00fcklenen t\u00fcm dosyalara g\u00f6z atmas\u0131n\u0131 engeller.<br \/>\n5.  <strong>Anti-Vir\u00fcs Taramas\u0131 (\u0130leri Seviye):<\/strong> Hassas uygulamalar i\u00e7in, y\u00fcklenen dosyalar\u0131 kaydetmeden \u00f6nce bir anti-vir\u00fcs motoruyla taramak ek bir g\u00fcvenlik katman\u0131 sa\u011flar. Bu, genellikle harici servisler veya k\u00fct\u00fcphaneler arac\u0131l\u0131\u011f\u0131yla yap\u0131l\u0131r.<br \/>\n6.  <strong>\u0130stemci Taraf\u0131 Do\u011frulama Yetersizdir:<\/strong> \u0130stemci taraf\u0131 do\u011frulama (\u00f6rne\u011fin JavaScript ile dosya boyutu kontrol\u00fc), kullan\u0131c\u0131 deneyimini iyile\u015ftirmek i\u00e7in iyi olsa da, g\u00fcvenlik i\u00e7in asla tek ba\u015f\u0131na yeterli de\u011fildir. T\u00fcm do\u011frulamalar sunucu taraf\u0131nda tekrarlanmal\u0131d\u0131r.<\/p>\n<h4>Performans ve \u00d6l\u00e7eklenebilirlik<\/h4>\n<p>Uygulaman\u0131z b\u00fcy\u00fcd\u00fck\u00e7e ve daha fazla dosya y\u00fcklendik\u00e7e, performans ve \u00f6l\u00e7eklenebilirlik \u00f6nemli hale gelir.<\/p>\n<p>1.  <strong>Asenkron \u0130\u015flemler:<\/strong> Node.js&#8217;in asenkron yap\u0131s\u0131, dosya y\u00fckleme gibi I\/O yo\u011fun i\u015flemleri engellemeden y\u00fcr\u00fcterek performansa katk\u0131da bulunur.<br \/>\n2.  <strong>Bulut Depolama:<\/strong> \u00dcretim ortamlar\u0131nda ve y\u00fcksek \u00f6l\u00e7ekli uygulamalarda, dosyalar\u0131 do\u011frudan sunucunun diskine kaydetmek yerine Amazon S3, Google Cloud Storage veya Azure Blob Storage gibi bulut depolama hizmetlerini kullanmak \u00e7ok daha yayg\u0131n ve \u00f6nerilen bir yakla\u015f\u0131md\u0131r.<br \/>\n    *   Bu hizmetler, depolama alan\u0131n\u0131 y\u00f6netme, yedekleme, \u00f6l\u00e7eklenebilirlik ve CDN (Content Delivery Network) entegrasyonu gibi avantajlar sunar.<br \/>\n    *   Multer ile birlikte kullan\u0131labilecek <code>multer-s3<\/code> veya <code>multer-google-storage<\/code> gibi k\u00fct\u00fcphaneler mevcuttur. Bu k\u00fct\u00fcphaneler, dosyalar\u0131 do\u011frudan belirtilen bulut depolama servisine y\u00fcklemenizi sa\u011flar.<br \/>\n3.  <strong>Resim \u0130\u015fleme:<\/strong> Y\u00fcklenen resimleri farkl\u0131 boyutlarda (thumbnail, orta, b\u00fcy\u00fck) yeniden boyutland\u0131rmak, s\u0131k\u0131\u015ft\u0131rmak veya filigran eklemek gibi i\u015flemler i\u00e7in <code>sharp<\/code> veya <code>jimp<\/code> gibi Node.js k\u00fct\u00fcphaneleri kullan\u0131labilir. Bu i\u015flemler, kullan\u0131c\u0131ya daha h\u0131zl\u0131 y\u00fcklenen ve daha uygun boyutlarda resimler sunar.<br \/>\n4.  <strong>CDN Kullan\u0131m\u0131:<\/strong> Y\u00fcklenen resimleri bir CDN \u00fczerinden sunmak, kullan\u0131c\u0131lar\u0131n co\u011frafi konumlar\u0131na daha yak\u0131n sunuculardan resimlere eri\u015fmesini sa\u011flayarak y\u00fckleme s\u00fcrelerini \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Bu kapsaml\u0131 rehberde, Node.js, Express ve Multer kullanarak web uygulamalar\u0131n\u0131za g\u00fcvenli ve verimli bir resim y\u00fckleme \u00f6zelli\u011fi entegre etmenin t\u00fcm ad\u0131mlar\u0131n\u0131 ele ald\u0131k. Proje kurulumundan Multer&#8217;\u0131n detayl\u0131 yap\u0131land\u0131rmas\u0131na, temel bir frontend olu\u015fturmaktan hata y\u00f6netimine ve g\u00fcvenlik en iyi uygulamalar\u0131na kadar geni\u015f bir yelpazeyi kapsad\u0131k.<\/p>\n<p>Node.js&#8217;in asenkron yap\u0131s\u0131, Express&#8217;in esnekli\u011fi ve Multer&#8217;\u0131n dosya y\u00fckleme konusundaki uzmanl\u0131\u011f\u0131, bu t\u00fcr g\u00f6revleri ger\u00e7ekle\u015ftirmek i\u00e7in g\u00fc\u00e7l\u00fc ve pop\u00fcler bir kombinasyon sunar. Unutmay\u0131n ki dosya y\u00fckleme, \u00f6zellikle g\u00fcvenlik ve performans a\u00e7\u0131s\u0131ndan dikkatle ele al\u0131nmas\u0131 gereken kritik bir \u00f6zelliktir. Sunucu taraf\u0131 do\u011frulama, benzersiz dosya adland\u0131rma ve uygun hata y\u00f6netimi gibi prensiplere ba\u011fl\u0131 kalmak, uygulaman\u0131z\u0131n sa\u011flaml\u0131\u011f\u0131n\u0131 ve g\u00fcvenli\u011fini art\u0131racakt\u0131r.<\/p>\n<p>Art\u0131k bu bilgileri kendi projelerinize uygulayabilir ve kullan\u0131c\u0131lar\u0131n\u0131za zengin medya i\u00e7erikleri y\u00fckleme yetene\u011fi sunabilirsiniz. Daha ileri seviye uygulamalar i\u00e7in bulut depolama entegrasyonunu, resim i\u015fleme k\u00fct\u00fcphanelerini ve CDN kullan\u0131m\u0131n\u0131 ara\u015ft\u0131rmay\u0131 d\u00fc\u015f\u00fcnebilirsiniz. Bu temel bilgilerle donanm\u0131\u015f olarak, Node.js ekosistemindeki dosya y\u00fckleme yeteneklerini ke\u015ffetmeye haz\u0131rs\u0131n\u0131z.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Node.js, Express ve Multer Kullanarak Resim Y\u00fckleme: Kapsaml\u0131 Bir Rehber\nModern web uygulamalar\u0131n\u0131n vazge\u00e7ilmez bir par\u00e7as\u0131 olan dosya y\u00fcklem","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[136],"tags":[],"class_list":{"0":"post-31852","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-node-js","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Node.js, Express ve Multer Kullanarak Resim Y\u00fckleme: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/node-js-express-ve-multer-kullanarak-resim-yukleme-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Node.js, Express ve Multer Kullanarak Resim Y\u00fckleme: Kapsaml\u0131 Bir Rehber\" \/>\n<meta property=\"og:description\" content=\"Node.js, Express ve Multer Kullanarak Resim Y\u00fckleme: Kapsaml\u0131 Bir Rehber Modern web uygulamalar\u0131n\u0131n vazge\u00e7ilmez bir par\u00e7as\u0131 olan dosya y\u00fcklem\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/node-js-express-ve-multer-kullanarak-resim-yukleme-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-14T18:41:15+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"21 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-express-ve-multer-kullanarak-resim-yukleme-kapsamli-bir-rehber\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-express-ve-multer-kullanarak-resim-yukleme-kapsamli-bir-rehber\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Node.js, Express ve Multer Kullanarak Resim Y\u00fckleme: Kapsaml\u0131 Bir Rehber\",\"datePublished\":\"2025-10-14T18:41:15+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-express-ve-multer-kullanarak-resim-yukleme-kapsamli-bir-rehber\/\"},\"wordCount\":3396,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Node.js\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/node-js-express-ve-multer-kullanarak-resim-yukleme-kapsamli-bir-rehber\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-express-ve-multer-kullanarak-resim-yukleme-kapsamli-bir-rehber\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/node-js-express-ve-multer-kullanarak-resim-yukleme-kapsamli-bir-rehber\/\",\"name\":\"Node.js, Express ve Multer Kullanarak Resim Y\u00fckleme: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-14T18:41:15+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-express-ve-multer-kullanarak-resim-yukleme-kapsamli-bir-rehber\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/node-js-express-ve-multer-kullanarak-resim-yukleme-kapsamli-bir-rehber\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-express-ve-multer-kullanarak-resim-yukleme-kapsamli-bir-rehber\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Node.js, Express ve Multer Kullanarak Resim Y\u00fckleme: Kapsaml\u0131 Bir Rehber\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Node.js, Express ve Multer Kullanarak Resim Y\u00fckleme: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/node-js-express-ve-multer-kullanarak-resim-yukleme-kapsamli-bir-rehber\/","og_locale":"tr_TR","og_type":"article","og_title":"Node.js, Express ve Multer Kullanarak Resim Y\u00fckleme: Kapsaml\u0131 Bir Rehber","og_description":"Node.js, Express ve Multer Kullanarak Resim Y\u00fckleme: Kapsaml\u0131 Bir Rehber Modern web uygulamalar\u0131n\u0131n vazge\u00e7ilmez bir par\u00e7as\u0131 olan dosya y\u00fcklem","og_url":"https:\/\/fatihsoysal.com\/blog\/node-js-express-ve-multer-kullanarak-resim-yukleme-kapsamli-bir-rehber\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-14T18:41:15+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"21 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/node-js-express-ve-multer-kullanarak-resim-yukleme-kapsamli-bir-rehber\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/node-js-express-ve-multer-kullanarak-resim-yukleme-kapsamli-bir-rehber\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Node.js, Express ve Multer Kullanarak Resim Y\u00fckleme: Kapsaml\u0131 Bir Rehber","datePublished":"2025-10-14T18:41:15+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/node-js-express-ve-multer-kullanarak-resim-yukleme-kapsamli-bir-rehber\/"},"wordCount":3396,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Node.js"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/node-js-express-ve-multer-kullanarak-resim-yukleme-kapsamli-bir-rehber\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/node-js-express-ve-multer-kullanarak-resim-yukleme-kapsamli-bir-rehber\/","url":"https:\/\/fatihsoysal.com\/blog\/node-js-express-ve-multer-kullanarak-resim-yukleme-kapsamli-bir-rehber\/","name":"Node.js, Express ve Multer Kullanarak Resim Y\u00fckleme: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-14T18:41:15+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/node-js-express-ve-multer-kullanarak-resim-yukleme-kapsamli-bir-rehber\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/node-js-express-ve-multer-kullanarak-resim-yukleme-kapsamli-bir-rehber\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/node-js-express-ve-multer-kullanarak-resim-yukleme-kapsamli-bir-rehber\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Node.js, Express ve Multer Kullanarak Resim Y\u00fckleme: Kapsaml\u0131 Bir Rehber"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31852","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=31852"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31852\/revisions"}],"predecessor-version":[{"id":31853,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31852\/revisions\/31853"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=31852"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=31852"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=31852"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}