{"id":34234,"date":"2025-11-13T09:31:27","date_gmt":"2025-11-13T06:31:27","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/nestjs-ile-verimli-s3-dosya-yuklemeleri-hiz-ve-buyuk-dosya-yonetimi\/"},"modified":"2025-11-13T09:31:27","modified_gmt":"2025-11-13T06:31:27","slug":"nestjs-ile-verimli-s3-dosya-yuklemeleri-hiz-ve-buyuk-dosya-yonetimi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/nestjs-ile-verimli-s3-dosya-yuklemeleri-hiz-ve-buyuk-dosya-yonetimi\/","title":{"rendered":"NestJS ile Verimli S3 Dosya Y\u00fcklemeleri: H\u0131z ve B\u00fcy\u00fck Dosya Y\u00f6netimi"},"content":{"rendered":"<p>Modern web uygulamalar\u0131nda dosya y\u00fckleme, \u00f6zellikle b\u00fcy\u00fck boyutlu dosyalar\u0131n y\u00f6netimi ve kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan kritik bir \u00f6neme sahiptir. NestJS tabanl\u0131 bir projede AWS S3 kullanarak bu s\u00fcreci nas\u0131l h\u0131zland\u0131rabilece\u011finizi ve \u00f6l\u00e7eklenebilir hale getirebilece\u011finizi merak ediyorsan\u0131z, do\u011fru yerdesiniz. Bu makale, NestJS ile S3 entegrasyonunu en verimli \u015fekilde sa\u011flaman\u0131n yollar\u0131n\u0131 ad\u0131m ad\u0131m a\u00e7\u0131kl\u0131yor.<\/p>\n<p>G\u00fcn\u00fcm\u00fcz\u00fcn dijital d\u00fcnyas\u0131nda, kullan\u0131c\u0131lar\u0131n beklentileri her ge\u00e7en g\u00fcn art\u0131yor. Bir foto\u011fraf y\u00fckleme, bir belge payla\u015fma veya bir video kayd\u0131 ekleme gibi i\u015flemlerin sorunsuz, h\u0131zl\u0131 ve g\u00fcvenilir bir \u015fekilde ger\u00e7ekle\u015fmesi, uygulaman\u0131z\u0131n ba\u015far\u0131s\u0131 i\u00e7in hayati \u00f6nem ta\u015f\u0131yor. \u00d6zellikle b\u00fcy\u00fck boyutlu dosyalar s\u00f6z konusu oldu\u011funda, standart dosya y\u00fckleme y\u00f6ntemleri h\u0131zla darbo\u011faz haline gelebilir, sunucu kaynaklar\u0131n\u0131 t\u00fcketebilir ve kullan\u0131c\u0131 deneyimini olumsuz etkileyebilir. Bu noktada, AWS Simple Storage Service (S3) gibi bulut tabanl\u0131 depolama \u00e7\u00f6z\u00fcmleri devreye girer. S3, y\u00fcksek \u00f6l\u00e7eklenebilirlik, dayan\u0131kl\u0131l\u0131k ve eri\u015filebilirlik sunarak dosya depolama ve da\u011f\u0131t\u0131m ihtiya\u00e7lar\u0131n\u0131za g\u00fc\u00e7l\u00fc bir \u00e7\u00f6z\u00fcm sunar. Ancak, S3&#8217;\u00fcn potansiyelini tam olarak kullanabilmek i\u00e7in, NestJS gibi modern bir backend framework&#8217;\u00fc ile do\u011fru ve verimli bir entegrasyon \u015fartt\u0131r. Yanl\u0131\u015f yap\u0131land\u0131r\u0131lm\u0131\u015f veya optimize edilmemi\u015f bir y\u00fckleme mekanizmas\u0131, hem altyap\u0131 maliyetlerinizi art\u0131rabilir hem de kullan\u0131c\u0131lar\u0131n\u0131z\u0131n uygulaman\u0131zdan uzakla\u015fmas\u0131na neden olabilir. Dolay\u0131s\u0131yla, verimli S3 dosya y\u00fcklemeleri sadece bir performans iyile\u015ftirmesi de\u011fil, ayn\u0131 zamanda i\u015fletme s\u00fcreklili\u011fi ve kullan\u0131c\u0131 memnuniyeti i\u00e7in stratejik bir gerekliliktir.<\/p>\n<p>Verimlilik, bu ba\u011flamda bir\u00e7ok farkl\u0131 boyutu kapsar. \u00d6rne\u011fin, k\u00fc\u00e7\u00fck dosyalar\u0131n an\u0131nda y\u00fcklenip eri\u015filebilir olmas\u0131, kullan\u0131c\u0131lar\u0131n h\u0131zl\u0131 geri bildirim almas\u0131n\u0131 sa\u011flar. B\u00fcy\u00fck dosyalar\u0131n ise par\u00e7alara ayr\u0131larak paralel bir \u015fekilde y\u00fcklenmesi veya do\u011frudan istemciden S3&#8217;e g\u00f6nderilmesi, sunucu \u00fczerindeki y\u00fck\u00fc hafifletirken genel y\u00fckleme s\u00fcresini dramatik bir \u015fekilde k\u0131saltabilir. Ayr\u0131ca, hata tolerans\u0131 ve kesinti durumlar\u0131nda y\u00fcklemeye devam edebilme yetene\u011fi de, \u00f6zellikle zay\u0131f internet ba\u011flant\u0131lar\u0131na sahip kullan\u0131c\u0131lar i\u00e7in vazge\u00e7ilmezdir. Bu optimizasyonlar sadece son kullan\u0131c\u0131 deneyimini iyile\u015ftirmekle kalmaz, ayn\u0131 zamanda backend sunucular\u0131n\u0131z\u0131n daha az CPU ve bellek kullanmas\u0131n\u0131 sa\u011flayarak operasyonel maliyetlerinizi d\u00fc\u015f\u00fcr\u00fcr. S\u00fcrekli artan veri hacimleri ve kullan\u0131c\u0131 say\u0131lar\u0131yla birlikte, NestJS uygulamalar\u0131n\u0131zda S3 dosya y\u00fcklemelerinin do\u011fru bir \u015fekilde ele al\u0131nmas\u0131, uygulaman\u0131z\u0131n gelecekteki b\u00fcy\u00fcmesini ve \u00f6l\u00e7eklenebilirli\u011fini do\u011frudan etkileyecektir. Bu makalenin ilerleyen b\u00f6l\u00fcmlerinde, bu verimlilik hedeflerine ula\u015fmak i\u00e7in kullanabilece\u011finiz farkl\u0131 stratejileri ve pratik uygulama y\u00f6ntemlerini detayl\u0131ca inceleyece\u011fiz.<\/p>\n<h2>S3 ve NestJS Entegrasyonunun Temelleri: H\u0131zl\u0131 Bir Ba\u015flang\u0131\u00e7 K\u0131lavuzu<\/h2>\n<p>NestJS ile AWS S3 entegrasyonuna ba\u015flamak, modern uygulamalar\u0131n\u0131z\u0131n dosya depolama ihtiya\u00e7lar\u0131n\u0131 kar\u015f\u0131lamak i\u00e7in ataca\u011f\u0131n\u0131z ilk ve en \u00f6nemli ad\u0131md\u0131r. \u00d6ncelikle, AWS S3&#8217;\u00fcn ne oldu\u011funu ve neden bu kadar pop\u00fcler oldu\u011funu anlamakla ba\u015flayal\u0131m. AWS S3 (Simple Storage Service), Amazon Web Services taraf\u0131ndan sunulan nesne depolama hizmetidir. S\u0131n\u0131rs\u0131z \u00f6l\u00e7eklenebilirlik, %99.999999999 (on bir dokuz) dayan\u0131kl\u0131l\u0131k ve y\u00fcksek eri\u015filebilirlik gibi \u00f6zellikleriyle bilinir. S3, web siteleri, mobil uygulamalar, yedekleme ve ar\u015fivleme gibi bir\u00e7ok farkl\u0131 senaryoda kullan\u0131l\u0131r. NestJS ise, Node.js tabanl\u0131, TypeScript ile geli\u015ftirilmi\u015f, olduk\u00e7a mod\u00fcler ve \u00f6l\u00e7eklenebilir bir backend framework&#8217;\u00fcd\u00fcr. Geleneksel olarak Express.js \u00fczerinde \u00e7al\u0131\u015f\u0131r, ancak kendine \u00f6zg\u00fc bir mimari ve g\u00fc\u00e7l\u00fc bir ba\u011f\u0131ml\u0131l\u0131k enjeksiyon sistemi sunar. Bu iki teknolojiyi bir araya getirmek, g\u00fc\u00e7l\u00fc ve esnek bir dosya y\u00fckleme altyap\u0131s\u0131 kurman\u0131z\u0131 sa\u011flar.<\/p>\n<p>Entegrasyonun temel ad\u0131mlar\u0131 genellikle AWS SDK&#8217;n\u0131n kurulmas\u0131 ve yap\u0131land\u0131r\u0131lmas\u0131yla ba\u015flar. \u0130lk olarak, NestJS projenize AWS SDK&#8217;y\u0131 eklemelisiniz. Bunun i\u00e7in terminalinizde a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code>\n  npm install @aws-sdk\/client-s3 @aws-sdk\/lib-storage\n  # veya yarn add @aws-sdk\/client-s3 @aws-sdk\/lib-storage\n<\/pre>\n<p><\/code><\/p>\n<p>Bu paketler, S3 ile etkile\u015fim kurmak i\u00e7in gerekli s\u0131n\u0131flar\u0131 ve i\u015flevleri i\u00e7erir. Ard\u0131ndan, NestJS uygulaman\u0131zda S3 istemcisini yap\u0131land\u0131rman\u0131z gerekir. Bu genellikle bir mod\u00fcl (\u00f6rne\u011fin, <code>S3Module<\/code>) veya bir servis (\u00f6rne\u011fin, <code>S3Service<\/code>) arac\u0131l\u0131\u011f\u0131yla yap\u0131l\u0131r. Ortam de\u011fi\u015fkenlerini kullanarak AWS kimlik bilgilerini (access key ID ve secret access key), b\u00f6lgeyi (region) ve varsay\u0131lan S3 bucket ad\u0131n\u0131 g\u00fcvenli bir \u015fekilde saklamak en iyi uygulamad\u0131r. \u00d6rne\u011fin, bir <code>S3Service<\/code> i\u00e7inde S3 istemcisini \u015fu \u015fekilde ba\u015flatabilirsiniz:<\/p>\n<pre><code>\n  \/\/ s3.service.ts\n  import { Injectable } from '@nestjs\/common';\n  import { S3Client, PutObjectCommand } from '@aws-sdk\/client-s3';\n  import { Upload } from '@aws-sdk\/lib-storage';\n  import { ConfigService } from '@nestjs\/config'; \/\/ Ortam de\u011fi\u015fkenleri i\u00e7in\n\n  @Injectable()\n  export class S3Service {\n    private s3Client: S3Client;\n    private readonly bucketName: string;\n\n    constructor(private configService: ConfigService) {\n      this.bucketName = this.configService.get('AWS_S3_BUCKET_NAME');\n      this.s3Client = new S3Client({\n        region: this.configService.get('AWS_S3_REGION'),\n        credentials: {\n          accessKeyId: this.configService.get('AWS_ACCESS_KEY_ID'),\n          secretAccessKey: this.configService.get('AWS_SECRET_ACCESS_KEY'),\n        },\n      });\n    }\n\n    async uploadFile(file: Express.Multer.File): Promise<string> {\n      const uniqueFileName = <code>${Date.now()}-${file.originalname}<\/code>;\n      const params = {\n        Bucket: this.bucketName,\n        Key: uniqueFileName,\n        Body: file.buffer,\n        ContentType: file.mimetype,\n        ACL: 'public-read', \/\/ \u0130ste\u011fe ba\u011fl\u0131, dosyan\u0131n herkese a\u00e7\u0131k olmas\u0131n\u0131 sa\u011flar\n      };\n\n      try {\n        await this.s3Client.send(new PutObjectCommand(params));\n        const fileUrl = <code>https:\/\/${this.bucketName}.s3.${this.configService.get(&#039;AWS_S3_REGION&#039;)}.amazonaws.com\/${uniqueFileName}<\/code>;\n        return fileUrl;\n      } catch (error) {\n        console.error('S3 Y\u00fckleme Hatas\u0131:', error);\n        throw new Error('Dosya y\u00fcklenirken bir hata olu\u015ftu.');\n      }\n    }\n  }\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code>S3Service<\/code> S3 istemcisini ba\u015flat\u0131r ve basit bir <code>uploadFile<\/code> metodu sunar. Bu metod, bir <code>Express.Multer.File<\/code> objesini al\u0131r (NestJS'te dosya y\u00fcklemek i\u00e7in genellikle <code>multer<\/code> kullan\u0131l\u0131r), dosyaya benzersiz bir ad verir ve S3'e y\u00fckler. <code>ACL: &#039;public-read&#039;<\/code> dikkat \u00e7ekicidir; bu, y\u00fcklenen dosyan\u0131n herkese a\u00e7\u0131k olmas\u0131n\u0131 sa\u011flar. G\u00fcvenlik gereksinimlerinize g\u00f6re bu ayar\u0131 de\u011fi\u015ftirebilirsiniz. <code>ConfigService<\/code> kullan\u0131m\u0131, hassas bilgilerin do\u011frudan koda yaz\u0131lmas\u0131n\u0131 \u00f6nler ve uygulaman\u0131z\u0131 daha g\u00fcvenli hale getirir. Son olarak, bu servisi bir controller i\u00e7inde kullanarak bir HTTP endpoint'i arac\u0131l\u0131\u011f\u0131yla dosya y\u00fcklemeyi tetikleyebilirsiniz:<\/p>\n<pre><code>\n  \/\/ app.controller.ts\n  import { Controller, Post, UseInterceptors, UploadedFile } from '@nestjs\/common';\n  import { FileInterceptor } from '@nestjs\/platform-express';\n  import { S3Service } from '.\/s3.service';\n\n  @Controller('files')\n  export class AppController {\n    constructor(private readonly s3Service: S3Service) {}\n\n    @Post('upload')\n    @UseInterceptors(FileInterceptor('file')) \/\/ 'file' form alan\u0131n\u0131n ad\u0131d\u0131r\n    async uploadFile(@UploadedFile() file: Express.Multer.File) {\n      if (!file) {\n        throw new Error('Y\u00fcklenecek dosya bulunamad\u0131.');\n      }\n      const fileUrl = await this.s3Service.uploadFile(file);\n      return { message: 'Dosya ba\u015far\u0131yla y\u00fcklendi!', url: fileUrl };\n    }\n  }\n<\/pre>\n<p><\/code><\/p>\n<p>Bu temel yap\u0131land\u0131rma ile k\u00fc\u00e7\u00fck ve orta boyutlu dosyalar\u0131 NestJS uygulaman\u0131z \u00fczerinden g\u00fcvenli bir \u015fekilde S3'e y\u00fckleyebilirsiniz. Ancak, b\u00fcy\u00fck dosyalar veya y\u00fcksek y\u00fckleme trafi\u011fi durumunda daha geli\u015fmi\u015f tekniklere ihtiyac\u0131n\u0131z olacakt\u0131r. Bu konular\u0131 makalenin ilerleyen b\u00f6l\u00fcmlerinde detayland\u0131raca\u011f\u0131z.<\/p>\n<h3>K\u00fc\u00e7\u00fck ve Orta Boyutlu Dosyalar \u0130\u00e7in NestJS S3 Y\u00fckleme Optimizasyonu Nas\u0131l Yap\u0131l\u0131r?<\/h3>\n<p>K\u00fc\u00e7\u00fck ve orta boyutlu dosyalar\u0131n (genellikle birka\u00e7 megabayta kadar olan g\u00f6rseller, belgeler vb.) y\u00fcklenmesi, \u00e7o\u011fu zaman yukar\u0131da bahsetti\u011fimiz temel y\u00f6ntemle yeterince h\u0131zl\u0131 ve verimli olabilir. Ancak bu senaryolarda bile performans\u0131 daha da art\u0131rmak ve kullan\u0131c\u0131 deneyimini iyile\u015ftirmek i\u00e7in baz\u0131 optimizasyonlar yap\u0131labilir. \u00d6zellikle \u00e7ok say\u0131da k\u00fc\u00e7\u00fck dosyan\u0131n ayn\u0131 anda y\u00fcklendi\u011fi durumlar veya d\u00fc\u015f\u00fck bant geni\u015fli\u011fine sahip kullan\u0131c\u0131lar i\u00e7in bu optimizasyonlar kritik hale gelebilir.<\/p>\n<p>\u0130lk olarak, dosyan\u0131n sunucu belle\u011finde ge\u00e7ici olarak tutuldu\u011fu \"buffer tabanl\u0131 y\u00fcklemeler\" bu boyutlardaki dosyalar i\u00e7in olduk\u00e7a yayg\u0131nd\u0131r. <code>multer<\/code> k\u00fct\u00fcphanesi bu yakla\u015f\u0131m\u0131 kolayla\u015ft\u0131r\u0131r. <code>multer<\/code>'\u0131 yap\u0131land\u0131r\u0131rken, dosyalar\u0131n diske yaz\u0131lmadan do\u011frudan bellekte tutulmas\u0131n\u0131 sa\u011flamak i\u00e7in <code>memoryStorage<\/code>'\u0131 kullanabiliriz. Bu, disk I\/O'dan kaynaklanan gecikmeleri ortadan kald\u0131rarak y\u00fckleme s\u00fcresini bir miktar k\u0131saltabilir. Ancak, dikkatli olunmal\u0131d\u0131r; \u00e7ok fazla dosya veya \u00e7ok b\u00fcy\u00fck dosyalar ayn\u0131 anda belle\u011fe al\u0131nd\u0131\u011f\u0131nda sunucu belle\u011fi h\u0131zla t\u00fckenebilir ve uygulama \u00e7\u00f6kebilir. Bu nedenle, <code>multer<\/code> i\u00e7inde dosya boyutu limitleri belirlemek \u00f6nemlidir.<\/p>\n<pre><code>\n  \/\/ src\/config\/multer.config.ts\n  import { MulterOptions } from '@nestjs\/platform-express\/multer\/interfaces\/multer-options.interface';\n  import { memoryStorage } from 'multer';\n\n  export const multerOptions: MulterOptions = {\n    storage: memoryStorage(), \/\/ Dosyay\u0131 bellekte tutar\n    limits: {\n      fileSize: 5 * 1024 * 1024, \/\/ 5 MB dosya boyutu limiti\n    },\n    fileFilter: (req, file, cb) => {\n      if (!file.mimetype.match(\/\\\/(jpg|jpeg|png|gif|pdf)$\/)) { \/\/ Sadece belirli t\u00fcrlere izin ver\n        cb(new Error('Desteklenmeyen dosya t\u00fcr\u00fc'), false);\n      } else {\n        cb(null, true);\n      }\n    },\n  };\n<\/pre>\n<p><\/code><\/p>\n<pre><code>\n  \/\/ app.controller.ts (\u00f6rnek kullan\u0131m)\n  import { Controller, Post, UseInterceptors, UploadedFile } from '@nestjs\/common';\n  import { FileInterceptor } from '@nestjs\/platform-express';\n  import { S3Service } from '.\/s3.service';\n  import { multerOptions } from '.\/config\/multer.config'; \/\/ Multer konfig\u00fcrasyonunu import edin\n\n  @Controller('files')\n  export class AppController {\n    constructor(private readonly s3Service: S3Service) {}\n\n    @Post('upload-small')\n    @UseInterceptors(FileInterceptor('file', multerOptions))\n    async uploadSmallFile(@UploadedFile() file: Express.Multer.File) {\n      if (!file) {\n        throw new Error('Y\u00fcklenecek dosya bulunamad\u0131.');\n      }\n      const fileUrl = await this.s3Service.uploadFile(file); \/\/ S3Service'iniz hala ayn\u0131 kalabilir\n      return { message: 'K\u00fc\u00e7\u00fck dosya ba\u015far\u0131yla y\u00fcklendi!', url: fileUrl };\n    }\n  }\n<\/pre>\n<p><\/code><\/p>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: Multer'\u0131n <code>memoryStorage<\/code> kullan\u0131rken, sunucunuzun belle\u011fini t\u00fcketmemek i\u00e7in <code>limits.fileSize<\/code> \u00f6zelli\u011fini mutlaka belirleyin. Aksi takdirde, k\u00f6t\u00fc niyetli y\u00fcklemeler veya beklenenden b\u00fcy\u00fck dosyalar sunucunuzu \u00e7\u00f6kertme riski ta\u015f\u0131r.\n<\/div>\n<p>Bunun yan\u0131 s\u0131ra, y\u00fckleme i\u015fleminin g\u00fcvenilirli\u011fini art\u0131rmak i\u00e7in hata y\u00f6netimi ve tekrar deneme (retry) mekanizmalar\u0131 geli\u015ftirmek faydal\u0131d\u0131r. A\u011f kesintileri veya S3 taraf\u0131ndaki ge\u00e7ici sorunlar nedeniyle y\u00fcklemeler ba\u015far\u0131s\u0131z olabilir. AWS SDK genellikle dahili retry mekanizmalar\u0131na sahip olsa da, uygulaman\u0131z seviyesinde daha ak\u0131ll\u0131 retry stratejileri (\u00f6rne\u011fin, exponential backoff ile) uygulayarak dayan\u0131kl\u0131l\u0131\u011f\u0131 art\u0131rabilirsiniz. Bu, \u00f6zellikle gecikmeli veya de\u011fi\u015fken a\u011f ko\u015fullar\u0131nda y\u00fckleme ba\u015far\u0131s\u0131zl\u0131klar\u0131n\u0131n \u00f6n\u00fcne ge\u00e7meye yard\u0131mc\u0131 olur. \u00d6rne\u011fin, S3'e y\u00fckleme yapan fonksiyonunuzu bir <code>try-catch<\/code> blo\u011fu i\u00e7ine alarak, belirli hata kodlar\u0131nda y\u00fcklemeyi birka\u00e7 kez tekrar deneyebilirsiniz.<\/p>\n<p>Son olarak, y\u00fcklenen dosyalar\u0131n kullan\u0131c\u0131lara daha h\u0131zl\u0131 ula\u015fmas\u0131n\u0131 sa\u011flamak i\u00e7in bir \u0130\u00e7erik Da\u011f\u0131t\u0131m A\u011f\u0131 (CDN) entegrasyonu d\u00fc\u015f\u00fcn\u00fclebilir. AWS CloudFront, S3 ile sorunsuz bir \u015fekilde entegre olur. Dosyalar\u0131n\u0131z\u0131 S3'e y\u00fckledikten sonra, CloudFront da\u011f\u0131t\u0131m\u0131n\u0131z\u0131n \u00f6nbellekleme yetenekleri sayesinde, kullan\u0131c\u0131lar co\u011frafi olarak kendilerine en yak\u0131n u\u00e7 noktadan (edge location) dosyalar\u0131 al\u0131rlar. Bu, \u00f6zellikle global bir kullan\u0131c\u0131 kitleniz varsa, y\u00fcklenen i\u00e7eri\u011fin indirme h\u0131z\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r. CloudFront, S3'teki nesneleri ilk istekle \u00f6nbelle\u011fine al\u0131r ve sonraki istekleri do\u011frudan kendi \u00f6nbelle\u011finden sunar, bu da S3 istek maliyetlerinizi de d\u00fc\u015f\u00fcrebilir. K\u00fc\u00e7\u00fck resimler, ikonlar, CSS ve JavaScript dosyalar\u0131 gibi s\u0131k eri\u015filen statik i\u00e7erikler i\u00e7in CDN kullan\u0131m\u0131 vazge\u00e7ilmezdir. NestJS taraf\u0131nda CDN'ye \u00f6zel bir kod yazman\u0131za gerek yoktur, sadece S3'e y\u00fckledikten sonra olu\u015fan URL'yi CloudFront da\u011f\u0131t\u0131m\u0131n\u0131z\u0131n domain'i ile de\u011fi\u015ftirmeniz yeterli olacakt\u0131r.<\/p>\n<h3>B\u00fcy\u00fck Dosyalar\u0131 NestJS ile S3'e Verimli Bir \u015eekilde Nas\u0131l Y\u00fckleyebiliriz?<\/h3>\n<p>B\u00fcy\u00fck boyutlu dosyalar (\u00f6rne\u011fin, video, y\u00fcksek \u00e7\u00f6z\u00fcn\u00fcrl\u00fckl\u00fc g\u00f6rseller, yedekleme dosyalar\u0131) s\u00f6z konusu oldu\u011funda, buffer tabanl\u0131 yakla\u015f\u0131mlar yetersiz kal\u0131r ve sunucu kaynaklar\u0131n\u0131 h\u0131zla t\u00fcketir. Bu t\u00fcr senaryolarda \"stream tabanl\u0131 y\u00fcklemeler\" ve \"multipart upload\" teknikleri devreye girer. Bu y\u00f6ntemler, dosyay\u0131 k\u00fc\u00e7\u00fck par\u00e7alara b\u00f6lerek veya do\u011frudan ak\u0131\u015f halinde S3'e ileterek hem bellek kullan\u0131m\u0131n\u0131 optimize eder hem de y\u00fckleme s\u00fcresini k\u0131salt\u0131r.<\/p>\n<p>Stream tabanl\u0131 y\u00fcklemeler, dosyan\u0131n tamam\u0131n\u0131 belle\u011fe almak yerine, gelen veriyi do\u011frudan okuyup S3'e iletmeyi i\u00e7erir. Bu, sunucunun dosyan\u0131n tamam\u0131n\u0131 ge\u00e7ici olarak depolamas\u0131na gerek kalmad\u0131\u011f\u0131 i\u00e7in \u00f6zellikle bellek a\u00e7\u0131s\u0131ndan olduk\u00e7a verimlidir. NestJS'te <code>multer<\/code> ile dosya y\u00fcklerken, <code>memoryStorage<\/code> yerine <code>diskStorage<\/code> kullanarak veya hi\u00e7 storage belirtmeden, dosyan\u0131n bir stream olarak elde edilmesini sa\u011flayabiliriz. Ancak, S3'e stream halinde y\u00fcklemek i\u00e7in AWS SDK'n\u0131n <code>Upload<\/code> s\u0131n\u0131f\u0131n\u0131 kullanmak en uygun y\u00f6ntemlerden biridir. Bu s\u0131n\u0131f, dosyan\u0131n boyutuna g\u00f6re otomatik olarak \"multipart upload\" i\u015flemini y\u00f6netir.<\/p>\n<pre><code>\n  \/\/ s3.service.ts - B\u00fcy\u00fck dosya y\u00fckleme i\u00e7in metod\n  import { Injectable } from '@nestjs\/common';\n  import { S3Client } from '@aws-sdk\/client-s3';\n  import { Upload } from '@aws-sdk\/lib-storage';\n  import { ConfigService } from '@nestjs\/config';\n  import * as crypto from 'crypto'; \/\/ Benzersiz isimler i\u00e7in\n\n  @Injectable()\n  export class S3Service {\n    private s3Client: S3Client;\n    private readonly bucketName: string;\n    private readonly region: string;\n\n    constructor(private configService: ConfigService) {\n      this.bucketName = this.configService.get('AWS_S3_BUCKET_NAME');\n      this.region = this.configService.get('AWS_S3_REGION');\n      this.s3Client = new S3Client({\n        region: this.region,\n        credentials: {\n          accessKeyId: this.configService.get('AWS_ACCESS_KEY_ID'),\n          secretAccessKey: this.configService.get('AWS_SECRET_ACCESS_KEY'),\n        },\n      });\n    }\n\n    async uploadLargeFile(file: Express.Multer.File): Promise<string> {\n      const fileName = <code>${crypto.randomBytes(16).toString(&#039;hex&#039;)}-${file.originalname}<\/code>;\n      const parallelUploads = new Upload({\n        client: this.s3Client,\n        params: {\n          Bucket: this.bucketName,\n          Key: fileName,\n          Body: file.stream, \/\/ Dosya ak\u0131\u015f\u0131n\u0131 do\u011frudan kullan\u0131yoruz\n          ContentType: file.mimetype,\n          ACL: 'public-read',\n        },\n        queueSize: 4, \/\/ Ka\u00e7 par\u00e7an\u0131n paralel y\u00fcklenece\u011fini belirler\n        partSize: 1024 * 1024 * 5, \/\/ Her bir par\u00e7an\u0131n boyutu (5 MB)\n        leavePartsOnError: false, \/\/ Hata durumunda tamamlanmam\u0131\u015f par\u00e7alar\u0131 sil\n      });\n\n      parallelUploads.on('httpUploadProgress', (progress) => {\n        console.log(<code>Y\u00fckleme ilerlemesi: %${Math.round((progress.loaded \/ progress.total) * 100)}<\/code>);\n        \/\/ \u0130stemciye WebSocket veya SSE ile ilerleme bilgisini g\u00f6nderebilirsiniz\n      });\n\n      try {\n        const result = await parallelUploads.done();\n        const fileUrl = <code>https:\/\/${this.bucketName}.s3.${this.region}.amazonaws.com\/${fileName}<\/code>;\n        return fileUrl;\n      } catch (error) {\n        console.error('B\u00fcy\u00fck dosya S3 y\u00fckleme hatas\u0131:', error);\n        throw new Error('B\u00fcy\u00fck dosya y\u00fcklenirken bir hata olu\u015ftu.');\n      }\n    }\n  }\n<\/pre>\n<p><\/code><\/p>\n<pre><code>\n  \/\/ app.controller.ts - B\u00fcy\u00fck dosya y\u00fckleme endpoint'i\n  import { Controller, Post, UseInterceptors, UploadedFile } from '@nestjs\/common';\n  import { FileInterceptor } from '@nestjs\/platform-express';\n  import { S3Service } from '.\/s3.service';\n\n  @Controller('files')\n  export class AppController {\n    constructor(private readonly s3Service: S3Service) {}\n\n    @Post('upload-large')\n    @UseInterceptors(FileInterceptor('file')) \/\/ Multer varsay\u0131lan olarak stream olarak iletir e\u011fer storage belirtilmezse\n    async uploadLargeFile(@UploadedFile() file: Express.Multer.File) {\n      if (!file) {\n        throw new Error('Y\u00fcklenecek dosya bulunamad\u0131.');\n      }\n      const fileUrl = await this.s3Service.uploadLargeFile(file);\n      return { message: 'B\u00fcy\u00fck dosya ba\u015far\u0131yla y\u00fcklendi!', url: fileUrl };\n    }\n  }\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte <code>Upload<\/code> s\u0131n\u0131f\u0131, dosyay\u0131 otomatik olarak par\u00e7alara b\u00f6lerek paralel bir \u015fekilde y\u00fckler. <code>queueSize<\/code> parametresi ayn\u0131 anda ka\u00e7 par\u00e7an\u0131n y\u00fcklenece\u011fini, <code>partSize<\/code> ise her bir par\u00e7an\u0131n boyutunu belirler. Bu, \u00f6zellikle y\u00fcksek bant geni\u015fli\u011fine sahip sunucular i\u00e7in y\u00fckleme h\u0131z\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131rabilir. <code>on(&#039;httpUploadProgress&#039;)<\/code> olay\u0131 sayesinde, y\u00fckleme ilerlemesini izleyebilir ve bu bilgiyi istemcilere geri bildirim olarak sunabilirsiniz, bu da kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan \u00e7ok de\u011ferlidir.<\/p>\n<p>Multipart Upload, 5 MB'tan b\u00fcy\u00fck dosyalar i\u00e7in S3 taraf\u0131ndan \u00f6nerilen bir y\u00f6ntemdir. Dosya, birden fazla k\u00fc\u00e7\u00fck par\u00e7aya b\u00f6l\u00fcn\u00fcr. Bu par\u00e7alar ayr\u0131 ayr\u0131 S3'e y\u00fcklenir ve ard\u0131ndan S3 bu par\u00e7alar\u0131 tek bir dosya halinde birle\u015ftirir. Bu yakla\u015f\u0131m\u0131n temel faydalar\u0131 \u015funlard\u0131r:<\/p>\n<ol>\n<li><strong>Kesintiden Devam Edebilme:<\/strong> Bir par\u00e7a y\u00fcklemesi ba\u015far\u0131s\u0131z olursa, sadece o par\u00e7ay\u0131 tekrar y\u00fcklemek yeterlidir, t\u00fcm dosyay\u0131 ba\u015ftan y\u00fcklemeye gerek kalmaz.<\/li>\n<li><strong>Paralellik:<\/strong> Birden fazla par\u00e7ay\u0131 ayn\u0131 anda y\u00fckleyerek genel y\u00fckleme s\u00fcresini k\u0131saltabilir.<\/li>\n<li><strong>Daha H\u0131zl\u0131 Hata Tespiti:<\/strong> K\u00fc\u00e7\u00fck par\u00e7alardaki hatalar daha h\u0131zl\u0131 tespit edilebilir.<\/li>\n<\/ol>\n<p>AWS SDK'n\u0131n <code>Upload<\/code> s\u0131n\u0131f\u0131, bu karma\u015f\u0131k s\u00fcreci sizin i\u00e7in soyutlar ve kolayca y\u00f6netmenizi sa\u011flar. Bu sayede, NestJS uygulaman\u0131z b\u00fcy\u00fck dosyalar\u0131 bile etkili ve verimli bir \u015fekilde S3'e aktarabilir, ayn\u0131 zamanda sunucu kaynaklar\u0131n\u0131z\u0131 minimumda tutar. Bu y\u00f6ntem, \u00f6zellikle video d\u00fczenleme platformlar\u0131, yedekleme hizmetleri veya b\u00fcy\u00fck veri setlerinin i\u015flendi\u011fi uygulamalar i\u00e7in vazge\u00e7ilmezdir.<\/p>\n<h2>Presigned URL'ler ile Do\u011frudan S3 Y\u00fcklemesi: G\u00fcvenlik ve Performans\u0131 Bir Arada Nas\u0131l Sa\u011flar\u0131z?<\/h2>\n<p>\u015eimdiye kadar ele ald\u0131\u011f\u0131m\u0131z y\u00f6ntemlerde, dosya y\u00fckleme i\u015flemi NestJS backend sunucunuz \u00fczerinden S3'e yap\u0131l\u0131yordu. Bu, k\u00fc\u00e7\u00fck dosyalar i\u00e7in kabul edilebilir olsa da, b\u00fcy\u00fck dosyalar veya y\u00fcksek trafikli uygulamalar i\u00e7in NestJS sunucusu \u00fczerinde gereksiz bir y\u00fck olu\u015fturur. Her dosya \u00f6nce istemciden sunucuya, ard\u0131ndan sunucudan S3'e aktar\u0131l\u0131r. Bu \u00e7ift aktar\u0131m, gecikmeyi art\u0131r\u0131r, sunucu kaynaklar\u0131n\u0131 (CPU, bellek, a\u011f bant geni\u015fli\u011fi) t\u00fcketir ve maliyetleri y\u00fckseltir.<\/p>\n<p>\u0130\u015fte bu noktada <strong>Presigned URL'ler<\/strong> devreye girer. Presigned URL, belirli bir S3 nesnesi \u00fczerinde belirli bir s\u00fcre boyunca (genellikle birka\u00e7 dakika) belirli bir i\u015flem (y\u00fckleme, indirme vb.) yapmaya izin veren, ge\u00e7ici ve g\u00fcvenli bir URL'dir. Temel fikir \u015fudur: \u0130stemci (taray\u0131c\u0131 veya mobil uygulama), NestJS sunucusundan bir y\u00fckleme i\u00e7in Presigned URL talep eder. NestJS sunucusu, kendi AWS kimlik bilgilerini kullanarak bu URL'yi olu\u015fturur ve istemciye geri g\u00f6nderir. \u0130stemci daha sonra bu Presigned URL'i kullanarak dosyay\u0131 do\u011frudan S3'e y\u00fckler. Bu sayede dosya, NestJS sunucunuz \u00fczerinden ge\u00e7mek zorunda kalmaz.<\/p>\n<h3>Presigned URL'lerin Avantajlar\u0131:<\/h3>\n<ol>\n<li><strong>Performans \u0130yile\u015ftirmesi:<\/strong> Dosya do\u011frudan istemciden S3'e gitti\u011fi i\u00e7in sunucu \u00fczerinde aktar\u0131m y\u00fck\u00fc ortadan kalkar. Bu, \u00f6zellikle b\u00fcy\u00fck dosyalar i\u00e7in y\u00fckleme s\u00fcrelerini \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r.<\/li>\n<li><strong>Sunucu Y\u00fck\u00fcn\u00fc Azaltma:<\/strong> NestJS sunucunuz sadece URL'yi olu\u015fturmakla me\u015fgul olur, dosyan\u0131n kendisini i\u015flemez. Bu, sunucunuzun daha fazla e\u015fzamanl\u0131 iste\u011fi y\u00f6netmesine olanak tan\u0131r.<\/li>\n<li><strong>Maliyet Optimizasyonu:<\/strong> Sunucu kaynaklar\u0131n\u0131n daha az kullan\u0131lmas\u0131, altyap\u0131 maliyetlerinde tasarruf sa\u011flar.<\/li>\n<li><strong>G\u00fcvenlik:<\/strong> Presigned URL'ler s\u0131n\u0131rl\u0131 bir s\u00fcre ge\u00e7erlidir ve sadece belirli bir i\u015flemi (\u00f6rne\u011fin PUT) ger\u00e7ekle\u015ftirmeye yetkilidir. Bu sayede AWS kimlik bilgileriniz istemciye asla a\u00e7\u0131k edilmez.<\/li>\n<\/ol>\n<h3>NestJS Taraf\u0131nda Presigned URL Olu\u015fturma<\/h3>\n<p>NestJS'te Presigned URL olu\u015fturmak i\u00e7in AWS SDK'n\u0131n <code>@aws-sdk\/s3-request-presigner<\/code> paketini kullanabiliriz:<\/p>\n<pre><code>\n  \/\/ s3.service.ts - Presigned URL olu\u015fturma metodu\n  import { Injectable } from '@nestjs\/common';\n  import { S3Client, PutObjectCommand } from '@aws-sdk\/client-s3';\n  import { getSignedUrl } from '@aws-sdk\/s3-request-presigner';\n  import { ConfigService } from '@nestjs\/config';\n  import * as crypto from 'crypto';\n\n  @Injectable()\n  export class S3Service {\n    private s3Client: S3Client;\n    private readonly bucketName: string;\n    private readonly region: string;\n\n    constructor(private configService: ConfigService) {\n      this.bucketName = this.configService.get('AWS_S3_BUCKET_NAME');\n      this.region = this.configService.get('AWS_S3_REGION');\n      this.s3Client = new S3Client({\n        region: this.region,\n        credentials: {\n          accessKeyId: this.configService.get('AWS_ACCESS_KEY_ID'),\n          secretAccessKey: this.configService.get('AWS_SECRET_ACCESS_KEY'),\n        },\n      });\n    }\n\n    async getPresignedUploadUrl(originalFileName: string, fileType: string): Promise<{ url: string, key: string }> {\n      const uniqueFileName = <code>${crypto.randomBytes(16).toString(&#039;hex&#039;)}-${originalFileName}<\/code>;\n      const command = new PutObjectCommand({\n        Bucket: this.bucketName,\n        Key: uniqueFileName,\n        ContentType: fileType,\n        ACL: 'public-read', \/\/ Veya istedi\u011finiz bir ACL\n      });\n\n      const presignedUrl = await getSignedUrl(this.s3Client, command, {\n        expiresIn: 300, \/\/ URL 300 saniye (5 dakika) ge\u00e7erli olacak\n      });\n\n      return { url: presignedUrl, key: uniqueFileName };\n    }\n  }\n<\/pre>\n<p><\/code><\/p>\n<pre><code>\n  \/\/ app.controller.ts - Presigned URL endpoint'i\n  import { Controller, Post, Body } from '@nestjs\/common';\n  import { S3Service } from '.\/s3.service';\n\n  interface GetPresignedUrlDto {\n    fileName: string;\n    fileType: string;\n  }\n\n  @Controller('files')\n  export class AppController {\n    constructor(private readonly s3Service: S3Service) {}\n\n    @Post('presigned-url')\n    async getPresignedUrl(@Body() dto: GetPresignedUrlDto) {\n      const { url, key } = await this.s3Service.getPresignedUploadUrl(dto.fileName, dto.fileType);\n      return { uploadUrl: url, fileKey: key };\n    }\n  }\n<\/pre>\n<p><\/code><\/p>\n<h3>\u0130stemci Taraf\u0131nda Kullan\u0131m (Kavramsal)<\/h3>\n<p>\u0130stemci taraf\u0131nda (\u00f6rne\u011fin React, Vue, Angular uygulamalar\u0131), bu URL'yi kullanarak dosyay\u0131 do\u011frudan S3'e y\u00fcklemek i\u00e7in <code>fetch<\/code> API'si veya Axios gibi bir HTTP istemcisi kullanabilirsiniz. \u0130\u015fte basit bir JavaScript \u00f6rne\u011fi:<\/p>\n<pre><code>\n  \/\/ \u0130stemci taraf\u0131 JavaScript (\u00f6rnek)\n  async function uploadFileDirectlyToS3(file) {\n    \/\/ 1. NestJS backend'inden Presigned URL'i al\n    const response = await fetch('\/files\/presigned-url', {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application\/json',\n      },\n      body: JSON.stringify({ fileName: file.name, fileType: file.type }),\n    });\n    const { uploadUrl, fileKey } = await response.json();\n\n    \/\/ 2. Presigned URL'i kullanarak dosyay\u0131 do\u011frudan S3'e y\u00fckle\n    await fetch(uploadUrl, {\n      method: 'PUT',\n      headers: {\n        'Content-Type': file.type, \/\/ Dosyan\u0131n do\u011fru Content-Type'\u0131n\u0131 belirtmek \u00f6nemli\n      },\n      body: file, \/\/ File objesinin kendisini body olarak g\u00f6nderiyoruz\n    });\n\n    console.log('Dosya do\u011frudan S3\\'e y\u00fcklendi. S3 Key:', fileKey);\n    return <code>https:\/\/YOUR_BUCKET_NAME.s3.YOUR_REGION.amazonaws.com\/${fileKey}<\/code>; \/\/ Y\u00fcklenen dosyan\u0131n nihai URL'si\n  }\n\n  \/\/ \u00d6rnek kullan\u0131m: Bir input[type=\"file\"] elementinden dosya se\u00e7ildi\u011finde\n  document.getElementById('fileInput').addEventListener('change', async (event) => {\n    const file = event.target.files[0];\n    if (file) {\n      try {\n        const fileUrl = await uploadFileDirectlyToS3(file);\n        console.log('Y\u00fcklenen dosyan\u0131n URL\\'si:', fileUrl);\n      } catch (error) {\n        console.error('Do\u011frudan S3\\'e y\u00fckleme hatas\u0131:', error);\n      }\n    }\n  });\n<\/pre>\n<p><\/code><\/p>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: Presigned URL'lerle multipart upload yapmak i\u00e7in AWS SDK'n\u0131n <code>createMultipartUpload<\/code>, <code>uploadPart<\/code> ve <code>completeMultipartUpload<\/code> i\u015flemlerini kullanarak daha karma\u015f\u0131k bir Presigned URL mekanizmas\u0131 olu\u015fturabilirsiniz. Bu, \u00e7ok b\u00fcy\u00fck dosyalar\u0131 do\u011frudan istemciden S3'e par\u00e7alar halinde y\u00fcklemenize olanak tan\u0131r.\n<\/div>\n<p>Presigned URL'ler, NestJS uygulaman\u0131z\u0131n performans\u0131n\u0131 ve \u00f6l\u00e7eklenebilirli\u011fini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131rken, AWS kimlik bilgilerinizin g\u00fcvenli\u011fini koruyarak g\u00fcvenli bir dosya y\u00fckleme mekanizmas\u0131 sunar. Bu y\u00f6ntem, \u00f6zellikle mobil uygulamalar veya y\u00fcksek trafikli web uygulamalar\u0131 i\u00e7in en iyi pratiklerden biridir.<\/p>\n<h2>Paralel Y\u00fcklemeler ve Hata Y\u00f6netimi: Performans\u0131 Maksimuma \u00c7\u0131karma Stratejileri<\/h2>\n<p>Verimli S3 dosya y\u00fcklemelerinin temel ta\u015flar\u0131ndan biri de paralel y\u00fckleme yetene\u011fidir. \u0130ster tek bir b\u00fcy\u00fck dosyay\u0131 par\u00e7alar halinde y\u00fcklerken, isterse birden fazla k\u00fc\u00e7\u00fck dosyay\u0131 ayn\u0131 anda S3'e g\u00f6nderirken, paralellik performans\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131rabilir. Ayr\u0131ca, a\u011f kesintileri veya S3 taraf\u0131ndaki ge\u00e7ici sorunlar nedeniyle olu\u015fabilecek hatalar\u0131 etkin bir \u015fekilde y\u00f6netmek, uygulaman\u0131z\u0131n dayan\u0131kl\u0131l\u0131\u011f\u0131n\u0131 ve kullan\u0131c\u0131 deneyimini do\u011frudan etkiler.<\/p>\n<h3>Birden Fazla Dosyay\u0131 Paralel Y\u00fckleme<\/h3>\n<p>\u00c7ok say\u0131da kullan\u0131c\u0131n\u0131n ayn\u0131 anda birden fazla dosya y\u00fcklemesi gerekti\u011fi senaryolarda (\u00f6rne\u011fin bir foto\u011fraf galerisine toplu y\u00fckleme), her dosyay\u0131 s\u0131rayla y\u00fcklemek verimsiz olacakt\u0131r. JavaScript'in Promise tabanl\u0131 yap\u0131s\u0131 ve <code>Promise.all<\/code> gibi metodlar sayesinde, birden fazla S3 y\u00fcklemesini ayn\u0131 anda ba\u015flatmak m\u00fcmk\u00fcnd\u00fcr. NestJS servisinizdeki <code>uploadFile<\/code> (veya <code>uploadLargeFile<\/code>) metodunuz bir Promise d\u00f6nd\u00fcrd\u00fc\u011f\u00fc s\u00fcrece, bu kolayca yap\u0131labilir:<\/p>\n<pre><code>\n  \/\/ s3.service.ts (var olan metodlar\u0131 kullan\u0131r\u0131z)\n\n  \/\/ app.controller.ts - Birden fazla dosya y\u00fckleme endpoint'i\n  import { Controller, Post, UseInterceptors, UploadedFiles } from '@nestjs\/common';\n  import { FilesInterceptor } from '@nestjs\/platform-express'; \/\/ Birden fazla dosya i\u00e7in FilesInterceptor\n  import { S3Service } from '.\/s3.service';\n  import { multerOptions } from '.\/config\/multer.config'; \/\/ Multer yap\u0131land\u0131rman\u0131z\n\n  @Controller('files')\n  export class AppController {\n    constructor(private readonly s3Service: S3Service) {}\n\n    @Post('upload-multiple')\n    @UseInterceptors(FilesInterceptor('files', 10, multerOptions)) \/\/ 'files' form alan\u0131n\u0131n ad\u0131, max 10 dosya\n    async uploadMultipleFiles(@UploadedFiles() files: Array<Express.Multer.File>) {\n      if (!files || files.length === 0) {\n        throw new Error('Y\u00fcklenecek dosya bulunamad\u0131.');\n      }\n\n      \/\/ Her dosya i\u00e7in S3 y\u00fcklemesini ba\u015flat ve Promise'leri topla\n      const uploadPromises = files.map(file => this.s3Service.uploadLargeFile(file)); \/\/ Veya uploadFile\n\n      try {\n        const uploadedUrls = await Promise.all(uploadPromises); \/\/ T\u00fcm Promise'lerin tamamlanmas\u0131n\u0131 bekle\n        return { message: <code>${uploadedUrls.length} dosya ba\u015far\u0131yla y\u00fcklendi!<\/code>, urls: uploadedUrls };\n      } catch (error) {\n        console.error('Toplu dosya y\u00fckleme hatas\u0131:', error);\n        throw new Error('Dosyalar y\u00fcklenirken bir hata olu\u015ftu.');\n      }\n    }\n  }\n<\/pre>\n<p><\/code><\/p>\n<p><code>FilesInterceptor<\/code> ile gelen t\u00fcm dosyalar i\u00e7in ayr\u0131 ayr\u0131 <code>uploadLargeFile<\/code> (veya <code>uploadFile<\/code>) \u00e7a\u011fr\u0131l\u0131r ve bu \u00e7a\u011fr\u0131lar bir dizi Promise olarak <code>uploadPromises<\/code>'a eklenir. <code>Promise.all<\/code>, t\u00fcm bu y\u00fcklemelerin paralel olarak tamamlanmas\u0131n\u0131 bekler. E\u011fer bir y\u00fckleme ba\u015far\u0131s\u0131z olursa, <code>Promise.all<\/code> reddedilir ve toplu y\u00fckleme i\u015flemi hata verir. Bu yakla\u015f\u0131m, NestJS sunucunuzun birden fazla dosyay\u0131 ayn\u0131 anda i\u015fleyerek genel y\u00fckleme s\u00fcresini ciddi \u015fekilde k\u0131saltmas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>B\u00fcy\u00fck Dosyalarda Par\u00e7ac\u0131klar\u0131n (Parts) Paralel Y\u00fcklenmesi<\/h3>\n<p>Daha \u00f6nce bahsetti\u011fimiz <code>Upload<\/code> s\u0131n\u0131f\u0131, b\u00fcy\u00fck dosyalar\u0131 par\u00e7alara b\u00f6lerek bu par\u00e7alar\u0131 otomatik olarak paralel y\u00fckler. <code>queueSize<\/code> ve <code>partSize<\/code> parametreleri bu paralelli\u011fi kontrol etmenizi sa\u011flar. Do\u011fru yap\u0131land\u0131r\u0131ld\u0131\u011f\u0131nda, bu s\u0131n\u0131f S3'\u00fcn sundu\u011fu tam bant geni\u015fli\u011finden faydalanarak tek bir b\u00fcy\u00fck dosyan\u0131n bile \u00e7ok daha h\u0131zl\u0131 y\u00fcklenmesini sa\u011flar. \u00d6rne\u011fin, 1 GB'l\u0131k bir dosyay\u0131 5 MB'l\u0131k par\u00e7alara b\u00f6ld\u00fc\u011f\u00fcn\u00fczde 200 par\u00e7a elde edersiniz. Bu 200 par\u00e7ay\u0131 4'erli gruplar halinde paralel y\u00fcklemek, s\u0131ral\u0131 y\u00fcklemeye k\u0131yasla \u00e7ok daha h\u0131zl\u0131 olacakt\u0131r.<\/p>\n<h3>Y\u00fckleme Kesintileri ve Devam Ettirme Mekanizmalar\u0131<\/h3>\n<p>\u00d6zellikle b\u00fcy\u00fck dosyalar y\u00fcklenirken veya mobil ortamlarda a\u011f ba\u011flant\u0131s\u0131 zay\u0131f oldu\u011funda y\u00fcklemeler kesintiye u\u011frayabilir. Multipart Upload, do\u011fas\u0131 gere\u011fi bu t\u00fcr kesintilere kar\u015f\u0131 daha dayan\u0131kl\u0131d\u0131r. E\u011fer bir par\u00e7a y\u00fcklemesi ba\u015far\u0131s\u0131z olursa, sadece o par\u00e7ay\u0131 tekrar g\u00f6ndermek yeterlidir. Tamam\u0131yle ba\u015ftan ba\u015flamak zorunda kalmazs\u0131n\u0131z. Ancak, bu mekanizmay\u0131 etkin bir \u015fekilde kullanabilmek i\u00e7in istemci taraf\u0131nda da bir \"devam ettirme\" (resumable upload) mant\u0131\u011f\u0131na ihtiyac\u0131n\u0131z olabilir. \u0130stemci, hangi par\u00e7alar\u0131n ba\u015far\u0131yla y\u00fcklendi\u011fini takip ederek, kesinti sonras\u0131 sadece kalan par\u00e7alar\u0131 g\u00f6ndermeye devam edebilir. Bu, genellikle bir ara depolama (\u00f6rne\u011fin yerel depolama) ve S3'ten tamamlanm\u0131\u015f par\u00e7alar\u0131n listesini sorgulama ile y\u00f6netilir. AWS SDK'n\u0131n <code>Upload<\/code> s\u0131n\u0131f\u0131 bu s\u00fcreci bir miktar otomatikle\u015ftirse de, tam bir devam ettirme yetene\u011fi i\u00e7in istemci-sunucu aras\u0131nda daha detayl\u0131 bir durum takibi gerekebilir.<\/p>\n<h3>Hata Tekrar Denemeleri (Retry Logic) ve Exponential Backoff<\/h3>\n<p>Ge\u00e7ici a\u011f sorunlar\u0131, S3 API limitlerine tak\u0131lma veya di\u011fer beklenmedik durumlar y\u00fckleme hatalar\u0131na yol a\u00e7abilir. Bu t\u00fcr durumlarda, an\u0131nda vazge\u00e7mek yerine, belirli bir say\u0131da tekrar deneme yapmak uygulaman\u0131z\u0131n daha sa\u011flam olmas\u0131n\u0131 sa\u011flar. Ancak, basit bir tekrar deneme d\u00f6ng\u00fcs\u00fc bazen durumu k\u00f6t\u00fcle\u015ftirebilir (\u00f6rne\u011fin bir hizmet kesintisi s\u0131ras\u0131nda S3'e yap\u0131lan istek selini art\u0131rmak). Bu nedenle, <strong>Exponential Backoff<\/strong> stratejisi kullanmak \u00f6nemlidir. Bu stratejide, her tekrar deneme aras\u0131nda beklenen s\u00fcre, her ba\u015far\u0131s\u0131z denemede katlanarak artar. Bu, sistemin toparlanmas\u0131na zaman tan\u0131r ve sunuculara a\u015f\u0131r\u0131 y\u00fck bindirmeyi \u00f6nler.<\/p>\n<p>\u00d6rnek bir retry mekanizmas\u0131 (kavramsal):<\/p>\n<pre><code>\n  async function reliableUpload(s3Client: S3Client, params: any, maxRetries = 5) {\n    let retries = 0;\n    while (retries < maxRetries) {\n      try {\n        await s3Client.send(new PutObjectCommand(params));\n        return true; \/\/ Ba\u015far\u0131l\u0131\n      } catch (error) {\n        console.warn(<code>Y\u00fckleme ba\u015far\u0131s\u0131z oldu, tekrar deneniyor (${retries + 1}\/${maxRetries}):<\/code>, error.message);\n        retries++;\n        const delay = Math.pow(2, retries) * 1000 + Math.random() * 1000; \/\/ 2, 4, 8, 16 saniye + rastgele jitter\n        await new Promise(resolve => setTimeout(resolve, delay));\n      }\n    }\n    throw new Error('Y\u00fckleme maksimum tekrar denemesi sonras\u0131 ba\u015far\u0131s\u0131z oldu.');\n  }\n<\/pre>\n<p><\/code><\/p>\n<p>Bu mekanizmay\u0131 <code>S3Service<\/code> i\u00e7indeki <code>uploadFile<\/code> veya <code>uploadLargeFile<\/code> metotlar\u0131n\u0131za entegre ederek uygulaman\u0131z\u0131n dosya y\u00fckleme konusunda \u00e7ok daha dayan\u0131kl\u0131 olmas\u0131n\u0131 sa\u011flayabilirsiniz.<\/p>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: Hata y\u00f6netimi s\u0131ras\u0131nda, hangi hatalar\u0131n tekrar denemeye de\u011fer oldu\u011funu (\u00f6rne\u011fin a\u011f hatalar\u0131, 5xx sunucu hatalar\u0131) ve hangilerinin an\u0131nda ba\u015far\u0131s\u0131z olmas\u0131 gerekti\u011fini (\u00f6rne\u011fin yetkilendirme hatalar\u0131, 4xx istemci hatalar\u0131) ay\u0131rt edin. Bu, gereksiz tekrar denemeleri \u00f6nler.\n<\/div>\n<p>Bu stratejiler, NestJS uygulaman\u0131z\u0131n dosya y\u00fckleme performans\u0131n\u0131 ve g\u00fcvenilirli\u011fini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131rarak, kullan\u0131c\u0131lara kesintisiz ve h\u0131zl\u0131 bir deneyim sunman\u0131za yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<h2>Depolama ve Maliyet Optimizasyonu: S3 Ya\u015fam D\u00f6ng\u00fcs\u00fc ve S\u0131n\u0131fland\u0131rma<\/h2>\n<p>AWS S3, sadece dosya y\u00fckleme ve indirme hizmeti sunmakla kalmaz, ayn\u0131 zamanda farkl\u0131 depolama s\u0131n\u0131flar\u0131 ve ya\u015fam d\u00f6ng\u00fcs\u00fc kurallar\u0131 arac\u0131l\u0131\u011f\u0131yla maliyetleri optimize etme konusunda da esneklik sa\u011flar. Verimli S3 kullan\u0131m\u0131, sadece y\u00fckleme h\u0131z\u0131n\u0131 de\u011fil, ayn\u0131 zamanda depolama maliyetlerinizi de g\u00f6z \u00f6n\u00fcnde bulundurmay\u0131 gerektirir. S3'\u00fcn sundu\u011fu depolama s\u0131n\u0131flar\u0131n\u0131 ve ya\u015fam d\u00f6ng\u00fcs\u00fc kurallar\u0131n\u0131 do\u011fru bir \u015fekilde anlamak ve uygulamak, uzun vadede \u00f6nemli tasarruflar sa\u011flayabilir.<\/p>\n<h3>S3 Depolama S\u0131n\u0131flar\u0131 Nelerdir ve Nas\u0131l Se\u00e7ilir?<\/h3>\n<p>S3, farkl\u0131 eri\u015fim s\u0131kl\u0131\u011f\u0131 ve performans ihtiya\u00e7lar\u0131na g\u00f6re optimize edilmi\u015f \u00e7e\u015fitli depolama s\u0131n\u0131flar\u0131 sunar. Her s\u0131n\u0131f\u0131n farkl\u0131 bir maliyet yap\u0131s\u0131 vard\u0131r:<\/p>\n<ol>\n<li><strong>Standard (S3 Standard):<\/strong> S\u0131k eri\u015filen veriler i\u00e7in tasarlanm\u0131\u015ft\u0131r. D\u00fc\u015f\u00fck gecikme s\u00fcresi ve y\u00fcksek verim sunar. En pahal\u0131 depolama s\u0131n\u0131f\u0131d\u0131r ancak en h\u0131zl\u0131 eri\u015fimi sa\u011flar.<\/li>\n<li><strong>Intelligent-Tiering (S3 Intelligent-Tiering):<\/strong> Veri eri\u015fim desenlerini otomatik olarak izler ve nesneleri en uygun depolama katman\u0131na ta\u015f\u0131r. Eri\u015fimin de\u011fi\u015fti\u011fi, bilinmeyen veya tahmin edilemeyen veri setleri i\u00e7in idealdir. Verileri s\u0131k eri\u015fim katman\u0131ndan seyrek eri\u015fim katman\u0131na veya tam tersine otomatik olarak ta\u015f\u0131r.<\/li>\n<li><strong>Standard-Infrequent Access (S3 Standard-IA):<\/strong> Daha az s\u0131kl\u0131kla eri\u015filen ancak gerekti\u011finde h\u0131zl\u0131 eri\u015fim gerektiren veriler i\u00e7in tasarlanm\u0131\u015ft\u0131r (\u00f6rne\u011fin, yedeklemeler, ola\u011fan\u00fcst\u00fc durum kurtarma dosyalar\u0131). Depolama maliyeti daha d\u00fc\u015f\u00fckt\u00fcr ancak veri al\u0131m\u0131 (retrieval) maliyeti vard\u0131r.<\/li>\n<li><strong>One Zone-Infrequent Access (S3 One Zone-IA):<\/strong> Standard-IA ile benzerdir ancak veriler tek bir AWS Eri\u015filebilirlik Alan\u0131'nda (Availability Zone) depolan\u0131r. Daha d\u00fc\u015f\u00fck maliyetlidir ancak bir b\u00f6lgedeki olaylarda veri kayb\u0131 riski ta\u015f\u0131r.<\/li>\n<li><strong>Glacier (S3 Glacier) ve Glacier Deep Archive (S3 Glacier Deep Archive):<\/strong> Ar\u015fivleme i\u00e7in tasarlanm\u0131\u015ft\u0131r. Veri al\u0131m s\u00fcreleri dakikalar veya saatler s\u00fcrebilir. En d\u00fc\u015f\u00fck depolama maliyetini sunarlar ve uzun vadeli, nadiren eri\u015filen veriler i\u00e7in uygundur (\u00f6rne\u011fin, yasal ar\u015fivler, uzun vadeli yedeklemeler).<\/li>\n<\/ol>\n<p>NestJS uygulaman\u0131z S3'e dosya y\u00fcklerken, <code>PutObjectCommand<\/code> parametrelerinde <code>StorageClass<\/code> \u00f6zelli\u011fini belirterek bir depolama s\u0131n\u0131f\u0131 atayabilirsiniz:<\/p>\n<pre><code>\n  const params = {\n    Bucket: this.bucketName,\n    Key: uniqueFileName,\n    Body: file.buffer,\n    ContentType: file.mimetype,\n    ACL: 'public-read',\n    StorageClass: 'STANDARD_IA', \/\/ \u00d6rne\u011fin, Standard-IA olarak belirleyelim\n  };\n  await this.s3Client.send(new PutObjectCommand(params));\n<\/pre>\n<p><\/code><\/p>\n<p>Ancak, genellikle ba\u015flang\u0131\u00e7ta <code>STANDARD<\/code> s\u0131n\u0131f\u0131n\u0131 kullanmak ve daha sonra \"Ya\u015fam D\u00f6ng\u00fcs\u00fc Kurallar\u0131\" ile di\u011fer s\u0131n\u0131flara ge\u00e7i\u015f yapmak daha pratik bir yakla\u015f\u0131md\u0131r.<\/p>\n<h3>Ya\u015fam D\u00f6ng\u00fcs\u00fc Kurallar\u0131 (Lifecycle Rules) ile Otomatik Y\u00f6netim<\/h3>\n<p>S3 ya\u015fam d\u00f6ng\u00fcs\u00fc kurallar\u0131, nesnelerinizin belirli bir s\u00fcre sonra otomatik olarak farkl\u0131 bir depolama s\u0131n\u0131f\u0131na ta\u015f\u0131nmas\u0131n\u0131 veya s\u00fcresi doldu\u011funda silinmesini sa\u011flar. Bu, manuel m\u00fcdahaleye gerek kalmadan maliyetleri optimize etmenin g\u00fc\u00e7l\u00fc bir yoludur. \u00d6rne\u011fin, yeni y\u00fcklenen bir foto\u011fraf\u0131n ilk 30 g\u00fcn boyunca <code>STANDARD<\/code> s\u0131n\u0131fta kalmas\u0131n\u0131, ard\u0131ndan 60 g\u00fcn boyunca <code>STANDARD_IA<\/code> s\u0131n\u0131f\u0131na ge\u00e7mesini ve son olarak 1 y\u0131l sonra <code>GLACIER<\/code>'a ar\u015fivlenmesini sa\u011flayabilirsiniz.<\/p>\n<p>Ya\u015fam d\u00f6ng\u00fcs\u00fc kurallar\u0131, AWS Y\u00f6netim Konsolu, AWS CLI veya SDK arac\u0131l\u0131\u011f\u0131yla bir S3 bucket'\u0131na uygulan\u0131r. NestJS uygulaman\u0131z, S3'e dosya y\u00fcklerken bu kurallar\u0131 do\u011frudan olu\u015fturmaz veya de\u011fi\u015ftirmez; uygulaman\u0131z sadece dosyalar\u0131 bucket'a y\u00fckler ve S3 taraf\u0131nda tan\u0131mlanm\u0131\u015f kurallar otomatik olarak devreye girer. Bu, uygulaman\u0131z\u0131n i\u015f mant\u0131\u011f\u0131n\u0131 basitle\u015ftirir ve depolama y\u00f6netimini S3'\u00fcn kendi yeteneklerine b\u0131rak\u0131r.<\/p>\n<p>\u00d6rnek bir ya\u015fam d\u00f6ng\u00fcs\u00fc kural\u0131 senaryosu:<\/p>\n<ol>\n<li>Kullan\u0131c\u0131lar foto\u011fraf y\u00fckler (varsay\u0131lan <code>STANDARD<\/code> s\u0131n\u0131f\u0131).<\/li>\n<li>Foto\u011fraflar 30 g\u00fcn boyunca s\u0131k eri\u015fime a\u00e7\u0131k kal\u0131r.<\/li>\n<li>30 g\u00fcn sonra, kural otomatik olarak bu foto\u011fraflar\u0131 <code>STANDARD_IA<\/code> s\u0131n\u0131f\u0131na ta\u015f\u0131r (daha d\u00fc\u015f\u00fck depolama maliyeti, yine de h\u0131zl\u0131 eri\u015fim).<\/li>\n<li>90 g\u00fcn sonra, kural foto\u011fraflar\u0131 <code>GLACIER<\/code> s\u0131n\u0131f\u0131na ta\u015f\u0131r (ar\u015fivleme, en d\u00fc\u015f\u00fck maliyet, daha yava\u015f eri\u015fim).<\/li>\n<li>5 y\u0131l sonra, kural foto\u011fraflar\u0131 kal\u0131c\u0131 olarak siler.<\/li>\n<\/ol>\n<p>Bu \u015fekilde, verilerin \"s\u0131cakl\u0131\u011f\u0131na\" (ne kadar s\u0131k eri\u015fildi\u011fine) g\u00f6re dinamik olarak maliyet optimizasyonu yapabilirsiniz. \u00d6zellikle log dosyalar\u0131, eski yedekler veya nadiren ba\u015fvurulan medya i\u00e7erikleri i\u00e7in ya\u015fam d\u00f6ng\u00fcs\u00fc kurallar\u0131 vazge\u00e7ilmezdir.<\/p>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: S3 depolama s\u0131n\u0131flar\u0131 ve ya\u015fam d\u00f6ng\u00fcs\u00fc kurallar\u0131, sadece maliyetleri d\u00fc\u015f\u00fcrmekle kalmaz, ayn\u0131 zamanda veri saklama politikalar\u0131na (\u00f6rne\u011fin yasal uyumluluk i\u00e7in belirli bir s\u00fcre veriyi tutma zorunlulu\u011fu) uyman\u0131za da yard\u0131mc\u0131 olur. Her bucket i\u00e7in ihtiya\u00e7lar\u0131n\u0131za uygun bir strateji belirlemek \u00f6nemlidir.\n<\/div>\n<p>Bu optimizasyonlar, NestJS uygulaman\u0131z\u0131n dosya y\u00fckleme mekanizmas\u0131n\u0131n sadece h\u0131zl\u0131 ve g\u00fcvenilir olmas\u0131n\u0131 sa\u011flamakla kalmaz, ayn\u0131 zamanda bulut altyap\u0131s\u0131 maliyetlerinizi de kontrol alt\u0131nda tutarak uzun vadeli s\u00fcrd\u00fcr\u00fclebilirli\u011fini garantiler.<\/p>\n<h2>NestJS S3 Y\u00fcklemelerinde Performans \u0130pu\u00e7lar\u0131 ve En \u0130yi Uygulamalar Nelerdir?<\/h2>\n<p>NestJS ile AWS S3 dosya y\u00fcklemelerini sadece \u00e7al\u0131\u015f\u0131r hale getirmek yeterli de\u011fildir; ger\u00e7ekten verimli, h\u0131zl\u0131 ve g\u00fcvenli bir sistem kurmak i\u00e7in baz\u0131 ileri d\u00fczey ipu\u00e7lar\u0131 ve en iyi uygulamalar\u0131 takip etmek gerekir. Bu b\u00f6l\u00fcm, sisteminizi maksimum performansa ula\u015ft\u0131rmak ve olas\u0131 sorunlar\u0131n \u00f6n\u00fcne ge\u00e7mek i\u00e7in kritik stratejileri ele almaktad\u0131r.<\/p>\n<h3>B\u00f6lge Se\u00e7imi (Region) ve Gecikme S\u00fcresi (Latency)<\/h3>\n<p>S3 bucket'\u0131n\u0131z\u0131 olu\u015ftururken se\u00e7ti\u011finiz AWS b\u00f6lgesi, uygulaman\u0131z\u0131n ve kullan\u0131c\u0131lar\u0131n\u0131z\u0131n konumuna g\u00f6re \u00f6nemli bir performans fakt\u00f6r\u00fcd\u00fcr. Kullan\u0131c\u0131lar\u0131n\u0131z\u0131n \u00e7o\u011funlu\u011funun co\u011frafi olarak yak\u0131n oldu\u011fu bir b\u00f6lge se\u00e7mek, S3'e yap\u0131lan isteklerin gecikme s\u00fcresini (latency) minimize eder. Daha d\u00fc\u015f\u00fck gecikme s\u00fcresi, daha h\u0131zl\u0131 y\u00fckleme ve indirme deneyimi anlam\u0131na gelir. \u00d6rne\u011fin, T\u00fcrkiye'deki kullan\u0131c\u0131lar\u0131 hedefliyorsan\u0131z, Frankfurt (eu-central-1) gibi yak\u0131n bir Avrupa b\u00f6lgesi genellikle iyi bir se\u00e7imdir. Global bir kullan\u0131c\u0131 kitleniz varsa, birden fazla b\u00f6lgede S3 bucket'lar\u0131 bulundurmay\u0131 veya AWS Global Accelerator gibi hizmetleri de\u011ferlendirmeyi d\u00fc\u015f\u00fcnebilirsiniz.<\/p>\n<h3>Kullan\u0131c\u0131 Konumuna En Yak\u0131n CDN (CloudFront) Kullan\u0131m\u0131<\/h3>\n<p>Dosyalar S3'e y\u00fcklendikten sonra, \u00f6zellikle herkese a\u00e7\u0131k veya s\u0131k eri\u015filen dosyalar i\u00e7in bir \u0130\u00e7erik Da\u011f\u0131t\u0131m A\u011f\u0131 (CDN) kullanmak performans\u0131 katlar. AWS CloudFront, S3 ile derinlemesine entegre \u00e7al\u0131\u015f\u0131r. CloudFront, dosyalar\u0131n\u0131z\u0131n kopyalar\u0131n\u0131 d\u00fcnyan\u0131n d\u00f6rt bir yan\u0131ndaki \"edge location\" (u\u00e7 nokta) sunucular\u0131nda \u00f6nbelle\u011fe al\u0131r. Bir kullan\u0131c\u0131 bir dosyaya eri\u015fti\u011finde, dosya ona co\u011frafi olarak en yak\u0131n u\u00e7 noktadan sunulur. Bu, gecikmeyi \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r ve y\u00fckleme sonras\u0131 indirme h\u0131zlar\u0131n\u0131 art\u0131r\u0131r. Ayr\u0131ca, S3'ten do\u011frudan okuma trafi\u011fini azaltarak maliyetleri de d\u00fc\u015f\u00fcrebilir. NestJS uygulaman\u0131z S3'e y\u00fckledikten sonra d\u00f6nen URL'leri CloudFront domain'i ile de\u011fi\u015ftirerek bu entegrasyonu sa\u011flayabilirsiniz.<\/p>\n<h3>Bellek ve CPU Kaynaklar\u0131n\u0131 Optimize Etme<\/h3>\n<p>NestJS sunucunuz, dosya y\u00fckleme s\u00fcrecinde bellek ve CPU kaynaklar\u0131n\u0131 kullan\u0131r. \u00d6zellikle buffer tabanl\u0131 y\u00fcklemelerde veya b\u00fcy\u00fck dosyalar\u0131 i\u015flerken bu t\u00fcketim artabilir. Optimize edilmi\u015f bir uygulama i\u00e7in:<\/p>\n<ul>\n<li><strong>Stream tabanl\u0131 y\u00fcklemeleri tercih edin:<\/strong> M\u00fcmk\u00fcn oldu\u011funca dosyalar\u0131 do\u011frudan S3'e ak\u0131\u015f halinde g\u00f6nderin, sunucu belle\u011finde tutmaktan ka\u00e7\u0131n\u0131n. Bu, b\u00fcy\u00fck dosyalar i\u00e7in kritiktir.<\/li>\n<li><strong>Multer limitlerini belirleyin:<\/strong> Bellek veya disk kullan\u0131m\u0131n\u0131 s\u0131n\u0131rlamak i\u00e7in <code>multer<\/code> yap\u0131land\u0131rman\u0131zda <code>fileSize<\/code> ve <code>files<\/code> gibi limitleri do\u011fru ayarlay\u0131n.<\/li>\n<li><strong>Arka plan i\u015flemleri:<\/strong> A\u011f\u0131r dosya i\u015fleme (resim yeniden boyutland\u0131rma, video d\u00f6n\u00fc\u015ft\u00fcrme) gerekiyorsa, bunu NestJS uygulaman\u0131z\u0131n ana ak\u0131\u015f\u0131ndan ay\u0131r\u0131n. Bu t\u00fcr g\u00f6revler i\u00e7in SQS, Lambda ve S3 olay tetikleyicileri gibi AWS hizmetlerini kullanarak sunucusuz bir i\u015fleme hatt\u0131 olu\u015fturun. Dosya S3'e y\u00fcklendi\u011finde bir S3 olay\u0131 tetiklenir, bu olay bir Lambda fonksiyonunu veya SQS kuyru\u011funu \u00e7al\u0131\u015ft\u0131rabilir.<\/li>\n<\/ul>\n<h3>G\u00fcvenlik: IAM Rolleri, Bucket Politikalar\u0131 ve \u015eifreleme<\/h3>\n<p>Performans kadar g\u00fcvenlik de hayati \u00f6neme sahiptir:<\/p>\n<ul>\n<li><strong>Minimum Yetki \u0130lkesi (Principle of Least Privilege):<\/strong> NestJS uygulaman\u0131z\u0131n AWS kimlik bilgileri (IAM kullan\u0131c\u0131 veya rol\u00fc), S3 \u00fczerinde sadece ihtiyac\u0131 olan i\u015flemleri yapmas\u0131na izin veren yetkilere sahip olmal\u0131d\u0131r (\u00f6rne\u011fin, sadece belirli bir bucket'a <code>PutObject<\/code> izni). Asla tam y\u00f6netici izni vermeyin.<\/li>\n<li><strong>Bucket Politikalar\u0131:<\/strong> S3 bucket'lar\u0131n\u0131za eri\u015fimi kontrol etmek i\u00e7in bucket politikalar\u0131n\u0131 kullan\u0131n. \u00d6rne\u011fin, belirli IP adreslerinden veya belirli IAM rollerinden gelen isteklere izin verin.<\/li>\n<li><strong>Nesne ACL'leri:<\/strong> Dosyalar\u0131n herkese a\u00e7\u0131k olup olmayaca\u011f\u0131n\u0131 belirleyen ACL'leri (Access Control List) dikkatli kullan\u0131n. Varsay\u0131lan olarak \u00f6zel tutmak ve sadece gerekti\u011finde Presigned URL'lerle ge\u00e7ici eri\u015fim sa\u011flamak daha g\u00fcvenlidir.<\/li>\n<li><strong>\u015eifreleme:<\/strong> Hassas verileri S3'te \u015fifrelemek i\u00e7in Sunucu Taraf\u0131 \u015eifreleme'yi (SSE-S3, SSE-KMS veya SSE-C) kullan\u0131n. NestJS uygulaman\u0131z y\u00fckleme yaparken bu se\u00e7enekleri belirtebilirsiniz.<\/li>\n<\/ul>\n<h3>Monitoring ve Logging (CloudWatch)<\/h3>\n<p>S3 y\u00fckleme i\u015flemlerinizin performans\u0131n\u0131 ve g\u00fcvenilirli\u011fini izlemek i\u00e7in AWS CloudWatch'u kullan\u0131n. S3, bucket seviyesinde bir\u00e7ok metrik (istek say\u0131s\u0131, hata say\u0131s\u0131, aktar\u0131lan veri) sunar. Ayr\u0131ca, NestJS uygulaman\u0131zdaki S3 y\u00fckleme i\u015flemlerinin loglar\u0131n\u0131 (ba\u015far\u0131l\u0131\/ba\u015far\u0131s\u0131z y\u00fcklemeler, s\u00fcreler) CloudWatch Logs'a g\u00f6ndererek merkezi bir izleme sistemi kurabilirsiniz. Bu sayede olas\u0131 darbo\u011fazlar\u0131 veya hata kaynaklar\u0131n\u0131 h\u0131zla tespit edip m\u00fcdahale edebilirsiniz.<\/p>\n<h3>Mobil Uyumlu HTML ve Kullan\u0131c\u0131 Deneyimi<\/h3>\n<p>Mobil cihazlardan yap\u0131lan dosya y\u00fcklemeleri i\u00e7in kullan\u0131c\u0131 deneyimi b\u00fcy\u00fck \u00f6nem ta\u015f\u0131r. Y\u00fcksek \u00e7\u00f6z\u00fcn\u00fcrl\u00fckl\u00fc ekranlar i\u00e7in tasarlanm\u0131\u015f, duyarl\u0131 bir kullan\u0131c\u0131 aray\u00fcz\u00fc sunmak gerekir. CSS <code>media query<\/code>'leri, farkl\u0131 ekran boyutlar\u0131na ve cihazlara g\u00f6re aray\u00fcz\u00fcn otomatik olarak uyum sa\u011flamas\u0131na olanak tan\u0131r. \u00d6rne\u011fin, bir dosya y\u00fckleme formunun geni\u015fli\u011fi, d\u00fc\u011fmelerin boyutu veya ilerleme \u00e7ubu\u011funun g\u00f6r\u00fcn\u00fcm\u00fc mobil cihazlarda daha okunakl\u0131 ve kullan\u0131labilir olacak \u015fekilde ayarlanabilir. Bu, do\u011frudan NestJS backend kodunu etkilemese de, dosya y\u00fckleme deneyiminin tamamlay\u0131c\u0131 bir par\u00e7as\u0131d\u0131r ve frontend geli\u015ftiriciler i\u00e7in birincil bir endi\u015fe kayna\u011f\u0131d\u0131r. H\u0131zl\u0131 y\u00fckleme h\u0131zlar\u0131, \u015f\u0131k bir ilerleme g\u00f6stergesi ve hatalara kar\u015f\u0131 dayan\u0131kl\u0131 bir sistem, mobil kullan\u0131c\u0131lar i\u00e7in hayati \u00f6neme sahiptir.<\/p>\n<pre><code>\n  \/* \u00d6rnek bir mobil uyumlu CSS medya sorgusu *\/\n  @media (max-width: 768px) {\n    .upload-container {\n      flex-direction: column;\n      padding: 15px;\n    }\n    .upload-button {\n      width: 100%;\n      margin-top: 10px;\n    }\n    .progress-bar {\n      height: 15px;\n    }\n  }\n<\/pre>\n<p><\/code><\/p>\n<p>Bu ipu\u00e7lar\u0131n\u0131 uygulayarak, NestJS ve AWS S3 entegrasyonunuzu sadece i\u015flevsel k\u0131lmakla kalmayacak, ayn\u0131 zamanda y\u00fcksek performansl\u0131, g\u00fcvenli ve maliyet-etkin bir \u00e7\u00f6z\u00fcm haline getireceksiniz. Bu, uygulaman\u0131z\u0131n \u00f6l\u00e7eklenebilirli\u011fini art\u0131racak ve kullan\u0131c\u0131lara \u00fcst\u00fcn bir deneyim sunacakt\u0131r.<\/p>\n<h2>Sonu\u00e7: Verimli S3 Dosya Y\u00fcklemeleriyle Uygulamalar\u0131n\u0131z\u0131 Gelece\u011fe Ta\u015f\u0131y\u0131n<\/h2>\n<p>NestJS ile AWS S3 entegrasyonu, modern web ve mobil uygulamalar i\u00e7in dosya depolama ve y\u00f6netimi konusunda g\u00fc\u00e7l\u00fc ve \u00f6l\u00e7eklenebilir bir temel sunar. Bu makale boyunca, k\u00fc\u00e7\u00fck ve orta boyutlu dosyalardan ba\u015flayarak, b\u00fcy\u00fck dosyalar\u0131n stream tabanl\u0131 ve multipart upload y\u00f6ntemleriyle nas\u0131l daha verimli y\u00fcklenebilece\u011fine, Presigned URL'ler arac\u0131l\u0131\u011f\u0131yla sunucu y\u00fck\u00fcn\u00fcn nas\u0131l azalt\u0131labilece\u011fine ve paralel y\u00fcklemelerle hata y\u00f6netiminin \u00f6nemine de\u011findik. Ayr\u0131ca, S3 depolama s\u0131n\u0131flar\u0131 ve ya\u015fam d\u00f6ng\u00fcs\u00fc kurallar\u0131yla maliyet optimizasyonunu, b\u00f6lge se\u00e7imi, CDN entegrasyonu ve g\u00fcvenlik gibi performans ipu\u00e7lar\u0131n\u0131 da ele ald\u0131k.<\/p>\n<p>Unutmamak gerekir ki, her uygulaman\u0131n ihtiya\u00e7lar\u0131 farkl\u0131d\u0131r ve \"tek beden herkese uyar\" bir \u00e7\u00f6z\u00fcm bulunmamaktad\u0131r. Ancak burada payla\u015f\u0131lan stratejiler ve en iyi uygulamalar, kendi NestJS projenizin \u00f6zel gereksinimlerine g\u00f6re uyarlayabilece\u011finiz sa\u011flam bir ba\u015flang\u0131\u00e7 noktas\u0131 sunmaktad\u0131r. Do\u011fru yakla\u015f\u0131m, hem geli\u015ftirme s\u00fcrecinizi kolayla\u015ft\u0131racak hem de son kullan\u0131c\u0131lar\u0131n\u0131za daha h\u0131zl\u0131, daha g\u00fcvenilir ve daha maliyet-etkin bir deneyim sunacakt\u0131r. Verimli S3 dosya y\u00fcklemeleri, sadece bir teknik gereklilik de\u011fil, ayn\u0131 zamanda uygulaman\u0131z\u0131n ba\u015far\u0131s\u0131 i\u00e7in kritik bir rekabet avantaj\u0131d\u0131r. Bu bilgilerle donanarak, NestJS tabanl\u0131 uygulamalar\u0131n\u0131z\u0131 gelece\u011fe ta\u015f\u0131yacak ve dijital d\u00fcnyadaki yerinizi sa\u011flamla\u015ft\u0131racaks\u0131n\u0131z.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<p>\u0130\u015fte NestJS ve S3 dosya y\u00fcklemeleriyle ilgili s\u0131k\u00e7a kar\u015f\u0131la\u015f\u0131lan baz\u0131 sorular ve yan\u0131tlar\u0131:<\/p>\n<ol>\n<li>\n    <strong>S: NestJS uygulamamda neden do\u011frudan S3'e y\u00fckleme yapmak yerine sunucu \u00fczerinden y\u00fckleme yap\u0131yorum?<\/strong><br \/>\n    C: Do\u011frudan S3'e y\u00fckleme (Presigned URL'ler arac\u0131l\u0131\u011f\u0131yla) genellikle daha iyi bir performans ve \u00f6l\u00e7eklenebilirlik sa\u011flar \u00e7\u00fcnk\u00fc dosya sunucu \u00fczerinden ge\u00e7mez. Ancak, baz\u0131 durumlarda sunucu \u00fczerinden y\u00fckleme tercih edilebilir:<\/p>\n<ul>\n<li>Dosya \u00fczerinde sunucuda ek i\u015fleme (\u00f6rne\u011fin vir\u00fcs taramas\u0131, format d\u00f6n\u00fc\u015ft\u00fcrme) yap\u0131lmas\u0131 gerekiyorsa.<\/li>\n<li>Uygulaman\u0131z\u0131n g\u00fcvenlik modeli Presigned URL'leri kullanmaya uygun de\u011filse.<\/li>\n<li>K\u00fc\u00e7\u00fck dosyalar i\u00e7in performans fark\u0131 ihmal edilebilir d\u00fczeyde oldu\u011fundan basitlik ad\u0131na sunucu \u00fczerinden y\u00fckleme tercih edilebilir.<\/li>\n<\/ul>\n<\/li>\n<li>\n    <strong>S: B\u00fcy\u00fck dosyalar\u0131 y\u00fcklerken NestJS sunucumun bellek t\u00fcketimini nas\u0131l minimize edebilirim?<\/strong><br \/>\n    C: B\u00fcy\u00fck dosyalar i\u00e7in stream tabanl\u0131 y\u00fcklemeleri tercih edin. Multer'\u0131 <code>memoryStorage<\/code> yerine <code>diskStorage<\/code> ile yap\u0131land\u0131r\u0131n veya <code>Upload<\/code> s\u0131n\u0131f\u0131 gibi AWS SDK'n\u0131n ak\u0131\u015f odakl\u0131 \u00f6zelliklerini kullanarak dosyay\u0131 do\u011frudan S3'e ak\u0131\u015f halinde g\u00f6nderin. Bu, dosyan\u0131n tamam\u0131n\u0131n bellekte tutulmas\u0131n\u0131 engeller.\n  <\/li>\n<li>\n    <strong>S: Y\u00fckledi\u011fim dosyalar\u0131n S3'te herkese a\u00e7\u0131k olmas\u0131n\u0131 nas\u0131l sa\u011flar\u0131m? G\u00fcvenlik riskleri var m\u0131?<\/strong><br \/>\n    C: <code>PutObjectCommand<\/code> parametrelerinde <code>ACL: &#039;public-read&#039;<\/code> belirterek dosyalar\u0131 herkese a\u00e7\u0131k yapabilirsiniz. Ancak, bu her zaman \u00f6nerilen bir y\u00f6ntem de\u011fildir. Herkese a\u00e7\u0131k dosyalar k\u00f6t\u00fc niyetli eri\u015fim riskini art\u0131r\u0131r. G\u00fcvenlik i\u00e7in, Presigned URL'ler kullanarak ge\u00e7ici eri\u015fim sa\u011flamay\u0131 veya CloudFront gibi bir CDN arkas\u0131ndan eri\u015fim kontrol\u00fcn\u00fc y\u00f6netmeyi d\u00fc\u015f\u00fcn\u00fcn. Ayr\u0131ca, S3 bucket politikalar\u0131n\u0131zla genel eri\u015fimi k\u0131s\u0131tlay\u0131n ve sadece belirli durumlarda belirli nesnelere eri\u015fim sa\u011flay\u0131n.\n  <\/li>\n<li>\n    <strong>S: Y\u00fckleme s\u0131ras\u0131nda ilerleme durumunu (progress) istemciye nas\u0131l bildirebilirim?<\/strong><br \/>\n    C: AWS SDK'n\u0131n <code>Upload<\/code> s\u0131n\u0131f\u0131, <code>httpUploadProgress<\/code> olay\u0131 arac\u0131l\u0131\u011f\u0131yla y\u00fckleme ilerlemesi hakk\u0131nda bilgi sa\u011flar. Bu olay\u0131 dinleyerek (<code>parallelUploads.on(&#039;httpUploadProgress&#039;, ...)<\/code>) y\u00fcklenen ve toplam byte miktar\u0131n\u0131 alabilirsiniz. Bu bilgiyi daha sonra WebSocket veya Server-Sent Events (SSE) gibi teknolojilerle istemciye ileterek bir ilerleme \u00e7ubu\u011fu g\u00f6sterebilirsiniz. Presigned URL ile do\u011frudan S3'e y\u00fckleme yaparken, istemci taraf\u0131ndaki HTTP iste\u011fi (\u00f6rne\u011fin <code>XMLHttpRequest<\/code> veya \u00f6zel Axios konfig\u00fcrasyonlar\u0131) kendi ilerleme olaylar\u0131n\u0131 sa\u011flayabilir.\n  <\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"Modern web uygulamalar\u0131nda dosya y\u00fckleme, \u00f6zellikle b\u00fcy\u00fck boyutlu dosyalar\u0131n y\u00f6netimi ve kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan kritik bir \u00f6neme sahiptir.&hellip;","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":[1],"tags":[],"class_list":{"0":"post-34234","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","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>NestJS ile Verimli S3 Dosya Y\u00fcklemeleri: H\u0131z ve B\u00fcy\u00fck Dosya Y\u00f6netimi<\/title>\n<meta name=\"description\" content=\"Modern web uygulamalar\u0131nda dosya y\u00fckleme, \u00f6zellikle b\u00fcy\u00fck boyutlu dosyalar\u0131n y\u00f6netimi ve kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan kritik bir \u00f6neme sahiptir. NestJS tabanl\u0131 bir projede AWS S3 kullanarak bu s\u00fcreci nas\u0131l h\u0131zland\u0131rabilece\u011finizi ve \u00f6l\u00e7eklenebilir hale getirebilece\u011finizi merak ediyorsan\u0131z, do\u011fru yerdesiniz. Bu makale, NestJS ile S3 entegrasyonunu en verimli \u015fekilde sa\u011flaman\u0131n yollar\u0131n\u0131 ad\u0131m ad\u0131m a\u00e7\u0131kl\u0131yor.\" \/>\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\/nestjs-ile-verimli-s3-dosya-yuklemeleri-hiz-ve-buyuk-dosya-yonetimi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"NestJS ile Verimli S3 Dosya Y\u00fcklemeleri: H\u0131z ve B\u00fcy\u00fck Dosya Y\u00f6netimi\" \/>\n<meta property=\"og:description\" content=\"Modern web uygulamalar\u0131nda dosya y\u00fckleme, \u00f6zellikle b\u00fcy\u00fck boyutlu dosyalar\u0131n y\u00f6netimi ve kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan kritik bir \u00f6neme sahiptir. NestJS tabanl\u0131 bir projede AWS S3 kullanarak bu s\u00fcreci nas\u0131l h\u0131zland\u0131rabilece\u011finizi ve \u00f6l\u00e7eklenebilir hale getirebilece\u011finizi merak ediyorsan\u0131z, do\u011fru yerdesiniz. Bu makale, NestJS ile S3 entegrasyonunu en verimli \u015fekilde sa\u011flaman\u0131n yollar\u0131n\u0131 ad\u0131m ad\u0131m a\u00e7\u0131kl\u0131yor.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/nestjs-ile-verimli-s3-dosya-yuklemeleri-hiz-ve-buyuk-dosya-yonetimi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-13T06:31:27+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=\"37 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/nestjs-ile-verimli-s3-dosya-yuklemeleri-hiz-ve-buyuk-dosya-yonetimi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/nestjs-ile-verimli-s3-dosya-yuklemeleri-hiz-ve-buyuk-dosya-yonetimi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"NestJS ile Verimli S3 Dosya Y\u00fcklemeleri: H\u0131z ve B\u00fcy\u00fck Dosya Y\u00f6netimi\",\"datePublished\":\"2025-11-13T06:31:27+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/nestjs-ile-verimli-s3-dosya-yuklemeleri-hiz-ve-buyuk-dosya-yonetimi\/\"},\"wordCount\":5821,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/nestjs-ile-verimli-s3-dosya-yuklemeleri-hiz-ve-buyuk-dosya-yonetimi\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/nestjs-ile-verimli-s3-dosya-yuklemeleri-hiz-ve-buyuk-dosya-yonetimi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/nestjs-ile-verimli-s3-dosya-yuklemeleri-hiz-ve-buyuk-dosya-yonetimi\/\",\"name\":\"NestJS ile Verimli S3 Dosya Y\u00fcklemeleri: H\u0131z ve B\u00fcy\u00fck Dosya Y\u00f6netimi\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-13T06:31:27+00:00\",\"description\":\"Modern web uygulamalar\u0131nda dosya y\u00fckleme, \u00f6zellikle b\u00fcy\u00fck boyutlu dosyalar\u0131n y\u00f6netimi ve kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan kritik bir \u00f6neme sahiptir. NestJS tabanl\u0131 bir projede AWS S3 kullanarak bu s\u00fcreci nas\u0131l h\u0131zland\u0131rabilece\u011finizi ve \u00f6l\u00e7eklenebilir hale getirebilece\u011finizi merak ediyorsan\u0131z, do\u011fru yerdesiniz. Bu makale, NestJS ile S3 entegrasyonunu en verimli \u015fekilde sa\u011flaman\u0131n yollar\u0131n\u0131 ad\u0131m ad\u0131m a\u00e7\u0131kl\u0131yor.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/nestjs-ile-verimli-s3-dosya-yuklemeleri-hiz-ve-buyuk-dosya-yonetimi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/nestjs-ile-verimli-s3-dosya-yuklemeleri-hiz-ve-buyuk-dosya-yonetimi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/nestjs-ile-verimli-s3-dosya-yuklemeleri-hiz-ve-buyuk-dosya-yonetimi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"NestJS ile Verimli S3 Dosya Y\u00fcklemeleri: H\u0131z ve B\u00fcy\u00fck Dosya 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":"NestJS ile Verimli S3 Dosya Y\u00fcklemeleri: H\u0131z ve B\u00fcy\u00fck Dosya Y\u00f6netimi","description":"Modern web uygulamalar\u0131nda dosya y\u00fckleme, \u00f6zellikle b\u00fcy\u00fck boyutlu dosyalar\u0131n y\u00f6netimi ve kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan kritik bir \u00f6neme sahiptir. NestJS tabanl\u0131 bir projede AWS S3 kullanarak bu s\u00fcreci nas\u0131l h\u0131zland\u0131rabilece\u011finizi ve \u00f6l\u00e7eklenebilir hale getirebilece\u011finizi merak ediyorsan\u0131z, do\u011fru yerdesiniz. Bu makale, NestJS ile S3 entegrasyonunu en verimli \u015fekilde sa\u011flaman\u0131n yollar\u0131n\u0131 ad\u0131m ad\u0131m a\u00e7\u0131kl\u0131yor.","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\/nestjs-ile-verimli-s3-dosya-yuklemeleri-hiz-ve-buyuk-dosya-yonetimi\/","og_locale":"tr_TR","og_type":"article","og_title":"NestJS ile Verimli S3 Dosya Y\u00fcklemeleri: H\u0131z ve B\u00fcy\u00fck Dosya Y\u00f6netimi","og_description":"Modern web uygulamalar\u0131nda dosya y\u00fckleme, \u00f6zellikle b\u00fcy\u00fck boyutlu dosyalar\u0131n y\u00f6netimi ve kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan kritik bir \u00f6neme sahiptir. NestJS tabanl\u0131 bir projede AWS S3 kullanarak bu s\u00fcreci nas\u0131l h\u0131zland\u0131rabilece\u011finizi ve \u00f6l\u00e7eklenebilir hale getirebilece\u011finizi merak ediyorsan\u0131z, do\u011fru yerdesiniz. Bu makale, NestJS ile S3 entegrasyonunu en verimli \u015fekilde sa\u011flaman\u0131n yollar\u0131n\u0131 ad\u0131m ad\u0131m a\u00e7\u0131kl\u0131yor.","og_url":"https:\/\/fatihsoysal.com\/blog\/nestjs-ile-verimli-s3-dosya-yuklemeleri-hiz-ve-buyuk-dosya-yonetimi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-13T06:31:27+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"37 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/nestjs-ile-verimli-s3-dosya-yuklemeleri-hiz-ve-buyuk-dosya-yonetimi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/nestjs-ile-verimli-s3-dosya-yuklemeleri-hiz-ve-buyuk-dosya-yonetimi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"NestJS ile Verimli S3 Dosya Y\u00fcklemeleri: H\u0131z ve B\u00fcy\u00fck Dosya Y\u00f6netimi","datePublished":"2025-11-13T06:31:27+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/nestjs-ile-verimli-s3-dosya-yuklemeleri-hiz-ve-buyuk-dosya-yonetimi\/"},"wordCount":5821,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/nestjs-ile-verimli-s3-dosya-yuklemeleri-hiz-ve-buyuk-dosya-yonetimi\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/nestjs-ile-verimli-s3-dosya-yuklemeleri-hiz-ve-buyuk-dosya-yonetimi\/","url":"https:\/\/fatihsoysal.com\/blog\/nestjs-ile-verimli-s3-dosya-yuklemeleri-hiz-ve-buyuk-dosya-yonetimi\/","name":"NestJS ile Verimli S3 Dosya Y\u00fcklemeleri: H\u0131z ve B\u00fcy\u00fck Dosya Y\u00f6netimi","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-13T06:31:27+00:00","description":"Modern web uygulamalar\u0131nda dosya y\u00fckleme, \u00f6zellikle b\u00fcy\u00fck boyutlu dosyalar\u0131n y\u00f6netimi ve kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan kritik bir \u00f6neme sahiptir. NestJS tabanl\u0131 bir projede AWS S3 kullanarak bu s\u00fcreci nas\u0131l h\u0131zland\u0131rabilece\u011finizi ve \u00f6l\u00e7eklenebilir hale getirebilece\u011finizi merak ediyorsan\u0131z, do\u011fru yerdesiniz. Bu makale, NestJS ile S3 entegrasyonunu en verimli \u015fekilde sa\u011flaman\u0131n yollar\u0131n\u0131 ad\u0131m ad\u0131m a\u00e7\u0131kl\u0131yor.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/nestjs-ile-verimli-s3-dosya-yuklemeleri-hiz-ve-buyuk-dosya-yonetimi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/nestjs-ile-verimli-s3-dosya-yuklemeleri-hiz-ve-buyuk-dosya-yonetimi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/nestjs-ile-verimli-s3-dosya-yuklemeleri-hiz-ve-buyuk-dosya-yonetimi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"NestJS ile Verimli S3 Dosya Y\u00fcklemeleri: H\u0131z ve B\u00fcy\u00fck Dosya 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\/34234","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=34234"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34234\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=34234"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=34234"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=34234"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}