{"id":45681,"date":"2026-11-14T09:07:14","date_gmt":"2026-11-14T06:07:14","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/node-js-ile-yapay-zeka-gorsel-aktarimi-presigned-parcalar-coklu-durum-ve-iptal-yonetimi\/"},"modified":"2026-11-14T09:07:14","modified_gmt":"2026-11-14T06:07:14","slug":"node-js-ile-yapay-zeka-gorsel-aktarimi-presigned-parcalar-coklu-durum-ve-iptal-yonetimi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/node-js-ile-yapay-zeka-gorsel-aktarimi-presigned-parcalar-coklu-durum-ve-iptal-yonetimi\/","title":{"rendered":"Node.js ile Yapay Zeka G\u00f6rsel Aktar\u0131m\u0131: Presigned Par\u00e7alar, \u00c7oklu Durum ve \u0130ptal Y\u00f6netimi"},"content":{"rendered":"<h2>Node.js ile Yapay Zeka G\u00f6rsel Aktar\u0131m\u0131: Presigned Par\u00e7alar, \u00c7oklu Durum ve \u0130ptal Y\u00f6netimi<\/h2>\n<p>G\u00fcn\u00fcm\u00fcz\u00fcn h\u0131zla geli\u015fen yapay zeka (YZ) d\u00fcnyas\u0131nda, \u00fcretilen g\u00f6rsellerin boyutlar\u0131 ve karma\u015f\u0131kl\u0131\u011f\u0131 s\u00fcrekli artmaktad\u0131r. \u00d6zellikle y\u00fcksek \u00e7\u00f6z\u00fcn\u00fcrl\u00fckl\u00fc veya animasyonlu YZ g\u00f6rselleri, geleneksel dosya aktar\u0131m y\u00f6ntemleriyle y\u00f6netildi\u011finde ciddi performans ve g\u00fcvenilirlik sorunlar\u0131na yol a\u00e7abilir. Bu makalede, Node.js kullanarak bu b\u00fcy\u00fck YZ g\u00f6rsellerini bulut depolama alanlar\u0131na (\u00f6rne\u011fin AWS S3) g\u00fcvenli, verimli ve kesintisiz bir \u015fekilde nas\u0131l aktaraca\u011f\u0131m\u0131z\u0131, &#8220;presigned par\u00e7alar&#8221; (presigned parts), &#8220;\u00e7oklu durum&#8221; (multipart state) ve &#8220;iptal y\u00f6netimi&#8221; (abort management) gibi kritik kavramlar \u00fczerinden detayl\u0131 bir \u015fekilde inceleyece\u011fiz. Bu y\u00f6ntemler, hem sunucu y\u00fck\u00fcn\u00fc azalt\u0131r hem de kullan\u0131c\u0131 deneyimini \u00f6nemli \u00f6l\u00e7\u00fcde iyile\u015ftirir.<\/p>\n<h3>Y\u00fcksek \u00c7\u00f6z\u00fcn\u00fcrl\u00fckl\u00fc YZ G\u00f6rselleri: Sorun Nerede Ba\u015fl\u0131yor?<\/h3>\n<p>Yapay zeka modelleri (DALL-E, Midjourney, Stable Diffusion gibi) art\u0131k sadece sanatsal de\u011fil, ayn\u0131 zamanda end\u00fcstriyel kalitede g\u00f6rseller \u00fcretebiliyor. Bu g\u00f6rsellerin \u00e7\u00f6z\u00fcn\u00fcrl\u00fckleri 4K, 8K hatta daha y\u00fcksek seviyelere ula\u015fabiliyor, bu da dosya boyutlar\u0131n\u0131n onlarca megabayt hatta gigabayt seviyelerine \u00e7\u0131kmas\u0131na neden olabiliyor. Bu t\u00fcr b\u00fcy\u00fck dosyalar\u0131n, bir Node.js sunucusu \u00fczerinden do\u011frudan istemciye g\u00f6nderilmesi veya bulut depolama alan\u0131na y\u00fcklenmesi, \u00e7e\u015fitli zorluklar\u0131 beraberinde getirir. \u00d6rne\u011fin, sunucunun belle\u011fi a\u015f\u0131r\u0131 y\u00fcklenebilir, a\u011f ba\u011flant\u0131s\u0131 kesildi\u011finde t\u00fcm y\u00fcklemenin ba\u015ftan ba\u015flamas\u0131 gerekebilir veya y\u00fckleme s\u00fcresi kullan\u0131c\u0131 i\u00e7in kabul edilemez derecede uzun olabilir. Bu durumlar, \u00f6zellikle web tabanl\u0131 uygulamalarda kullan\u0131c\u0131 deneyimini olumsuz etkiler ve sunucu kaynaklar\u0131n\u0131n verimsiz kullan\u0131lmas\u0131na yol a\u00e7ar. Geleneksel yakla\u015f\u0131mlar, genellikle dosyay\u0131 tek bir b\u00fct\u00fcn olarak ele al\u0131r ve bu da b\u00fcy\u00fck dosyalar i\u00e7in bir &#8220;tek hata, t\u00fcm sistem durur&#8221; senaryosu yarat\u0131r. Ayr\u0131ca, sunucu \u00fczerinden ge\u00e7en her veri par\u00e7as\u0131, sunucunun i\u015flem g\u00fcc\u00fcn\u00fc ve bant geni\u015fli\u011fini t\u00fcketir, bu da \u00f6l\u00e7eklenebilirlik sorunlar\u0131na neden olabilir. \u0130\u015fte tam da bu noktada, Node.js&#8217;in olay tabanl\u0131, non-blocking (engellemeyen) yap\u0131s\u0131 ve bulut servislerinin sundu\u011fu geli\u015fmi\u015f \u00f6zellikler devreye girer. Bu makalede ele alaca\u011f\u0131m\u0131z y\u00f6ntemler, bu zorluklar\u0131n \u00fcstesinden gelmek i\u00e7in modern ve etkili bir \u00e7\u00f6z\u00fcm sunmaktad\u0131r. B\u00fcy\u00fck dosyalar\u0131n aktar\u0131m\u0131 s\u0131ras\u0131nda ortaya \u00e7\u0131kan bu sorunlar, sadece teknik bir engel olmaktan \u00f6te, ayn\u0131 zamanda kullan\u0131c\u0131 memnuniyetini, uygulaman\u0131n performans\u0131n\u0131 ve i\u015fletme maliyetlerini do\u011frudan etkileyen fakt\u00f6rlerdir. Bu nedenle, bu t\u00fcr senaryolar i\u00e7in sa\u011flam ve optimize edilmi\u015f bir dosya aktar\u0131m stratejisi geli\u015ftirmek hayati \u00f6nem ta\u015f\u0131maktad\u0131r. Bu, \u00f6zellikle medya, tasar\u0131m, oyun geli\u015ftirme gibi y\u00fcksek \u00e7\u00f6z\u00fcn\u00fcrl\u00fckl\u00fc i\u00e7eriklerin yo\u011fun oldu\u011fu sekt\u00f6rlerde kritik bir ihtiya\u00e7t\u0131r. Bu ba\u011flamda, sunucu taraf\u0131nda Node.js&#8217;in esnekli\u011fi ve bulut depolama servislerinin g\u00fcc\u00fc bir araya geldi\u011finde, ortaya \u00e7\u0131kan sinerji, b\u00fcy\u00fck dosya aktar\u0131m\u0131n\u0131 hem daha h\u0131zl\u0131 hem de daha g\u00fcvenilir hale getirir. Bu, ayn\u0131 zamanda geli\u015ftiricilerin, dosya aktar\u0131m\u0131n\u0131n karma\u015f\u0131kl\u0131\u011f\u0131 yerine uygulaman\u0131n temel i\u015flevselli\u011fine odaklanmas\u0131na olanak tan\u0131r. K\u0131sacas\u0131, YZ g\u00f6rsellerinin b\u00fcy\u00fcyen boyutlar\u0131, yeni nesil dosya aktar\u0131m \u00e7\u00f6z\u00fcmlerini ka\u00e7\u0131n\u0131lmaz k\u0131lmaktad\u0131r.<\/p>\n<h3>Neden Presigned URL&#8217;ler ve Multipart Y\u00fcklemeler Kullanmal\u0131y\u0131z?<\/h3>\n<p>B\u00fcy\u00fck dosyalar\u0131n aktar\u0131m\u0131nda kar\u015f\u0131la\u015f\u0131lan sorunlar\u0131 a\u015fmak i\u00e7in iki anahtar teknoloji bir araya gelir: Presigned URL&#8217;ler ve Multipart Y\u00fcklemeler. Bu iki konsept, \u00f6zellikle bulut depolama servisleriyle (\u00f6rne\u011fin AWS S3) entegre edildi\u011finde, Node.js tabanl\u0131 uygulamalar i\u00e7in olduk\u00e7a g\u00fc\u00e7l\u00fc ve verimli bir \u00e7\u00f6z\u00fcm sunar.<\/p>\n<ul>\n<li>\n        <strong>Presigned URL&#8217;ler (\u00d6n \u0130mzal\u0131 URL&#8217;ler):<\/strong> Bu URL&#8217;ler, belirli bir bulut depolama nesnesine (dosyaya) s\u0131n\u0131rl\u0131 bir s\u00fcre i\u00e7in ve belirli eylemlerle (okuma, yazma, silme) eri\u015fim sa\u011flayan \u00f6zel olarak olu\u015fturulmu\u015f ba\u011flant\u0131lard\u0131r. Node.js sunucumuz, istemciye do\u011frudan bulut depolama hizmetiyle etkile\u015fime girmesi i\u00e7in bu URL&#8217;leri \u00fcretir. Bu, sunucunun bir arac\u0131 olmaktan \u00e7\u0131karak, y\u00fckleme trafi\u011fini do\u011frudan istemci ile bulut depolama aras\u0131na y\u00f6nlendirmesini sa\u011flar. B\u00f6ylece, sunucunun bant geni\u015fli\u011fi ve i\u015flemci kaynaklar\u0131 b\u00fcy\u00fck \u00f6l\u00e7\u00fcde serbest kal\u0131r, bu da sunucunun di\u011fer g\u00f6revlere odaklanmas\u0131na olanak tan\u0131r. G\u00fcvenlik a\u00e7\u0131s\u0131ndan da \u00f6nemlidir, \u00e7\u00fcnk\u00fc bu URL&#8217;ler belirli bir s\u00fcre sonra ge\u00e7erlili\u011fini yitirir ve sadece yetkili kullan\u0131c\u0131lar\u0131n belirli dosyalara eri\u015fimini sa\u011flar. Bu mekanizma, hassas verilerin g\u00fcvenli bir \u015fekilde aktar\u0131lmas\u0131n\u0131 garantilerken, ayn\u0131 zamanda sunucunun potansiyel g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 azalt\u0131r. Presigned URL&#8217;ler, \u00f6zellikle kullan\u0131c\u0131lar\u0131n kendi dosyalar\u0131n\u0131 y\u00fcklemesi gereken sosyal medya platformlar\u0131, dosya payla\u015f\u0131m servisleri veya YZ g\u00f6rsel \u00fcretim platformlar\u0131 gibi uygulamalar i\u00e7in idealdir.\n    <\/li>\n<li>\n        <strong>Multipart Y\u00fcklemeler (\u00c7ok Par\u00e7al\u0131 Y\u00fcklemeler):<\/strong> Bu y\u00f6ntem, b\u00fcy\u00fck bir dosyay\u0131 daha k\u00fc\u00e7\u00fck, y\u00f6netilebilir par\u00e7alara b\u00f6lerek y\u00fckleme i\u015flemini ger\u00e7ekle\u015ftirir. Her bir par\u00e7a ba\u011f\u0131ms\u0131z olarak y\u00fcklenebilir ve bu par\u00e7alar sunucu taraf\u0131nda paralel olarak i\u015flenebilir. Bu yakla\u015f\u0131m\u0131n temel avantajlar\u0131 \u015funlard\u0131r:<\/p>\n<ul>\n<li>\n                <strong>Verimlilik:<\/strong> Par\u00e7alar e\u015f zamanl\u0131 olarak y\u00fcklenebildi\u011fi i\u00e7in toplam y\u00fckleme s\u00fcresi \u00f6nemli \u00f6l\u00e7\u00fcde k\u0131sal\u0131r. \u00d6zellikle y\u00fcksek gecikmeli veya d\u00fc\u015f\u00fck bant geni\u015fli\u011fine sahip a\u011flarda bu fark daha belirgin hale gelir.\n            <\/li>\n<li>\n                <strong>Dayan\u0131kl\u0131l\u0131k:<\/strong> Y\u00fckleme s\u0131ras\u0131nda bir a\u011f hatas\u0131 veya kesinti ya\u015fan\u0131rsa, sadece ba\u015far\u0131s\u0131z olan par\u00e7an\u0131n yeniden y\u00fcklenmesi yeterlidir, t\u00fcm dosyan\u0131n ba\u015ftan y\u00fcklenmesine gerek kalmaz. Bu, kullan\u0131c\u0131 deneyimini iyile\u015ftirir ve veri kayb\u0131 riskini azalt\u0131r.\n            <\/li>\n<li>\n                <strong>\u00d6l\u00e7eklenebilirlik:<\/strong> Sunucunun her bir par\u00e7ay\u0131 ayr\u0131 ayr\u0131 ele alabilmesi, sistemin daha b\u00fcy\u00fck dosya boyutlar\u0131na ve daha fazla e\u015f zamanl\u0131 y\u00fcklemeye daha kolay adapte olmas\u0131n\u0131 sa\u011flar. Sunucu, tek bir b\u00fcy\u00fck dosya ak\u0131\u015f\u0131n\u0131 y\u00f6netmek yerine, daha k\u00fc\u00e7\u00fck ve daha h\u0131zl\u0131 i\u015flenebilen veri par\u00e7alar\u0131yla ilgilenir.\n            <\/li>\n<li>\n                <strong>Esneklik:<\/strong> Y\u00fckleme i\u015flemi s\u0131ras\u0131nda duraklatma ve devam ettirme (pause\/resume) gibi \u00f6zellikler kolayca uygulanabilir. Bu, \u00f6zellikle mobil uygulamalar veya kullan\u0131c\u0131lar\u0131n internet ba\u011flant\u0131s\u0131n\u0131n kesintili olabilece\u011fi senaryolarda kritik bir avantajd\u0131r.\n            <\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Bu iki teknolojinin birle\u015fimi, Node.js sunucumuzun yaln\u0131zca gerekli koordinasyonu sa\u011flamas\u0131n\u0131 (presigned URL&#8217;leri olu\u015fturma ve y\u00fckleme durumunu takip etme) ve as\u0131l veri aktar\u0131m y\u00fck\u00fcn\u00fc bulut depolama hizmetine devretmesini sa\u011flar. B\u00f6ylece, Node.js uygulamam\u0131z daha hafif, daha h\u0131zl\u0131 ve daha \u00f6l\u00e7eklenebilir hale gelir. Bu strateji, \u00f6zellikle YZ taraf\u0131ndan \u00fcretilen ve boyutlar\u0131 s\u00fcrekli artan g\u00f6rseller gibi b\u00fcy\u00fck medya dosyalar\u0131n\u0131n y\u00f6netimi i\u00e7in vazge\u00e7ilmezdir. Geli\u015ftiriciler, bu sayede hem sunucu maliyetlerini d\u00fc\u015f\u00fcrebilir hem de kullan\u0131c\u0131lar\u0131na kesintisiz bir deneyim sunabilirler. Bu yakla\u015f\u0131m, modern web uygulamalar\u0131n\u0131n b\u00fcy\u00fck veri y\u00fcklerini y\u00f6netme \u015feklini temelden de\u011fi\u015ftirmi\u015ftir.<\/p>\n<h3>Node.js ile Presigned URL Olu\u015fturma S\u00fcreci Nas\u0131l \u0130\u015fler?<\/h3>\n<p>Node.js sunucumuzun temel g\u00f6revi, istemcinin b\u00fcy\u00fck YZ g\u00f6rselini do\u011frudan bulut depolama hizmetine y\u00fcklemesi i\u00e7in gerekli olan \u00f6n imzal\u0131 URL&#8217;leri g\u00fcvenli bir \u015fekilde sa\u011flamakt\u0131r. Bu s\u00fcre\u00e7 genellikle birka\u00e7 ad\u0131mdan olu\u015fur ve AWS S3 SDK (yaz\u0131l\u0131m geli\u015ftirme kiti) kullan\u0131larak kolayca ger\u00e7ekle\u015ftirilebilir. Burada, istemcinin bir y\u00fckleme ba\u015flatma iste\u011fi g\u00f6nderdi\u011fini ve sunucunun buna kar\u015f\u0131l\u0131k olarak bir dizi presigned URL d\u00f6nd\u00fcrd\u00fc\u011f\u00fcn\u00fc varsay\u0131yoruz.<\/p>\n<p>\u0130lk olarak, Node.js uygulaman\u0131zda AWS SDK&#8217;y\u0131 kurman\u0131z ve yap\u0131land\u0131rman\u0131z gerekir. Bu genellikle <code>@aws-sdk\/client-s3<\/code> paketini kullanarak yap\u0131l\u0131r:<\/p>\n<div class=\"code-container\">\n<pre><code>\n\/\/ app.js\nconst { S3Client, CreateMultipartUploadCommand, UploadPartCommand, CompleteMultipartUploadCommand, AbortMultipartUploadCommand } = require(\"@aws-sdk\/client-s3\");\nconst { getSignedUrl } = require(\"@aws-sdk\/s3-request-presigner\");\n\n\/\/ S3 istemcisini yap\u0131land\u0131r\u0131n\nconst s3Client = new S3Client({\n  region: process.env.AWS_REGION || \"eu-central-1\",\n  credentials: {\n    accessKeyId: process.env.AWS_ACCESS_KEY_ID,\n    secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,\n  },\n});\n\nconst BUCKET_NAME = process.env.S3_BUCKET_NAME || \"your-ai-images-bucket\";\nconst PRESIGNED_URL_EXPIRATION_SECONDS = 3600; \/\/ 1 saat\n\n\/\/ Y\u00fckleme ba\u015flatma endpoint'i\nasync function initiateMultipartUpload(fileName, fileType, numParts) {\n  const Key = <code>ai-images\/${Date.now()}-${fileName}<\/code>; \/\/ Benzersiz dosya ad\u0131 olu\u015fturma\n\n  const createMultipartUploadParams = {\n    Bucket: BUCKET_NAME,\n    Key,\n    ContentType: fileType,\n  };\n\n  try {\n    const command = new CreateMultipartUploadCommand(createMultipartUploadParams);\n    const { UploadId } = await s3Client.send(command);\n\n    if (!UploadId) {\n      throw new Error(\"Multipart Upload ID al\u0131namad\u0131.\");\n    }\n\n    const presignedUrls = [];\n    for (let i = 1; i <= numParts; i++) {\n      const uploadPartParams = {\n        Bucket: BUCKET_NAME,\n        Key,\n        UploadId,\n        PartNumber: i,\n      };\n      const uploadPartCommand = new UploadPartCommand(uploadPartParams);\n      const url = await getSignedUrl(s3Client, uploadPartCommand, { expiresIn: PRESIGNED_URL_EXPIRATION_SECONDS });\n      presignedUrls.push({ partNumber: i, url });\n    }\n\n    return {\n      uploadId: UploadId,\n      key: Key,\n      presignedUrls,\n    };\n  } catch (error) {\n    console.error(\"Multipart y\u00fckleme ba\u015flatma hatas\u0131:\", error);\n    throw error;\n  }\n}\n\n\/\/ \u00d6rnek bir Express.js endpoint'i\n\/\/ app.post('\/upload\/initiate', async (req, res) => {\n\/\/   const { fileName, fileType, numParts } = req.body;\n\/\/   try {\n\/\/     const result = await initiateMultipartUpload(fileName, fileType, numParts);\n\/\/     \/\/ Bu bilgiyi veritaban\u0131na kaydedebiliriz (ileriki b\u00f6l\u00fcmlerde ele al\u0131nacak)\n\/\/     res.status(200).json(result);\n\/\/   } catch (error) {\n\/\/     res.status(500).json({ message: 'Y\u00fckleme ba\u015flat\u0131lamad\u0131', error: error.message });\n\/\/   }\n\/\/ });\n<\/code><\/pre>\n<\/div>\n<p>Yukar\u0131daki kod blo\u011fu, Node.js sunucusunda bir multipart y\u00fckleme s\u00fcrecini nas\u0131l ba\u015flataca\u011f\u0131m\u0131z\u0131 ve her bir dosya par\u00e7as\u0131 i\u00e7in nas\u0131l presigned URL&#8217;ler olu\u015fturaca\u011f\u0131m\u0131z\u0131 g\u00f6stermektedir. \u0130lk olarak, <code>S3Client<\/code> ile AWS S3 servisine ba\u011flant\u0131 sa\u011fl\u0131yoruz. Ard\u0131ndan, <code>initiateMultipartUpload<\/code> fonksiyonu, istemciden gelen dosya ad\u0131, dosya t\u00fcr\u00fc ve toplam par\u00e7a say\u0131s\u0131 bilgilerini al\u0131r. Bu bilgilerle, S3&#8217;e bir <code>CreateMultipartUploadCommand<\/code> g\u00f6ndererek yeni bir multipart y\u00fcklemesi ba\u015flat\u0131l\u0131r ve benzersiz bir <code>UploadId<\/code> al\u0131n\u0131r. Bu <code>UploadId<\/code>, t\u00fcm par\u00e7alar\u0131n ayn\u0131 y\u00fckleme i\u015flemine ait oldu\u011funu belirtmek i\u00e7in kullan\u0131l\u0131r. Sonras\u0131nda, d\u00f6ng\u00fc i\u00e7inde her bir par\u00e7a i\u00e7in (<code>PartNumber<\/code> 1&#8217;den ba\u015flayarak <code>numParts<\/code>&#8216;a kadar), <code>UploadPartCommand<\/code> komutu olu\u015fturulur ve <code>getSignedUrl<\/code> fonksiyonu ile bu komut i\u00e7in \u00f6n imzal\u0131 bir URL elde edilir. Bu URL&#8217;ler, belirli bir s\u00fcre (\u00f6rne\u011fin 1 saat) ge\u00e7erli olacak \u015fekilde ayarlan\u0131r ve istemcinin bu s\u00fcre zarf\u0131nda ilgili par\u00e7ay\u0131 do\u011frudan S3&#8217;e y\u00fcklemesini sa\u011flar. Fonksiyon, istemciye <code>UploadId<\/code>, dosyan\u0131n S3 \u00fczerindeki anahtar\u0131 (<code>Key<\/code>) ve t\u00fcm presigned URL&#8217;leri i\u00e7eren bir nesne d\u00f6nd\u00fcr\u00fcr. Bu s\u00fcre\u00e7, sunucunun sadece koordinasyon rol\u00fcn\u00fc \u00fcstlenmesini ve b\u00fcy\u00fck veri transferi y\u00fck\u00fcn\u00fc S3&#8217;e devretmesini sa\u011flar. Bu sayede, Node.js sunucusu, binlerce e\u015f zamanl\u0131 y\u00fckleme iste\u011fini bile kolayca y\u00f6netebilir, \u00e7\u00fcnk\u00fc as\u0131l veri transferi sunucunun \u00fczerinden ge\u00e7mez. Bu, uygulaman\u0131n genel performans\u0131n\u0131 ve \u00f6l\u00e7eklenebilirli\u011fini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r. Ayr\u0131ca, presigned URL&#8217;lerin s\u00fcreli olmas\u0131, g\u00fcvenlik risklerini de minimize eder. \u0130stemci, bu URL&#8217;leri kullanarak do\u011frudan S3 ile ileti\u015fim kurar ve her par\u00e7a ba\u015far\u0131yla y\u00fcklendi\u011finde S3, istemciye bir <code>ETag<\/code> (varl\u0131k etiketi) d\u00f6nd\u00fcr\u00fcr. Bu <code>ETag<\/code>&#8216;ler, y\u00fckleme tamamland\u0131\u011f\u0131nda S3&#8217;e g\u00f6nderilecek olan &#8220;tamamlama&#8221; (completion) iste\u011fi i\u00e7in kritik \u00f6neme sahiptir. Bu karma\u015f\u0131k s\u00fcre\u00e7, geli\u015ftiricilerin b\u00fcy\u00fck dosya y\u00fcklemelerini basit ve g\u00fcvenli bir \u015fekilde y\u00f6netmelerini sa\u011flar.<\/p>\n<h3>\u0130stemci Taraf\u0131nda Multipart Y\u00fckleme Y\u00f6netimi Nas\u0131l Ger\u00e7ekle\u015fir?<\/h3>\n<p>Node.js sunucumuzdan presigned URL&#8217;leri ald\u0131ktan sonra, as\u0131l y\u00fckleme i\u015fi istemci taraf\u0131na ge\u00e7er. Bu, genellikle bir web taray\u0131c\u0131s\u0131 (JavaScript kullanarak) veya bir mobil uygulama taraf\u0131ndan yap\u0131l\u0131r. \u0130stemcinin g\u00f6revi, b\u00fcy\u00fck YZ g\u00f6rsel dosyas\u0131n\u0131 k\u00fc\u00e7\u00fck par\u00e7alara b\u00f6lmek ve her bir par\u00e7ay\u0131 ilgili presigned URL&#8217;ye HTTP PUT iste\u011fiyle do\u011frudan AWS S3&#8217;e g\u00f6ndermektir. Bu s\u00fcre\u00e7, y\u00fcklemenin dayan\u0131kl\u0131l\u0131\u011f\u0131n\u0131 ve h\u0131z\u0131n\u0131 art\u0131ran kritik bir ad\u0131md\u0131r.<\/p>\n<p>\u0130stemci taraf\u0131ndaki ad\u0131mlar genellikle \u015funlar\u0131 i\u00e7erir:<\/p>\n<ol>\n<li>\n        <strong>Dosyay\u0131 Par\u00e7alara B\u00f6lme:<\/strong> \u0130stemci, y\u00fcklemek istedi\u011fi dosyay\u0131 belirli bir boyutta (\u00f6rne\u011fin 5MB veya 10MB) par\u00e7alara ay\u0131r\u0131r. Her par\u00e7a, bir <code>Blob<\/code> veya <code>Buffer<\/code> nesnesi olarak ele al\u0131n\u0131r. Bu b\u00f6lme i\u015flemi, taray\u0131c\u0131da <code>File.slice()<\/code> metodu ile kolayca yap\u0131labilir. Par\u00e7a boyutunun se\u00e7imi \u00f6nemlidir; \u00e7ok k\u00fc\u00e7\u00fck par\u00e7alar gereksiz yere fazla istek olu\u015ftururken, \u00e7ok b\u00fcy\u00fck par\u00e7alar hata durumunda daha fazla verinin yeniden y\u00fcklenmesini gerektirebilir.\n    <\/li>\n<li>\n        <strong>Par\u00e7alar\u0131 Y\u00fckleme:<\/strong> \u0130stemci, Node.js sunucusundan ald\u0131\u011f\u0131 her bir presigned URL&#8217;yi kullanarak ilgili dosya par\u00e7as\u0131n\u0131 S3&#8217;e y\u00fckler. Bu, genellikle bir <code>fetch<\/code> API veya <code>XMLHttpRequest<\/code> ile yap\u0131lan bir HTTP PUT iste\u011fidir. Her istek, ilgili par\u00e7ay\u0131 ve gerekli ba\u015fl\u0131klar\u0131 (\u00f6rne\u011fin <code>Content-Type<\/code>) i\u00e7erir.<\/p>\n<div class=\"code-container\">\n<pre><code>\n\/\/ \u0130stemci taraf\u0131 (\u00f6rne\u011fin React, Vue, Angular veya vanilla JS)\nasync function uploadPart(partUrl, partData) {\n  try {\n    const response = await fetch(partUrl, {\n      method: 'PUT',\n      body: partData,\n      headers: {\n        'Content-Type': 'application\/octet-stream', \/\/ veya dosyan\u0131n ger\u00e7ek tipi\n      },\n    });\n\n    if (!response.ok) {\n      throw new Error(<code>Par\u00e7a y\u00fckleme hatas\u0131: ${response.statusText}<\/code>);\n    }\n\n    const etag = response.headers.get('ETag');\n    return etag; \/\/ S3, ba\u015far\u0131yla y\u00fcklenen her par\u00e7a i\u00e7in bir ETag d\u00f6nd\u00fcr\u00fcr\n  } catch (error) {\n    console.error(\"Par\u00e7a y\u00fcklenirken hata olu\u015ftu:\", error);\n    throw error;\n  }\n}\n<\/code><\/pre>\n<\/div>\n<\/li>\n<li>\n        <strong>ETag&#8217;leri Toplama:<\/strong> S3, her ba\u015far\u0131l\u0131 par\u00e7a y\u00fcklemesi i\u00e7in bir <code>ETag<\/code> (Entity Tag) HTTP ba\u015fl\u0131\u011f\u0131 d\u00f6nd\u00fcr\u00fcr. \u0130stemci, bu <code>ETag<\/code>&#8216;leri ve ilgili par\u00e7a numaralar\u0131n\u0131 toplamal\u0131d\u0131r. Bu <code>ETag<\/code>&#8216;ler, t\u00fcm par\u00e7alar y\u00fcklendikten sonra S3&#8217;e g\u00f6nderilecek olan &#8220;multipart y\u00fcklemeyi tamamlama&#8221; (Complete Multipart Upload) iste\u011fi i\u00e7in kritik \u00f6neme sahiptir.\n    <\/li>\n<li>\n        <strong>Paralel Y\u00fckleme ve \u0130lerleme Takibi:<\/strong> \u0130stemci, birden fazla par\u00e7ay\u0131 ayn\u0131 anda y\u00fckleyerek s\u00fcreci h\u0131zland\u0131rabilir. Bu, genellikle <code>Promise.all<\/code> veya benzeri asenkron kontrol yap\u0131lar\u0131 kullan\u0131larak yap\u0131l\u0131r. Kullan\u0131c\u0131lara y\u00fcklemenin ilerlemesini g\u00f6stermek i\u00e7in bir ilerleme \u00e7ubu\u011fu (progress bar) veya y\u00fczde g\u00f6stergesi uygulanabilir. Bu, y\u00fckleme s\u0131ras\u0131nda kullan\u0131c\u0131n\u0131n sabr\u0131n\u0131 korumas\u0131na yard\u0131mc\u0131 olur.\n    <\/li>\n<li>\n        <strong>Y\u00fcklemeyi Tamamlama:<\/strong> T\u00fcm par\u00e7alar ba\u015far\u0131yla y\u00fcklendikten ve t\u00fcm <code>ETag<\/code>&#8216;ler topland\u0131ktan sonra, istemci Node.js sunucusuna bir istek g\u00f6nderir. Bu istek, <code>UploadId<\/code>, dosyan\u0131n S3 anahtar\u0131 (<code>Key<\/code>) ve toplanan t\u00fcm <code>ETag<\/code>&#8216;leri (par\u00e7a numaralar\u0131yla birlikte) i\u00e7erir. Node.js sunucusu, bu bilgileri kullanarak S3&#8217;e bir <code>CompleteMultipartUploadCommand<\/code> g\u00f6nderir. Bu komut, S3&#8217;e t\u00fcm par\u00e7alar\u0131n birle\u015ftirilmesini ve nihai dosyan\u0131n olu\u015fturulmas\u0131n\u0131 emreder.\n    <\/li>\n<\/ol>\n<p>Bu istemci taraf\u0131 y\u00f6netimi, kullan\u0131c\u0131n\u0131n do\u011frudan bulut depolama hizmetiyle etkile\u015fime girmesini sa\u011flayarak, Node.js sunucusunun veri aktar\u0131m y\u00fck\u00fcn\u00fc hafifletir. Bu mimari, y\u00fcksek performansl\u0131 ve dayan\u0131kl\u0131 dosya y\u00fckleme sistemleri olu\u015fturmak i\u00e7in modern web uygulamalar\u0131nda yayg\u0131n olarak kullan\u0131lmaktad\u0131r. \u0130stemci taraf\u0131nda uygulanan bu zekice y\u00f6netim, kullan\u0131c\u0131lar\u0131n b\u00fcy\u00fck dosyalar\u0131 sorunsuz bir \u015fekilde y\u00fckleyebilmesini sa\u011flarken, ayn\u0131 zamanda geli\u015ftiricilere daha esnek ve \u00f6l\u00e7eklenebilir bir altyap\u0131 sunar. Bu, \u00f6zellikle AI taraf\u0131ndan \u00fcretilen g\u00f6rseller gibi b\u00fcy\u00fck medya dosyalar\u0131n\u0131n aktar\u0131m\u0131nda, uygulaman\u0131n genel yan\u0131t verme s\u00fcresini ve g\u00fcvenilirli\u011fini art\u0131r\u0131r.<\/p>\n<h3>Multipart Y\u00fckleme Durumunun Sunucu Taraf\u0131nda Takibi<\/h3>\n<p>Y\u00fckleme s\u00fcrecinin dayan\u0131kl\u0131l\u0131\u011f\u0131n\u0131 ve y\u00f6netilebilirli\u011fini art\u0131rmak i\u00e7in Node.js sunucumuzun, her bir multipart y\u00fcklemesinin durumunu takip etmesi kritik \u00f6neme sahiptir. Bu takip, \u00f6zellikle y\u00fckleme iptal edildi\u011finde (abort) veya bir hata durumunda kurtarma (recovery) senaryolar\u0131nda hayati rol oynar. Durum takibi i\u00e7in genellikle bir veritaban\u0131 (Redis, PostgreSQL, MongoDB vb.) kullan\u0131l\u0131r.<\/p>\n<p>Sunucunun takip etmesi gereken temel bilgiler \u015funlard\u0131r:<\/p>\n<ul>\n<li><strong><code>UploadId<\/code>:<\/strong> S3 taraf\u0131ndan sa\u011flanan benzersiz y\u00fckleme kimli\u011fi. T\u00fcm par\u00e7alar bu kimli\u011fe ba\u011fl\u0131d\u0131r.<\/li>\n<li><strong><code>Key<\/code>:<\/strong> Dosyan\u0131n S3 \u00fczerindeki nihai yolu ve ad\u0131.<\/li>\n<li><strong><code>FileName<\/code> ve <code>FileType<\/code>:<\/strong> Orijinal dosya ad\u0131 ve t\u00fcr\u00fc.<\/li>\n<li><strong><code>UserId<\/code>:<\/strong> Y\u00fcklemeyi ba\u015flatan kullan\u0131c\u0131n\u0131n kimli\u011fi (g\u00fcvenlik ve yetkilendirme i\u00e7in).<\/li>\n<li><strong><code>PartDetails<\/code>:<\/strong> Her bir par\u00e7a i\u00e7in par\u00e7a numaras\u0131 ve S3&#8217;ten d\u00f6nen <code>ETag<\/code> bilgisi. Bu bilgiler, y\u00fcklemeyi tamamlama a\u015famas\u0131nda S3&#8217;e g\u00f6nderilmelidir.<\/li>\n<li><strong><code>Status<\/code>:<\/strong> Y\u00fcklemenin mevcut durumu (\u00f6rne\u011fin, <code>INITIATED<\/code> &#8211; ba\u015flat\u0131ld\u0131, <code>IN_PROGRESS<\/code> &#8211; devam ediyor, <code>COMPLETED<\/code> &#8211; tamamland\u0131, <code>ABORTED<\/code> &#8211; iptal edildi, <code>FAILED<\/code> &#8211; ba\u015far\u0131s\u0131z oldu).<\/li>\n<li><strong><code>CreatedAt<\/code> ve <code>UpdatedAt<\/code>:<\/strong> Y\u00fckleme kayd\u0131n\u0131n olu\u015fturulma ve son g\u00fcncellenme zamanlar\u0131.<\/li>\n<\/ul>\n<p><strong>Veritaban\u0131 Se\u00e7imi:<\/strong><\/p>\n<ul>\n<li>\n        <strong>Redis:<\/strong> K\u0131sa \u00f6m\u00fcrl\u00fc ve y\u00fcksek performansl\u0131 durum takibi i\u00e7in idealdir. \u00d6zellikle <code>UploadId<\/code>&#8216;leri ve ili\u015fkili par\u00e7a bilgilerini ge\u00e7ici olarak saklamak i\u00e7in kullan\u0131labilir. Redis&#8217;in h\u0131z\u0131ndan faydalanarak, anl\u0131k durum g\u00fcncellemeleri h\u0131zl\u0131ca i\u015flenebilir. Ancak, kal\u0131c\u0131 depolama gerektiren durumlar i\u00e7in (\u00f6rne\u011fin, bir y\u00fcklemenin g\u00fcnlerce s\u00fcrmesi veya uygulaman\u0131n yeniden ba\u015flat\u0131lmas\u0131 durumunda durumun korunmas\u0131) tek ba\u015f\u0131na yeterli olmayabilir.\n    <\/li>\n<li>\n        <strong>PostgreSQL\/MongoDB:<\/strong> Daha kal\u0131c\u0131 ve yap\u0131sal veriler i\u00e7in uygundur. Y\u00fckleme ge\u00e7mi\u015fi, kullan\u0131c\u0131ya \u00f6zel y\u00fckleme listeleri ve detayl\u0131 hata kay\u0131tlar\u0131 gibi bilgileri saklamak i\u00e7in tercih edilir. Bu veritabanlar\u0131, y\u00fckleme durumunu g\u00fcvenilir bir \u015fekilde koruyarak, sunucu yeniden ba\u015flat\u0131lsa bile devam eden y\u00fcklemelerin takibini sa\u011flar.\n    <\/li>\n<\/ul>\n<p><strong>Durum Takibi Ak\u0131\u015f\u0131:<\/strong><\/p>\n<ol>\n<li>\n        <strong>Y\u00fckleme Ba\u015flatma:<\/strong> \u0130stemci <code>\/upload\/initiate<\/code> endpoint&#8217;ine istek g\u00f6nderdi\u011finde, Node.js sunucusu S3&#8217;ten <code>UploadId<\/code>&#8216;yi al\u0131r ve bu bilgileri (<code>UploadId<\/code>, <code>Key<\/code>, <code>UserId<\/code>, <code>Status: INITIATED<\/code> vb.) veritaban\u0131na kaydeder.\n    <\/li>\n<li>\n        <strong>Par\u00e7a Y\u00fckleme (\u0130stemci):<\/strong> \u0130stemci her bir par\u00e7ay\u0131 S3&#8217;e y\u00fckledikten sonra, d\u00f6nen <code>ETag<\/code> bilgisini Node.js sunucusuna g\u00f6nderebilir (iste\u011fe ba\u011fl\u0131, baz\u0131 durumlarda istemci t\u00fcm ETag&#8217;leri toplay\u0131p tek bir istekte g\u00f6nderebilir). Sunucu, bu <code>ETag<\/code>&#8216;i veritaban\u0131ndaki ilgili <code>UploadId<\/code> kayd\u0131na ekler. Bu ad\u0131m, \u00f6zellikle y\u00fcklemenin ilerlemesini detayl\u0131 takip etmek veya par\u00e7a baz\u0131nda kurtarma mekanizmalar\u0131 uygulamak i\u00e7in faydal\u0131d\u0131r.\n    <\/li>\n<li>\n        <strong>Y\u00fcklemeyi Tamamlama:<\/strong> \u0130stemci t\u00fcm par\u00e7alar\u0131 y\u00fckleyip t\u00fcm <code>ETag<\/code>&#8216;leri toplad\u0131ktan sonra, <code>\/upload\/complete<\/code> endpoint&#8217;ine <code>UploadId<\/code>, <code>Key<\/code> ve toplanan <code>PartDetails<\/code> ile bir istek g\u00f6nderir. Node.js sunucusu, bu bilgileri S3&#8217;e ileterek y\u00fcklemeyi tamamlar ve veritaban\u0131ndaki kayd\u0131n durumunu <code>COMPLETED<\/code> olarak g\u00fcnceller.<\/p>\n<div class=\"code-container\">\n<pre><code>\n\/\/ Y\u00fcklemeyi tamamlama endpoint'i\nasync function completeMultipartUpload(uploadId, key, parts) {\n  const completeMultipartUploadParams = {\n    Bucket: BUCKET_NAME,\n    Key: key,\n    UploadId: uploadId,\n    MultipartUpload: {\n      Parts: parts.map(p => ({ PartNumber: p.partNumber, ETag: p.etag })),\n    },\n  };\n\n  try {\n    const command = new CompleteMultipartUploadCommand(completeMultipartUploadParams);\n    await s3Client.send(command);\n\n    \/\/ Veritaban\u0131ndaki durumu g\u00fcncelle\n    \/\/ \u00d6rne\u011fin: await db.updateUploadStatus(uploadId, 'COMPLETED');\n\n    return { success: true, message: \"Dosya ba\u015far\u0131yla y\u00fcklendi.\" };\n  } catch (error) {\n    console.error(\"Multipart y\u00fcklemeyi tamamlama hatas\u0131:\", error);\n    \/\/ Veritaban\u0131ndaki durumu FAILED olarak g\u00fcncelleyebiliriz\n    \/\/ await db.updateUploadStatus(uploadId, 'FAILED');\n    throw error;\n  }\n}\n\n\/\/ \u00d6rnek bir Express.js endpoint'i\n\/\/ app.post('\/upload\/complete', async (req, res) => {\n\/\/   const { uploadId, key, parts } = req.body; \/\/ parts: [{ partNumber: 1, etag: \"...\" }, ...]\n\/\/   try {\n\/\/     const result = await completeMultipartUpload(uploadId, key, parts);\n\/\/     res.status(200).json(result);\n\/\/   } catch (error) {\n\/\/     res.status(500).json({ message: 'Y\u00fckleme tamamlanamad\u0131', error: error.message });\n\/\/   }\n\/\/ });\n<\/code><\/pre>\n<\/div>\n<\/li>\n<li>\n        <strong>Hata Y\u00f6netimi ve Temizleme:<\/strong> Y\u00fckleme s\u0131ras\u0131nda herhangi bir hata olu\u015fursa (a\u011f kesintisi, S3 hatas\u0131 vb.), sunucu bu durumu veritaban\u0131na <code>FAILED<\/code> olarak kaydedebilir. Ayr\u0131ca, belirli bir s\u00fcre i\u00e7inde tamamlanmayan veya iptal edilen y\u00fcklemeler i\u00e7in periyodik temizleme (garbage collection) i\u015flemleri \u00e7al\u0131\u015ft\u0131r\u0131larak, S3&#8217;teki eksik par\u00e7alar veya veritaban\u0131ndaki eski kay\u0131tlar silinebilir. Bu, hem depolama maliyetlerini d\u00fc\u015f\u00fcr\u00fcr hem de sistemin d\u00fczenli kalmas\u0131n\u0131 sa\u011flar.\n    <\/li>\n<\/ol>\n<p>Bu detayl\u0131 durum takibi, Node.js uygulamas\u0131n\u0131n sadece bir API sa\u011flay\u0131c\u0131s\u0131 olmaktan \u00f6te, t\u00fcm y\u00fckleme ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc aktif olarak y\u00f6neten ve denetleyen bir kontrol mekanizmas\u0131 haline gelmesini sa\u011flar. Bu sayede, b\u00fcy\u00fck YZ g\u00f6rsellerinin aktar\u0131m\u0131 s\u0131ras\u0131nda ortaya \u00e7\u0131kabilecek herhangi bir soruna kar\u015f\u0131 daha diren\u00e7li ve kullan\u0131c\u0131 dostu bir sistem in\u015fa edilmi\u015f olur. Veritaban\u0131 kullan\u0131m\u0131, bu s\u00fcrecin kal\u0131c\u0131 ve g\u00fcvenilir olmas\u0131n\u0131 sa\u011flar, b\u00f6ylece uygulaman\u0131n yeniden ba\u015flat\u0131lmas\u0131 veya beklenmedik bir hata durumunda bile y\u00fckleme durumlar\u0131 korunabilir.<\/p>\n<h3>Y\u00fckleme \u0130ptali (Abort) Nas\u0131l Y\u00f6netilir?<\/h3>\n<p>Kullan\u0131c\u0131lar bazen devam eden bir dosya y\u00fcklemesini iptal etmek isteyebilirler. Bu durum, yanl\u0131\u015f bir dosya se\u00e7imi, internet ba\u011flant\u0131s\u0131n\u0131n kesilmesi veya sadece fikrin de\u011fi\u015fmesi gibi bir\u00e7ok nedenden kaynaklanabilir. Node.js sunucumuzun, bu iptal isteklerini do\u011fru bir \u015fekilde y\u00f6netmesi ve bulut depolama hizmetindeki (S3) gereksiz kaynaklar\u0131 temizlemesi \u00f6nemlidir. Bu, hem maliyetleri d\u00fc\u015f\u00fcr\u00fcr hem de sistemin d\u00fczenli kalmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>Y\u00fckleme iptali s\u00fcreci genellikle \u015fu ad\u0131mlar\u0131 i\u00e7erir:<\/p>\n<ol>\n<li>\n        <strong>\u0130stemciden \u0130ptal \u0130ste\u011fi:<\/strong> Kullan\u0131c\u0131, web aray\u00fcz\u00fcnde veya mobil uygulamada bir &#8220;\u0130ptal&#8221; d\u00fc\u011fmesine t\u0131klad\u0131\u011f\u0131nda, istemci Node.js sunucusuna bir iptal iste\u011fi g\u00f6nderir. Bu istek genellikle <code>UploadId<\/code> ve dosyan\u0131n S3 \u00fczerindeki <code>Key<\/code> bilgisini i\u00e7erir.\n    <\/li>\n<li>\n        <strong>Node.js Sunucusunun \u0130ptal \u0130ste\u011fini \u0130\u015flemesi:<\/strong> Node.js sunucusu, bu iste\u011fi ald\u0131\u011f\u0131nda, S3&#8217;e <code>AbortMultipartUploadCommand<\/code> komutunu g\u00f6nderir. Bu komut, S3&#8217;e belirtilen <code>UploadId<\/code>&#8216;ye sahip t\u00fcm y\u00fckleme par\u00e7alar\u0131n\u0131 silmesini ve multipart y\u00fckleme oturumunu sonland\u0131rmas\u0131n\u0131 emreder.<\/p>\n<div class=\"code-container\">\n<pre><code>\n\/\/ Y\u00fckleme iptal etme endpoint'i\nasync function abortMultipartUpload(uploadId, key) {\n  const abortMultipartUploadParams = {\n    Bucket: BUCKET_NAME,\n    Key: key,\n    UploadId: uploadId,\n  };\n\n  try {\n    const command = new AbortMultipartUploadCommand(abortMultipartUploadParams);\n    await s3Client.send(command);\n\n    \/\/ Veritaban\u0131ndaki durumu g\u00fcncelle\n    \/\/ \u00d6rne\u011fin: await db.updateUploadStatus(uploadId, 'ABORTED');\n\n    return { success: true, message: \"Y\u00fckleme ba\u015far\u0131yla iptal edildi.\" };\n  } catch (error) {\n    console.error(\"Multipart y\u00fcklemeyi iptal etme hatas\u0131:\", error);\n    \/\/ Veritaban\u0131ndaki durumu FAILED olarak g\u00fcncelleyebiliriz\n    \/\/ await db.updateUploadStatus(uploadId, 'FAILED');\n    throw error;\n  }\n}\n\n\/\/ \u00d6rnek bir Express.js endpoint'i\n\/\/ app.post('\/upload\/abort', async (req, res) => {\n\/\/   const { uploadId, key } = req.body;\n\/\/   try {\n\/\/     const result = await abortMultipartUpload(uploadId, key);\n\/\/     res.status(200).json(result);\n\/\/   } catch (error) {\n\/\/     res.status(500).json({ message: 'Y\u00fckleme iptal edilemedi', error: error.message });\n\/\/   }\n\/\/ });\n<\/code><\/pre>\n<\/div>\n<\/li>\n<li>\n        <strong>Veritaban\u0131 Durumunu G\u00fcncelleme:<\/strong> S3&#8217;teki temizleme i\u015flemi tamamland\u0131ktan sonra, Node.js sunucusu veritaban\u0131ndaki ilgili y\u00fckleme kayd\u0131n\u0131n durumunu <code>ABORTED<\/code> olarak g\u00fcnceller. Bu, sistemin genel tutarl\u0131l\u0131\u011f\u0131n\u0131 sa\u011flar ve gelecekteki sorgulamalar i\u00e7in do\u011fru durumu yans\u0131t\u0131r.\n    <\/li>\n<li>\n        <strong>\u0130stemciye Yan\u0131t Verme:<\/strong> Sunucu, iptal i\u015fleminin ba\u015far\u0131yla tamamland\u0131\u011f\u0131n\u0131 belirten bir yan\u0131t\u0131 istemciye geri g\u00f6nderir. \u0130stemci, bu yan\u0131t\u0131 alarak kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fc g\u00fcncelleyebilir (\u00f6rne\u011fin, ilerleme \u00e7ubu\u011funu kald\u0131rabilir veya bir iptal mesaj\u0131 g\u00f6sterebilir).\n    <\/li>\n<\/ol>\n<p><strong>Otomatik Temizleme Mekanizmalar\u0131:<\/strong><\/p>\n<p>Bazen kullan\u0131c\u0131lar bir y\u00fcklemeyi iptal etmeyi unutabilir veya a\u011f ba\u011flant\u0131s\u0131 kesildi\u011fi i\u00e7in iptal iste\u011fi sunucuya ula\u015famayabilir. Bu t\u00fcr durumlarda, S3&#8217;te tamamlanmam\u0131\u015f (incomplete) multipart y\u00fckleme oturumlar\u0131 kalabilir ve bu da depolama maliyetlerine neden olabilir. Bu nedenle, periyodik bir temizleme mekanizmas\u0131 (\u00f6rne\u011fin, bir cron i\u015fi veya AWS Lambda fonksiyonu) uygulamak \u00f6nemlidir:<\/p>\n<ul>\n<li>\n        <strong>Zamanlanm\u0131\u015f G\u00f6rev:<\/strong> Node.js sunucusunda veya ayr\u0131 bir hizmet olarak \u00e7al\u0131\u015fan bir zamanlanm\u0131\u015f g\u00f6rev, belirli aral\u0131klarla (\u00f6rne\u011fin g\u00fcnde bir kez) veritaban\u0131ndaki <code>INITIATED<\/code> veya <code>IN_PROGRESS<\/code> durumunda olan ancak belirli bir s\u00fcredir (\u00f6rne\u011fin 24 saat) aktif olmayan y\u00fckleme kay\u0131tlar\u0131n\u0131 bulur.\n    <\/li>\n<li>\n        <strong>S3&#8217;teki Eksik Par\u00e7alar\u0131 \u0130ptal Etme:<\/strong> Bu g\u00f6rev, bulunan y\u00fckleme kay\u0131tlar\u0131 i\u00e7in S3&#8217;e <code>AbortMultipartUploadCommand<\/code> g\u00f6ndererek, tamamlanmam\u0131\u015f multipart y\u00fckleme oturumlar\u0131n\u0131 temizler.\n    <\/li>\n<li>\n        <strong>Veritaban\u0131 Kay\u0131tlar\u0131n\u0131 G\u00fcncelleme:<\/strong> Temizleme i\u015flemi tamamland\u0131ktan sonra, veritaban\u0131ndaki ilgili kay\u0131tlar\u0131n durumunu <code>ABORTED<\/code> veya <code>EXPIRED<\/code> olarak g\u00fcnceller.\n    <\/li>\n<\/ul>\n<p>Bu kapsaml\u0131 iptal y\u00f6netimi stratejisi, Node.js uygulamas\u0131n\u0131n sadece verimli y\u00fckleme sa\u011flamakla kalmay\u0131p, ayn\u0131 zamanda kaynaklar\u0131 ak\u0131ll\u0131ca y\u00f6netmesini ve gereksiz maliyetlerin \u00f6n\u00fcne ge\u00e7mesini sa\u011flar. Kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan da \u00f6nemlidir, \u00e7\u00fcnk\u00fc kullan\u0131c\u0131lar y\u00fcklemeleri \u00fczerinde tam kontrol sahibi olduklar\u0131n\u0131 hissederler. \u00d6zellikle AI g\u00f6rselleri gibi b\u00fcy\u00fck dosyalar\u0131n s\u00f6z konusu oldu\u011fu durumlarda, bu t\u00fcr bir y\u00f6netim, sistemin genel sa\u011fl\u0131\u011f\u0131 ve s\u00fcrd\u00fcr\u00fclebilirli\u011fi i\u00e7in hayati \u00f6nem ta\u015f\u0131r.<\/p>\n<h3>Ger\u00e7ek D\u00fcnya Senaryolar\u0131 ve Vaka Analizi: YZ Avatar Olu\u015fturma Platformu<\/h3>\n<p>\u015eimdiye kadar ele ald\u0131\u011f\u0131m\u0131z presigned par\u00e7alar, \u00e7oklu durum takibi ve iptal y\u00f6netimi gibi kavramlar\u0131, ger\u00e7ek d\u00fcnyadan bir \u00f6rnekle peki\u015ftirelim: Y\u00fcksek \u00e7\u00f6z\u00fcn\u00fcrl\u00fckl\u00fc yapay zeka (YZ) destekli bir avatar olu\u015fturma platformu. Bu platform, kullan\u0131c\u0131lar\u0131n metin a\u00e7\u0131klamalar\u0131 veya y\u00fckledikleri foto\u011fraflar arac\u0131l\u0131\u011f\u0131yla kendilerine \u00f6zel, sanatsal veya fotoger\u00e7ek\u00e7i avatarlar olu\u015fturmas\u0131n\u0131 sa\u011fl\u0131yor. Bu avatarlar genellikle y\u00fcksek \u00e7\u00f6z\u00fcn\u00fcrl\u00fckl\u00fc (\u00f6rne\u011fin 4K veya 8K) g\u00f6rseller olarak \u00fcretiliyor ve dosya boyutlar\u0131 kolayca onlarca megabayta ula\u015fabiliyor.<\/p>\n<p><strong>Senaryo: &#8220;Sanatsal Avatar\u0131m&#8221; Platformu<\/strong><\/p>\n<p>Kullan\u0131c\u0131lar, &#8220;Sanatsal Avatar\u0131m&#8221; adl\u0131 bir web uygulamas\u0131na giriyor. Burada, kendilerini anlatan birka\u00e7 kelime yaz\u0131yorlar (\u00f6rne\u011fin, &#8220;uzayda s\u00f6rf yapan bir kedi&#8221;) veya kendi foto\u011fraflar\u0131n\u0131 y\u00fckl\u00fcyorlar. YZ modeli, bu girdilere dayanarak \u00e7e\u015fitli avatar se\u00e7enekleri \u00fcretiyor. Kullan\u0131c\u0131 bir avatardan memnun kald\u0131\u011f\u0131nda, onu indirip veya profil foto\u011fraf\u0131 olarak kaydetmek istiyor. \u0130\u015fte bu noktada bizim Node.js tabanl\u0131 \u00e7\u00f6z\u00fcm\u00fcm\u00fcz devreye giriyor.<\/p>\n<p><strong>Vaka Analizi Ad\u0131mlar\u0131:<\/strong><\/p>\n<ol>\n<li>\n        <strong>YZ G\u00f6rselinin Olu\u015fturulmas\u0131:<\/strong> Kullan\u0131c\u0131 iste\u011fi \u00fczerine, Node.js sunucusu bir YZ g\u00f6rsel olu\u015fturma hizmetine (\u00f6rne\u011fin, bir Stable Diffusion API&#8217;si) istek g\u00f6nderir. YZ hizmeti, y\u00fcksek \u00e7\u00f6z\u00fcn\u00fcrl\u00fckl\u00fc g\u00f6rseli olu\u015fturur ve genellikle onu ge\u00e7ici bir depolama alan\u0131na (\u00f6rne\u011fin, S3&#8217;teki \u00f6zel bir ge\u00e7ici klas\u00f6re) kaydeder.\n    <\/li>\n<li>\n        <strong>Y\u00fckleme Ba\u015flatma \u0130ste\u011fi:<\/strong> Kullan\u0131c\u0131, web aray\u00fcz\u00fcnde &#8220;Profilime Kaydet&#8221; d\u00fc\u011fmesine t\u0131klar. \u0130stemci (taray\u0131c\u0131), Node.js sunucusuna bir <code>POST \/upload\/initiate<\/code> iste\u011fi g\u00f6nderir. Bu istekte, kaydedilecek YZ g\u00f6rselinin ad\u0131 (\u00f6rne\u011fin, <code>uzayda-sorf-yapan-kedi.png<\/code>), dosya t\u00fcr\u00fc (<code>image\/png<\/code>) ve beklenen toplam par\u00e7a say\u0131s\u0131 (istemci dosya boyutunu \u00f6nceden tahmin ederek bunu hesaplayabilir) bulunur.\n    <\/li>\n<li>\n        <strong>Node.js Presigned URL&#8217;leri Olu\u015fturur:<\/strong> Node.js sunucusu, <code>initiateMultipartUpload<\/code> fonksiyonunu kullanarak S3&#8217;te yeni bir multipart y\u00fckleme oturumu ba\u015flat\u0131r ve YZ g\u00f6rselinin her bir par\u00e7as\u0131 i\u00e7in ayr\u0131 ayr\u0131 presigned PUT URL&#8217;leri olu\u015fturur. Bu URL&#8217;ler, belirli bir s\u00fcre (\u00f6rne\u011fin 30 dakika) ge\u00e7erli olacak \u015fekilde ayarlan\u0131r. Sunucu, ayr\u0131ca bu y\u00fckleme oturumuna ait <code>uploadId<\/code> ve S3&#8217;teki <code>key<\/code> bilgisini de veritaban\u0131na kaydeder (durum: <code>INITIATED<\/code>).\n    <\/li>\n<li>\n        <strong>\u0130stemci G\u00f6rseli Par\u00e7alara Ay\u0131r\u0131r ve Y\u00fckler:<\/strong> \u0130stemci, Node.js&#8217;ten ald\u0131\u011f\u0131 presigned URL&#8217;leri ve <code>uploadId<\/code> ile <code>key<\/code> bilgilerini kullan\u0131r. YZ g\u00f6rselini (ge\u00e7ici olarak istemciye indirildiyse veya bir ak\u0131\u015f olarak i\u015fleniyorsa) k\u00fc\u00e7\u00fck par\u00e7alara (\u00f6rne\u011fin 8MB&#8217;l\u0131k bloklar) ay\u0131r\u0131r. Her bir par\u00e7ay\u0131, kendisine verilen presigned URL&#8217;ye do\u011frudan S3&#8217;e PUT iste\u011fiyle g\u00f6nderir. Bu i\u015flem s\u0131ras\u0131nda, istemci her ba\u015far\u0131l\u0131 par\u00e7a y\u00fcklemesi i\u00e7in S3&#8217;ten d\u00f6nen <code>ETag<\/code>&#8216;leri toplar. \u0130stemci, kullan\u0131c\u0131n\u0131n g\u00f6rselin y\u00fcklenme ilerlemesini bir ilerleme \u00e7ubu\u011fu ile takip etmesini sa\u011flar.\n    <\/li>\n<li>\n        <strong>Y\u00fckleme \u0130ptali Senaryosu:<\/strong> Kullan\u0131c\u0131, y\u00fckleme %30&#8217;a ula\u015ft\u0131\u011f\u0131nda, &#8220;Vazge\u00e7&#8221; d\u00fc\u011fmesine t\u0131klar. \u0130stemci hemen Node.js sunucusuna bir <code>POST \/upload\/abort<\/code> iste\u011fi g\u00f6nderir. Bu istek, <code>uploadId<\/code> ve <code>key<\/code> bilgilerini i\u00e7erir. Node.js sunucusu, S3&#8217;e <code>AbortMultipartUploadCommand<\/code> g\u00f6ndererek bu multipart y\u00fckleme oturumunu ve ilgili t\u00fcm par\u00e7alar\u0131 S3&#8217;ten siler. Veritaban\u0131ndaki kayd\u0131n durumunu <code>ABORTED<\/code> olarak g\u00fcnceller. Kullan\u0131c\u0131, y\u00fcklemenin iptal edildi\u011fine dair bir bildirim al\u0131r. Bu, gereksiz depolama maliyetlerinin \u00f6n\u00fcne ge\u00e7er ve S3&#8217;te \u00e7\u00f6p veri birikmesini engeller.\n    <\/li>\n<li>\n        <strong>Y\u00fcklemeyi Tamamlama Senaryosu:<\/strong> E\u011fer kullan\u0131c\u0131 y\u00fcklemeyi iptal etmezse ve t\u00fcm par\u00e7alar ba\u015far\u0131yla S3&#8217;e y\u00fcklenirse, istemci toplad\u0131\u011f\u0131 t\u00fcm <code>ETag<\/code>&#8216;leri ve par\u00e7a numaralar\u0131n\u0131 Node.js sunucusuna bir <code>POST \/upload\/complete<\/code> iste\u011fiyle g\u00f6nderir. Node.js sunucusu, bu bilgileri kullanarak S3&#8217;e <code>CompleteMultipartUploadCommand<\/code> g\u00f6nderir. S3, t\u00fcm par\u00e7alar\u0131 birle\u015ftirir ve nihai YZ g\u00f6rselini olu\u015fturur. Sunucu, veritaban\u0131ndaki kayd\u0131n durumunu <code>COMPLETED<\/code> olarak g\u00fcnceller ve g\u00f6rselin kal\u0131c\u0131 S3 URL&#8217;sini istemciye d\u00f6nd\u00fcr\u00fcr. Bu URL, art\u0131k kullan\u0131c\u0131n\u0131n profilinde g\u00f6r\u00fcnt\u00fclenebilir veya indirilebilir.\n    <\/li>\n<\/ol>\n<p>Bu vaka analizi, Node.js tabanl\u0131 presigned multipart y\u00fckleme sisteminin, y\u00fcksek \u00e7\u00f6z\u00fcn\u00fcrl\u00fckl\u00fc YZ g\u00f6rselleri gibi b\u00fcy\u00fck dosyalar\u0131n aktar\u0131m\u0131nda ne kadar etkili oldu\u011funu g\u00f6stermektedir. Sistem, hem sunucu y\u00fck\u00fcn\u00fc minimumda tutar hem de kullan\u0131c\u0131lara kesintisiz, h\u0131zl\u0131 ve kontrol edilebilir bir deneyim sunar. Ayr\u0131ca, iptal mekanizmas\u0131 sayesinde kaynaklar\u0131n verimli kullan\u0131lmas\u0131 sa\u011flan\u0131r. Bu yakla\u015f\u0131m, medya yo\u011fun uygulamalar, oyun platformlar\u0131, CAD\/CAM yaz\u0131l\u0131mlar\u0131 ve di\u011fer b\u00fcy\u00fck veri aktar\u0131m\u0131 gerektiren her t\u00fcrl\u00fc platform i\u00e7in \u00f6l\u00e7eklenebilir ve g\u00fcvenilir bir \u00e7\u00f6z\u00fcm sunar.<\/p>\n<h3>\u0130leri D\u00fczey \u0130pu\u00e7lar\u0131 ve Optimizasyonlar<\/h3>\n<p>Node.js ile presigned par\u00e7alar kullanarak b\u00fcy\u00fck YZ g\u00f6rsellerini aktarmak, zaten verimli bir y\u00f6ntemdir. Ancak, sisteminizi daha da sa\u011flam, h\u0131zl\u0131 ve maliyet etkin hale getirmek i\u00e7in baz\u0131 ileri d\u00fczey ipu\u00e7lar\u0131 ve optimizasyonlar bulunmaktad\u0131r:<\/p>\n<ol>\n<li>\n        <strong>Hata Y\u00f6netimi ve Yeniden Deneme Mekanizmalar\u0131 (Retry Mechanisms):<\/strong><\/p>\n<ul>\n<li>\n                <strong>\u0130stemci Taraf\u0131nda:<\/strong> A\u011f hatalar\u0131 veya S3&#8217;ten gelen ge\u00e7ici hatalar (\u00f6rne\u011fin 5xx durum kodlar\u0131) durumunda, istemcinin ba\u015far\u0131s\u0131z olan par\u00e7alar\u0131 belirli bir gecikmeyle (\u00fcstel geri \u00e7ekilme &#8211; exponential backoff) yeniden denemesi \u00f6nemlidir. Bu, kullan\u0131c\u0131n\u0131n t\u00fcm y\u00fcklemeyi ba\u015ftan ba\u015flatmak zorunda kalmas\u0131n\u0131 engeller. Her par\u00e7a i\u00e7in belirli bir yeniden deneme limiti belirlenmelidir.\n            <\/li>\n<li>\n                <strong>Sunucu Taraf\u0131nda:<\/strong> Node.js sunucusu, S3 ile ileti\u015fim kurarken olu\u015fabilecek hatalar\u0131 (\u00f6rne\u011fin <code>CreateMultipartUploadCommand<\/code> veya <code>CompleteMultipartUploadCommand<\/code> hatalar\u0131) yakalamal\u0131 ve uygun \u015fekilde loglamal\u0131d\u0131r. Gerekirse, bu hatalar\u0131 istemciye anla\u015f\u0131l\u0131r bir formatta d\u00f6nd\u00fcrmelidir.\n            <\/li>\n<\/ul>\n<\/li>\n<li>\n        <strong>G\u00fcvenlik \u0130yile\u015ftirmeleri:<\/strong><\/p>\n<ul>\n<li>\n                <strong>IAM Politikalar\u0131:<\/strong> AWS IAM (Identity and Access Management) politikalar\u0131n\u0131 en az ayr\u0131cal\u0131k (least privilege) prensibine g\u00f6re yap\u0131land\u0131r\u0131n. Node.js sunucunuzun S3&#8217;e sadece belirli eylemleri (<code>s3:CreateMultipartUpload<\/code>, <code>s3:UploadPart<\/code>, <code>s3:CompleteMultipartUpload<\/code>, <code>s3:AbortMultipartUpload<\/code>) ve belirli bir klas\u00f6r veya \u00f6nek alt\u0131ndaki nesneler \u00fczerinde ger\u00e7ekle\u015ftirmesine izin verin.\n            <\/li>\n<li>\n                <strong>Presigned URL S\u00fcresi:<\/strong> Presigned URL&#8217;lerin ge\u00e7erlilik s\u00fcresini m\u00fcmk\u00fcn oldu\u011funca k\u0131sa tutun (\u00f6rne\u011fin 15-30 dakika). Bu, URL&#8217;lerin k\u00f6t\u00fcye kullan\u0131lma riskini azalt\u0131r.\n            <\/li>\n<li>\n                <strong>\u0130stemci Taraf\u0131 Do\u011frulama:<\/strong> Y\u00fcklenen dosyan\u0131n t\u00fcr\u00fc ve boyutu gibi bilgileri istemci taraf\u0131nda da do\u011frulay\u0131n. Bu, gereksiz sunucu isteklerini ve potansiyel g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 \u00f6nler. Ancak, asla sadece istemci taraf\u0131 do\u011frulamaya g\u00fcvenmeyin, sunucu taraf\u0131nda da mutlaka tekrar do\u011frulama yap\u0131n.\n            <\/li>\n<li>\n                <strong>Kullan\u0131c\u0131 Yetkilendirmesi:<\/strong> Her y\u00fckleme iste\u011fi i\u00e7in kullan\u0131c\u0131n\u0131n kimli\u011fini do\u011frulay\u0131n ve yetkili oldu\u011fundan emin olun. <code>UploadId<\/code>&#8216;nin belirli bir kullan\u0131c\u0131ya ait oldu\u011funu kontrol edin.\n            <\/li>\n<\/ul>\n<\/li>\n<li>\n        <strong>Performans Optimizasyonlar\u0131:<\/strong><\/p>\n<ul>\n<li>\n                <strong>Par\u00e7a Boyutu:<\/strong> Par\u00e7a boyutunu dikkatlice se\u00e7in. AWS S3 i\u00e7in genellikle 5MB ile 100MB aras\u0131 \u00f6nerilir. \u00c7ok k\u00fc\u00e7\u00fck par\u00e7alar, \u00e7ok fazla HTTP iste\u011fi ve S3 API \u00e7a\u011fr\u0131s\u0131 anlam\u0131na gelirken, \u00e7ok b\u00fcy\u00fck par\u00e7alar, bir hata durumunda daha fazla verinin yeniden y\u00fcklenmesini gerektirebilir.\n            <\/li>\n<li>\n                <strong>E\u015f Zamanl\u0131 Y\u00fckleme Limiti:<\/strong> \u0130stemci taraf\u0131nda ayn\u0131 anda y\u00fcklenecek par\u00e7a say\u0131s\u0131n\u0131 s\u0131n\u0131rlay\u0131n (\u00f6rne\u011fin 3-5 par\u00e7a). \u00c7ok fazla e\u015f zamanl\u0131 istek, a\u011f t\u0131kan\u0131kl\u0131\u011f\u0131na yol a\u00e7abilir.\n            <\/li>\n<li>\n                <strong>S3 Transfer H\u0131zland\u0131rma:<\/strong> B\u00fcy\u00fck co\u011frafi mesafelerde y\u00fcksek bant geni\u015fli\u011fine sahip y\u00fcklemeler i\u00e7in AWS S3 Transfer Acceleration \u00f6zelli\u011fini kullanmay\u0131 d\u00fc\u015f\u00fcnebilirsiniz. Bu, verileri S3&#8217;e daha h\u0131zl\u0131 aktarmak i\u00e7in CloudFront&#8217;un u\u00e7 konumlar\u0131n\u0131 kullan\u0131r.\n            <\/li>\n<\/ul>\n<\/li>\n<li>\n        <strong>Maliyet Optimizasyonu:<\/strong><\/p>\n<ul>\n<li>\n                <strong>Ya\u015fam D\u00f6ng\u00fcs\u00fc Kurallar\u0131 (Lifecycle Rules):<\/strong> S3 bucket&#8217;lar\u0131n\u0131zda ya\u015fam d\u00f6ng\u00fcs\u00fc kurallar\u0131 tan\u0131mlayarak, belirli bir s\u00fcre i\u00e7inde tamamlanmayan (incomplete) multipart y\u00fcklemelerini otomatik olarak silebilirsiniz. Bu, manuel temizleme ihtiyac\u0131n\u0131 azalt\u0131r ve gereksiz depolama maliyetlerini \u00f6nler.\n            <\/li>\n<li>\n                <strong>Depolama S\u0131n\u0131flar\u0131:<\/strong> YZ g\u00f6rsellerinin kullan\u0131m s\u0131kl\u0131\u011f\u0131na g\u00f6re farkl\u0131 S3 depolama s\u0131n\u0131flar\u0131n\u0131 (Standard, Infrequent Access, Glacier) kullanmay\u0131 d\u00fc\u015f\u00fcn\u00fcn. \u00d6rne\u011fin, s\u0131k eri\u015filmeyen eski g\u00f6rselleri daha uygun maliyetli s\u0131n\u0131flara ta\u015f\u0131yabilirsiniz.\n            <\/li>\n<\/ul>\n<\/li>\n<li>\n        <strong>\u0130lerleme Takibi ve Kullan\u0131c\u0131 Deneyimi:<\/strong><\/p>\n<ul>\n<li>\n                <strong>WebSockets:<\/strong> Y\u00fckleme ilerlemesini ve durum g\u00fcncellemelerini ger\u00e7ek zamanl\u0131 olarak istemciye iletmek i\u00e7in WebSockets kullanabilirsiniz. Bu, daha dinamik ve kullan\u0131c\u0131 dostu bir aray\u00fcz sa\u011flar.\n            <\/li>\n<li>\n                <strong>Duraklatma\/Devam Ettirme (Pause\/Resume):<\/strong> Y\u00fckleme durumunu veritaban\u0131nda detayl\u0131 takip ederek, istemcinin y\u00fcklemeyi duraklat\u0131p daha sonra devam ettirmesine olanak tan\u0131yabilirsiniz. Bu, \u00f6zellikle \u00e7ok b\u00fcy\u00fck dosyalar ve kesintili internet ba\u011flant\u0131lar\u0131 i\u00e7in kullan\u0131c\u0131 deneyimini \u00f6nemli \u00f6l\u00e7\u00fcde iyile\u015ftirir.\n            <\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>Bu ileri d\u00fczey ipu\u00e7lar\u0131 ve optimizasyonlar, Node.js tabanl\u0131 AI g\u00f6rsel aktar\u0131m sisteminizi sadece i\u015flevsel de\u011fil, ayn\u0131 zamanda sa\u011flam, g\u00fcvenli, h\u0131zl\u0131 ve maliyet etkin hale getirecektir. Her projenin kendine \u00f6zg\u00fc ihtiya\u00e7lar\u0131 oldu\u011fundan, bu \u00f6nerileri kendi senaryonuza g\u00f6re uyarlamak \u00f6nemlidir.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Yapay zeka teknolojilerinin h\u0131zla geli\u015fmesiyle birlikte, y\u00fcksek \u00e7\u00f6z\u00fcn\u00fcrl\u00fckl\u00fc g\u00f6rsellerin \u00fcretimi ve transferi, modern web uygulamalar\u0131 i\u00e7in kritik bir zorluk haline gelmi\u015ftir. Geleneksel dosya aktar\u0131m y\u00f6ntemleri, bu b\u00fcy\u00fck dosyalar\u0131n y\u00f6netimi s\u0131ras\u0131nda performans, g\u00fcvenilirlik ve \u00f6l\u00e7eklenebilirlik sorunlar\u0131na yol a\u00e7abilir. Bu makalede ele ald\u0131\u011f\u0131m\u0131z Node.js tabanl\u0131 presigned par\u00e7alar, \u00e7oklu durum takibi ve iptal y\u00f6netimi yakla\u015f\u0131m\u0131, bu zorluklar\u0131n \u00fcstesinden gelmek i\u00e7in g\u00fc\u00e7l\u00fc ve verimli bir \u00e7\u00f6z\u00fcm sunmaktad\u0131r.<\/p>\n<p>Bu y\u00f6ntem sayesinde, Node.js sunucumuz sadece bir koordinat\u00f6r g\u00f6revi \u00fcstlenir, as\u0131l veri aktar\u0131m y\u00fck\u00fcn\u00fc do\u011frudan istemci ile bulut depolama hizmeti (AWS S3 gibi) aras\u0131na devreder. Bu, sunucu kaynaklar\u0131n\u0131n serbest kalmas\u0131n\u0131, maliyetlerin d\u00fc\u015fmesini ve uygulaman\u0131n binlerce e\u015f zamanl\u0131 y\u00fcklemeyi sorunsuz bir \u015fekilde y\u00f6netebilmesini sa\u011flar. Multipart y\u00fcklemeler, dosya transferini daha k\u00fc\u00e7\u00fck, y\u00f6netilebilir par\u00e7alara b\u00f6lerek a\u011f kesintilerine kar\u015f\u0131 daha dayan\u0131kl\u0131 hale getirir ve paralel y\u00fckleme ile toplam s\u00fcreyi k\u0131salt\u0131r. Ayr\u0131ca, sunucu taraf\u0131nda y\u00fckleme durumunun detayl\u0131 takibi, hem hata kurtarma senaryolar\u0131nda hem de iptal i\u015flemlerinde sistemin tutarl\u0131l\u0131\u011f\u0131n\u0131 garanti eder.<\/p>\n<p>\u00d6zellikle AI g\u00f6rsel olu\u015fturma platformlar\u0131 gibi medya yo\u011fun uygulamalar i\u00e7in bu mimari, kullan\u0131c\u0131 deneyimini \u00f6nemli \u00f6l\u00e7\u00fcde iyile\u015ftirir. Kullan\u0131c\u0131lar, b\u00fcy\u00fck dosyalar\u0131 h\u0131zl\u0131 ve g\u00fcvenilir bir \u015fekilde y\u00fckleyebilir, hatta gerekti\u011finde devam eden bir y\u00fcklemeyi iptal edebilirler. Bu kontrol ve \u015feffafl\u0131k, uygulaman\u0131n genel memnuniyetini art\u0131r\u0131r. G\u00fcvenlik, performans ve maliyet optimizasyonlar\u0131na y\u00f6nelik ileri d\u00fczey ipu\u00e7lar\u0131 ise, bu sistemi daha da sa\u011flam ve s\u00fcrd\u00fcr\u00fclebilir k\u0131lmak i\u00e7in yol g\u00f6sterir.<\/p>\n<p>\u00d6zetle, Node.js ve bulut depolama servislerinin entegrasyonuyla geli\u015ftirilen bu yakla\u015f\u0131m, b\u00fcy\u00fck dosyalar\u0131n aktar\u0131m\u0131n\u0131 basitle\u015ftirirken, modern web uygulamalar\u0131n\u0131n \u00f6l\u00e7eklenebilirlik ve g\u00fcvenilirlik ihtiya\u00e7lar\u0131n\u0131 kar\u015f\u0131lamaktad\u0131r. Yapay zeka g\u00f6rsellerinin gelece\u011fi, bu t\u00fcr ak\u0131ll\u0131 ve verimli dosya y\u00f6netimi \u00e7\u00f6z\u00fcmleriyle \u015fekillenecektir.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<ol>\n<li>\n        <strong>Presigned URL&#8217;ler ne kadar g\u00fcvenlidir?<\/strong><\/p>\n<p>Presigned URL&#8217;ler, belirli bir s\u00fcre i\u00e7in ve belirli eylemlerle (\u00f6rne\u011fin sadece y\u00fckleme) s\u0131n\u0131rl\u0131 eri\u015fim sa\u011flad\u0131\u011f\u0131 i\u00e7in olduk\u00e7a g\u00fcvenlidir. Bu URL&#8217;ler, AWS IAM politikalar\u0131 ile daha da k\u0131s\u0131tlanabilir ve belirli bir kullan\u0131c\u0131n\u0131n belirli bir dosyaya eri\u015fimine izin verecek \u015fekilde yap\u0131land\u0131r\u0131labilir. S\u00fcreleri k\u0131sa tutuldu\u011funda, k\u00f6t\u00fcye kullan\u0131lma riski minimize edilir.<\/p>\n<\/li>\n<li>\n        <strong>Multipart y\u00fckleme neden tek par\u00e7a y\u00fcklemeye tercih edilmeli?<\/strong><\/p>\n<p>Multipart y\u00fckleme, \u00f6zellikle b\u00fcy\u00fck dosyalar i\u00e7in tek par\u00e7a y\u00fcklemeye g\u00f6re daha dayan\u0131kl\u0131, daha h\u0131zl\u0131 ve daha esnektir. A\u011f kesintilerinde sadece ba\u015far\u0131s\u0131z olan par\u00e7an\u0131n yeniden y\u00fcklenmesi yeterlidir, t\u00fcm dosyan\u0131n ba\u015ftan y\u00fcklenmesi gerekmez. Ayr\u0131ca, par\u00e7alar\u0131n paralel olarak y\u00fcklenebilmesi sayesinde toplam y\u00fckleme s\u00fcresi k\u0131sal\u0131r ve sunucu y\u00fck\u00fc azal\u0131r. Duraklatma ve devam ettirme gibi \u00f6zellikler de kolayca uygulanabilir.<\/p>\n<\/li>\n<li>\n        <strong>Y\u00fckleme s\u0131ras\u0131nda ba\u011flant\u0131 kesilirse ne olur?<\/strong><\/p>\n<p>Multipart y\u00fcklemede, ba\u011flant\u0131 kesildi\u011finde sadece o anda y\u00fcklenmekte olan par\u00e7a veya hen\u00fcz y\u00fcklenmemi\u015f par\u00e7alar etkilenir. Ba\u015far\u0131yla y\u00fcklenmi\u015f par\u00e7alar S3&#8217;te kal\u0131r. \u0130stemci, ba\u011flant\u0131 geri geldi\u011finde veya yeniden deneme mekanizmas\u0131 devreye girdi\u011finde, sadece ba\u015far\u0131s\u0131z olan par\u00e7alar\u0131 yeniden y\u00fckleyerek s\u00fcreci devam ettirebilir. Bu, kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan b\u00fcy\u00fck bir avantajd\u0131r.<\/p>\n<\/li>\n<li>\n        <strong>Bu yakla\u015f\u0131m hangi t\u00fcr projeler i\u00e7in uygundur?<\/strong><\/p>\n<p>Bu yakla\u015f\u0131m, \u00f6zellikle b\u00fcy\u00fck dosyalar\u0131n (\u00f6rne\u011fin y\u00fcksek \u00e7\u00f6z\u00fcn\u00fcrl\u00fckl\u00fc g\u00f6rseller, videolar, CAD dosyalar\u0131, 3D modeller) s\u0131k\u00e7a y\u00fcklendi\u011fi veya indirildi\u011fi t\u00fcm projeler i\u00e7in uygundur. Yapay zeka g\u00f6rsel olu\u015fturma platformlar\u0131, medya payla\u015f\u0131m siteleri, bulut depolama hizmetleri, oyun geli\u015ftirme platformlar\u0131 ve b\u00fcy\u00fck veri analizi uygulamalar\u0131 gibi senaryolarda yayg\u0131n olarak kullan\u0131l\u0131r.<\/p>\n<\/li>\n<li>\n        <strong>Farkl\u0131 bulut sa\u011flay\u0131c\u0131lar\u0131 i\u00e7in de ge\u00e7erli mi?<\/strong><\/p>\n<p>Evet, bu konsept sadece AWS S3&#8217;e \u00f6zg\u00fc de\u011fildir. Google Cloud Storage ve Azure Blob Storage gibi di\u011fer bulut depolama sa\u011flay\u0131c\u0131lar\u0131 da benzer &#8220;presigned URL&#8221; ve &#8220;multipart upload&#8221; (veya e\u015fde\u011fer) \u00f6zellikler sunar. Uygulama mant\u0131\u011f\u0131 benzer kal\u0131rken, kullan\u0131lan SDK&#8217;lar ve API \u00e7a\u011fr\u0131lar\u0131 ilgili bulut sa\u011flay\u0131c\u0131s\u0131n\u0131nkine g\u00f6re de\u011fi\u015fecektir.<\/p>\n<\/li>\n<\/ol>\n<p>#Teknoloji #WebGeli\u015ftirme #Nodejs #AWS #S3 #YapayZeka #DosyaY\u00fckleme<\/p>\n","protected":false},"excerpt":{"rendered":"G\u00fcn\u00fcm\u00fcz\u00fcn h\u0131zla geli\u015fen yapay zeka (YZ) d\u00fcnyas\u0131nda, \u00fcretilen g\u00f6rsellerin boyutlar\u0131 ve karma\u015f\u0131kl\u0131\u011f\u0131 s\u00fcrekli artmaktad\u0131r.","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-45681","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 ile Yapay Zeka G\u00f6rsel Aktar\u0131m\u0131: Presigned Par\u00e7alar, \u00c7oklu Durum ve \u0130ptal Y\u00f6netimi - 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-ile-yapay-zeka-gorsel-aktarimi-presigned-parcalar-coklu-durum-ve-iptal-yonetimi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Node.js ile Yapay Zeka G\u00f6rsel Aktar\u0131m\u0131: Presigned Par\u00e7alar, \u00c7oklu Durum ve \u0130ptal Y\u00f6netimi\" \/>\n<meta property=\"og:description\" content=\"G\u00fcn\u00fcm\u00fcz\u00fcn h\u0131zla geli\u015fen yapay zeka (YZ) d\u00fcnyas\u0131nda, \u00fcretilen g\u00f6rsellerin boyutlar\u0131 ve karma\u015f\u0131kl\u0131\u011f\u0131 s\u00fcrekli artmaktad\u0131r.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/node-js-ile-yapay-zeka-gorsel-aktarimi-presigned-parcalar-coklu-durum-ve-iptal-yonetimi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-11-14T06:07:14+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=\"24 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-ile-yapay-zeka-gorsel-aktarimi-presigned-parcalar-coklu-durum-ve-iptal-yonetimi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-ile-yapay-zeka-gorsel-aktarimi-presigned-parcalar-coklu-durum-ve-iptal-yonetimi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Node.js ile Yapay Zeka G\u00f6rsel Aktar\u0131m\u0131: Presigned Par\u00e7alar, \u00c7oklu Durum ve \u0130ptal Y\u00f6netimi\",\"datePublished\":\"2026-11-14T06:07:14+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-ile-yapay-zeka-gorsel-aktarimi-presigned-parcalar-coklu-durum-ve-iptal-yonetimi\/\"},\"wordCount\":5844,\"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-ile-yapay-zeka-gorsel-aktarimi-presigned-parcalar-coklu-durum-ve-iptal-yonetimi\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-ile-yapay-zeka-gorsel-aktarimi-presigned-parcalar-coklu-durum-ve-iptal-yonetimi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/node-js-ile-yapay-zeka-gorsel-aktarimi-presigned-parcalar-coklu-durum-ve-iptal-yonetimi\/\",\"name\":\"Node.js ile Yapay Zeka G\u00f6rsel Aktar\u0131m\u0131: Presigned Par\u00e7alar, \u00c7oklu Durum ve \u0130ptal Y\u00f6netimi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-11-14T06:07:14+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-ile-yapay-zeka-gorsel-aktarimi-presigned-parcalar-coklu-durum-ve-iptal-yonetimi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/node-js-ile-yapay-zeka-gorsel-aktarimi-presigned-parcalar-coklu-durum-ve-iptal-yonetimi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-ile-yapay-zeka-gorsel-aktarimi-presigned-parcalar-coklu-durum-ve-iptal-yonetimi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Node.js ile Yapay Zeka G\u00f6rsel Aktar\u0131m\u0131: Presigned Par\u00e7alar, \u00c7oklu Durum ve \u0130ptal Y\u00f6netimi\"}]},{\"@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 ile Yapay Zeka G\u00f6rsel Aktar\u0131m\u0131: Presigned Par\u00e7alar, \u00c7oklu Durum ve \u0130ptal Y\u00f6netimi - 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-ile-yapay-zeka-gorsel-aktarimi-presigned-parcalar-coklu-durum-ve-iptal-yonetimi\/","og_locale":"tr_TR","og_type":"article","og_title":"Node.js ile Yapay Zeka G\u00f6rsel Aktar\u0131m\u0131: Presigned Par\u00e7alar, \u00c7oklu Durum ve \u0130ptal Y\u00f6netimi","og_description":"G\u00fcn\u00fcm\u00fcz\u00fcn h\u0131zla geli\u015fen yapay zeka (YZ) d\u00fcnyas\u0131nda, \u00fcretilen g\u00f6rsellerin boyutlar\u0131 ve karma\u015f\u0131kl\u0131\u011f\u0131 s\u00fcrekli artmaktad\u0131r.","og_url":"https:\/\/fatihsoysal.com\/blog\/node-js-ile-yapay-zeka-gorsel-aktarimi-presigned-parcalar-coklu-durum-ve-iptal-yonetimi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-11-14T06:07:14+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"24 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/node-js-ile-yapay-zeka-gorsel-aktarimi-presigned-parcalar-coklu-durum-ve-iptal-yonetimi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/node-js-ile-yapay-zeka-gorsel-aktarimi-presigned-parcalar-coklu-durum-ve-iptal-yonetimi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Node.js ile Yapay Zeka G\u00f6rsel Aktar\u0131m\u0131: Presigned Par\u00e7alar, \u00c7oklu Durum ve \u0130ptal Y\u00f6netimi","datePublished":"2026-11-14T06:07:14+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/node-js-ile-yapay-zeka-gorsel-aktarimi-presigned-parcalar-coklu-durum-ve-iptal-yonetimi\/"},"wordCount":5844,"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-ile-yapay-zeka-gorsel-aktarimi-presigned-parcalar-coklu-durum-ve-iptal-yonetimi\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/node-js-ile-yapay-zeka-gorsel-aktarimi-presigned-parcalar-coklu-durum-ve-iptal-yonetimi\/","url":"https:\/\/fatihsoysal.com\/blog\/node-js-ile-yapay-zeka-gorsel-aktarimi-presigned-parcalar-coklu-durum-ve-iptal-yonetimi\/","name":"Node.js ile Yapay Zeka G\u00f6rsel Aktar\u0131m\u0131: Presigned Par\u00e7alar, \u00c7oklu Durum ve \u0130ptal Y\u00f6netimi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-11-14T06:07:14+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/node-js-ile-yapay-zeka-gorsel-aktarimi-presigned-parcalar-coklu-durum-ve-iptal-yonetimi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/node-js-ile-yapay-zeka-gorsel-aktarimi-presigned-parcalar-coklu-durum-ve-iptal-yonetimi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/node-js-ile-yapay-zeka-gorsel-aktarimi-presigned-parcalar-coklu-durum-ve-iptal-yonetimi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Node.js ile Yapay Zeka G\u00f6rsel Aktar\u0131m\u0131: Presigned Par\u00e7alar, \u00c7oklu Durum ve \u0130ptal Y\u00f6netimi"}]},{"@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\/45681","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=45681"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/45681\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=45681"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=45681"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=45681"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}