{"id":36195,"date":"2025-12-10T03:41:02","date_gmt":"2025-12-10T00:41:02","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=36195"},"modified":"2025-12-10T03:41:02","modified_gmt":"2025-12-10T00:41:02","slug":"aws-c-sdk-kullanarak-digitalocean-spacese-dosya-yukleme","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/aws-c-sdk-kullanarak-digitalocean-spacese-dosya-yukleme\/","title":{"rendered":"AWS C++ SDK Kullanarak DigitalOcean Spaces&#8217;e Dosya Y\u00fckleme"},"content":{"rendered":"<p><body><\/p>\n<h2>AWS C++ SDK Kullanarak DigitalOcean Spaces&#8217;e Dosya Y\u00fckleme<\/h2>\n<h3>Giri\u015f<\/h3>\n<p>G\u00fcn\u00fcm\u00fcz\u00fcn bulut tabanl\u0131 uygulamalar\u0131nda veri depolama, kritik bir bile\u015fendir. Nesne depolama hizmetleri (Object Storage Services), b\u00fcy\u00fck miktarda yap\u0131land\u0131r\u0131lmam\u0131\u015f veriyi \u00f6l\u00e7eklenebilir, dayan\u0131kl\u0131 ve maliyet etkin bir \u015fekilde saklamak i\u00e7in ideal \u00e7\u00f6z\u00fcmler sunar. Amazon S3 (Simple Storage Service) bu alandaki en pop\u00fcler hizmetlerden biri olmakla birlikte, DigitalOcean Spaces gibi S3 uyumlu di\u011fer sa\u011flay\u0131c\u0131lar da benzer yetenekler sunarak geli\u015ftiricilere esneklik sa\u011flar. Bu teknik makale, performans odakl\u0131 C++ uygulamalar\u0131 geli\u015ftirenlerin, AWS C++ SDK&#8217;s\u0131n\u0131 kullanarak DigitalOcean Spaces&#8217;e nas\u0131l dosya y\u00fckleyebilece\u011fini ad\u0131m ad\u0131m a\u00e7\u0131klayacakt\u0131r.<\/p>\n<p>AWS C++ SDK, AWS hizmetleriyle etkile\u015fim kurmak i\u00e7in g\u00fc\u00e7l\u00fc ve kapsaml\u0131 bir ara\u00e7 seti sunar. DigitalOcean Spaces&#8217;in S3 API&#8217;si ile uyumlu olmas\u0131 sayesinde, AWS C++ SDK&#8217;s\u0131n\u0131 do\u011frudan DigitalOcean Spaces ile kullanabiliriz. Bu, mevcut AWS entegrasyonlar\u0131n\u0131za sahipseniz veya C++&#8217;\u0131n sa\u011flad\u0131\u011f\u0131 d\u00fc\u015f\u00fck seviyeli kontrol ve performans avantajlar\u0131ndan yararlanmak istiyorsan\u0131z b\u00fcy\u00fck bir kolayl\u0131k sa\u011flar. Makale boyunca, gerekli \u00f6nko\u015fullardan ba\u015flayarak SDK kurulumuna, kimlik do\u011frulama mekanizmalar\u0131na ve nihayetinde bir dosyan\u0131n Spaces&#8217;e ba\u015far\u0131yla nas\u0131l y\u00fcklenece\u011fine dair pratik bir \u00f6rnek sunulacakt\u0131r.<\/p>\n<h3>DigitalOcean Spaces ve S3 Uyumlulu\u011fu<\/h3>\n<p>DigitalOcean Spaces, geli\u015ftiricilere ve i\u015fletmelere \u00f6l\u00e7eklenebilir nesne depolama \u00e7\u00f6z\u00fcmleri sunan bir hizmettir. Temel olarak, Amazon S3&#8217;\u00fcn sundu\u011fu depolama modelini ve API&#8217;sini taklit eder. Bu &#8220;S3 uyumlulu\u011fu&#8221;, DigitalOcean Spaces&#8217;i mevcut S3 ara\u00e7lar\u0131, k\u00fct\u00fcphaneleri ve i\u015f ak\u0131\u015flar\u0131yla entegre etmeyi son derece kolayla\u015ft\u0131r\u0131r. AWS C++ SDK da bu uyumluluktan faydalanarak DigitalOcean Spaces ile sorunsuz bir \u015fekilde \u00e7al\u0131\u015fabilir.<\/p>\n<p>Bir &#8220;Space&#8221;, DigitalOcean&#8217;daki bir depolama birimidir ve S3&#8217;teki bir &#8220;Bucket&#8221; ile e\u015fde\u011ferdir. Her Space, benzersiz bir adla tan\u0131mlan\u0131r ve belirli bir veri merkezi b\u00f6lgesinde (\u00f6rne\u011fin, New York 3 &#8211; <code>nyc3<\/code>) bar\u0131nd\u0131r\u0131l\u0131r. S3 uyumlulu\u011fu, a\u015fa\u011f\u0131daki temel alanlarda kendini g\u00f6sterir:<\/p>\n<ul>\n<li><b>API Uyumlulu\u011fu:<\/b> DigitalOcean Spaces, S3 REST API&#8217;sinin \u00e7o\u011funu destekler. Bu, <code>PutObject<\/code>, <code>GetObject<\/code>, <code>DeleteObject<\/code> gibi temel i\u015flemlerin S3 ile ayn\u0131 \u015fekilde \u00e7a\u011fr\u0131labilece\u011fi anlam\u0131na gelir.<\/li>\n<li><b>Kimlik Do\u011frulama:<\/b> DigitalOcean Spaces, S3&#8217;\u00fcn kulland\u0131\u011f\u0131 AWS Signature Version 4 kimlik do\u011frulama mekanizmas\u0131n\u0131 destekler. Bu, AWS Access Key ID ve Secret Access Key format\u0131ndaki kimlik bilgilerinin Spaces i\u00e7in de kullan\u0131labilece\u011fi anlam\u0131na gelir.<\/li>\n<li><b>Ara\u00e7 Uyumlulu\u011fu:<\/b> AWS CLI, AWS SDK&#8217;lar (Python, Java, Go, C++ vb.) ve S3 ile uyumlu \u00fc\u00e7\u00fcnc\u00fc taraf ara\u00e7lar (s3cmd, Cyberduck vb.) DigitalOcean Spaces ile de \u00e7al\u0131\u015fabilir.<\/li>\n<\/ul>\n<p>Bu uyumluluk sayesinde, AWS C++ SDK&#8217;s\u0131n\u0131 kullan\u0131rken tek yapmam\u0131z gereken, SDK&#8217;ya DigitalOcean Spaces&#8217;in endpoint URL&#8217;sini (u\u00e7 nokta adresi) belirtmektir. Geri kalan t\u00fcm API \u00e7a\u011fr\u0131lar\u0131 ve kimlik do\u011frulama s\u00fcre\u00e7leri, S3 ile \u00e7al\u0131\u015f\u0131yormu\u015f gibi standart AWS SDK mekanizmalar\u0131 \u00fczerinden y\u00fcr\u00fct\u00fclecektir.<\/p>\n<h3>Gereksinimler<\/h3>\n<p>DigitalOcean Spaces&#8217;e AWS C++ SDK kullanarak dosya y\u00fckleme i\u015flemine ba\u015flamadan \u00f6nce baz\u0131 temel gereksinimleri kar\u015f\u0131lamam\u0131z gerekmektedir.<\/p>\n<h4>DigitalOcean Hesab\u0131 ve Space Olu\u015fturma<\/h4>\n<ol>\n<li><b>DigitalOcean Hesab\u0131:<\/b> E\u011fer bir DigitalOcean hesab\u0131n\u0131z yoksa, \u00f6ncelikle bir hesap olu\u015fturman\u0131z gerekmektedir.<\/li>\n<li><b>Space Olu\u015fturma:<\/b> DigitalOcean kontrol panelinizden (veya <code>doctl<\/code> CLI arac\u0131yla) yeni bir Space olu\u015fturun. Bir Space olu\u015ftururken bir b\u00f6lge (\u00f6rne\u011fin, <code>nyc3<\/code>) se\u00e7meniz ve Space&#8217;inize benzersiz bir ad vermeniz gerekecektir. Bu Space ad\u0131, S3 terimlerindeki &#8220;bucket&#8221; ad\u0131n\u0131z olacakt\u0131r.<\/li>\n<li><b>Spaces Anahtarlar\u0131 Olu\u015fturma:<\/b> DigitalOcean kontrol panelinizde, &#8220;API&#8221; sekmesi alt\u0131nda &#8220;Spaces access keys&#8221; b\u00f6l\u00fcm\u00fcne gidin. Burada yeni bir anahtar \u00e7ifti (Access Key ve Secret Key) olu\u015fturman\u0131z gerekmektedir. Bu anahtarlar, AWS&#8217;deki IAM kullan\u0131c\u0131 anahtarlar\u0131na benzer \u015fekilde, Spaces kaynaklar\u0131n\u0131za programl\u0131 eri\u015fim sa\u011flamak i\u00e7in kullan\u0131lacakt\u0131r. Bu anahtarlar\u0131 g\u00fcvenli bir yerde saklad\u0131\u011f\u0131n\u0131zdan emin olun, zira Secret Key&#8217;i bir daha g\u00f6remeyeceksiniz.<\/li>\n<li><b>Space Endpoint URL&#8217;sini Belirleme:<\/b> Her Space&#8217;in bir endpoint URL&#8217;si vard\u0131r. Bu URL genellikle <code>https:\/\/<region>.digitaloceanspaces.com<\/code> format\u0131ndad\u0131r (\u00f6rne\u011fin, <code>https:\/\/nyc3.digitaloceanspaces.com<\/code>). Bu URL, AWS C++ SDK&#8217;s\u0131na Spaces hizmetine nerede ba\u011flanaca\u011f\u0131n\u0131 s\u00f6yleyecektir.<\/li>\n<\/ol>\n<h4>Geli\u015ftirme Ortam\u0131<\/h4>\n<ul>\n<li><b>C++ Derleyici:<\/b> GCC (Linux\/macOS), Clang (Linux\/macOS) veya MSVC (Windows) gibi modern bir C++ derleyicisine ihtiyac\u0131n\u0131z olacakt\u0131r. C++11 veya \u00fczeri standartlar\u0131 desteklemesi \u00f6nemlidir.<\/li>\n<li><b>CMake:<\/b> AWS C++ SDK&#8217;s\u0131n\u0131 derlemek ve kendi projenizi y\u00f6netmek i\u00e7in CMake (s\u00fcr\u00fcm 3.8 veya \u00fczeri) gereklidir.<\/li>\n<li><b>Git:<\/b> AWS C++ SDK kaynak kodunu indirmek i\u00e7in Git&#8217;e ihtiyac\u0131n\u0131z olacakt\u0131r.<\/li>\n<li><b>\u0130nternet Ba\u011flant\u0131s\u0131:<\/b> SDK&#8217;y\u0131 indirmek ve DigitalOcean Spaces&#8217;e ba\u011flanmak i\u00e7in aktif bir internet ba\u011flant\u0131s\u0131 \u015fartt\u0131r.<\/li>\n<\/ul>\n<h4>AWS C++ SDK<\/h4>\n<p>AWS C++ SDK, projenize dahil etmeniz gereken ana bile\u015fendir. SDK&#8217;y\u0131 genellikle kaynak koddan derleyerek veya belirli platformlar i\u00e7in paket y\u00f6neticileri arac\u0131l\u0131\u011f\u0131yla kurarak elde edebilirsiniz. Bu makalede, kaynak koddan derleme ad\u0131mlar\u0131 ele al\u0131nacakt\u0131r, zira bu y\u00f6ntem en esnek ve g\u00fcncel s\u00fcr\u00fcm\u00fc kullanman\u0131z\u0131 sa\u011flar. DigitalOcean Spaces ile etkile\u015fim kurmak i\u00e7in \u00f6zellikle <code>s3<\/code>, <code>core<\/code> ve <code>transfer<\/code> mod\u00fcllerine ihtiyac\u0131m\u0131z olacakt\u0131r.<\/p>\n<h3>AWS C++ SDK Kurulumu<\/h3>\n<p>AWS C++ SDK&#8217;s\u0131n\u0131 kurmak, genellikle kaynak koddan derlemeyi i\u00e7erir. Bu, istedi\u011finiz mod\u00fclleri se\u00e7menize ve derleme ayarlar\u0131n\u0131 \u00f6zelle\u015ftirmenize olanak tan\u0131r.<\/p>\n<h4>Linux\/macOS i\u00e7in Kurulum<\/h4>\n<ol>\n<li><b>\u00d6nko\u015fullar\u0131 Y\u00fckleyin:<\/b><br \/>\n        Linux sistemlerde (Ubuntu\/Debian tabanl\u0131):<\/p>\n<pre><code>sudo apt-get update\nsudo apt-get install -y build-essential cmake git libcurl4-openssl-dev libssl-dev<\/code><\/pre>\n<p>        macOS sistemlerde (Homebrew ile):<\/p>\n<pre><code>brew install cmake git openssl@1.1 curl<\/code><\/pre>\n<p>        <code>openssl@1.1<\/code> ve <code>curl<\/code>&#8216;u y\u00fckledikten sonra, CMake&#8217;in bunlar\u0131 bulabilmesi i\u00e7in ortam de\u011fi\u015fkenlerini ayarlaman\u0131z gerekebilir:<\/p>\n<pre><code>export LDFLAGS=\"-L\/usr\/local\/opt\/openssl@1.1\/lib\"\nexport CPPFLAGS=\"-I\/usr\/local\/opt\/openssl@1.1\/include\"<\/code><\/pre>\n<\/li>\n<li><b>SDK Kaynak Kodunu \u0130ndirin:<\/b>\n<pre><code>git clone --recurse-submodules https:\/\/github.com\/aws\/aws-sdk-cpp.git\ncd aws-sdk-cpp<\/code><\/pre>\n<p>        <code>--recurse-submodules<\/code> bayra\u011f\u0131, SDK&#8217;n\u0131n ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 da indirmesini sa\u011flar.<\/li>\n<li><b>Derleme Dizinini Olu\u015fturun ve Yap\u0131land\u0131r\u0131n:<\/b>\n<pre><code>mkdir build\ncd build\ncmake .. -DBUILD_SHARED_LIBS=ON \\\n         -Daws-cpp-sdk-s3=ON \\\n         -Daws-cpp-sdk-core=ON \\\n         -Daws-cpp-sdk-transfer=ON \\\n         -DCMAKE_BUILD_TYPE=Release<\/code><\/pre>\n<ul>\n<li><code>-DBUILD_SHARED_LIBS=ON<\/code>: SDK&#8217;y\u0131 payla\u015f\u0131ml\u0131 k\u00fct\u00fcphaneler (<code>.so<\/code> veya <code>.dylib<\/code>) olarak derler. Bu, uygulaman\u0131z\u0131n boyutunu k\u00fc\u00e7\u00fclt\u00fcr ve dinamik ba\u011flant\u0131 sa\u011flar.<\/li>\n<li><code>-Daws-cpp-sdk-s3=ON<\/code>, <code>-Daws-cpp-sdk-core=ON<\/code>, <code>-Daws-cpp-sdk-transfer=ON<\/code>: Yaln\u0131zca ihtiyac\u0131m\u0131z olan mod\u00fclleri derlemeyi belirtir. Bu, derleme s\u00fcresini ve nihai SDK boyutunu azalt\u0131r.<\/li>\n<li><code>-DCMAKE_BUILD_TYPE=Release<\/code>: Optimizasyonlarla birlikte bir yay\u0131n (release) derlemesi yapar.<\/li>\n<\/ul>\n<\/li>\n<li><b>SDK&#8217;y\u0131 Derleyin:<\/b>\n<pre><code>make -j$(nproc)<\/code><\/pre>\n<p>        <code>$(nproc)<\/code> komutu, sisteminizdeki \u00e7ekirdek say\u0131s\u0131n\u0131 kullanarak paralel derleme yapar ve s\u00fcreci h\u0131zland\u0131r\u0131r.<\/li>\n<li><b>SDK&#8217;y\u0131 Y\u00fckleyin (\u0130ste\u011fe Ba\u011fl\u0131 ama Tavsiye Edilir):<\/b>\n<pre><code>sudo make install<\/code><\/pre>\n<p>        Bu komut, SDK ba\u015fl\u0131k dosyalar\u0131n\u0131 ve k\u00fct\u00fcphanelerini sistemin standart konumlar\u0131na (genellikle <code>\/usr\/local\/include<\/code> ve <code>\/usr\/local\/lib<\/code>) kopyalar. Bu, kendi projenizin SDK&#8217;y\u0131 bulmas\u0131n\u0131 kolayla\u015ft\u0131r\u0131r.<\/li>\n<\/ol>\n<h4>Windows i\u00e7in Kurulum<\/h4>\n<ol>\n<li><b>\u00d6nko\u015fullar\u0131 Y\u00fckleyin:<\/b>\n<ul>\n<li><b>Visual Studio:<\/b> En az Visual Studio 2017 (\u00f6nerilen 2019 veya 2022) y\u00fckl\u00fc olmal\u0131d\u0131r. &#8220;Desktop development with C++&#8221; i\u015f y\u00fck\u00fcn\u00fcn se\u00e7ili oldu\u011fundan emin olun.<\/li>\n<li><b>CMake:<\/b> CMake&#8217;in Windows y\u00fckleyicisini indirip kurun ve PATH&#8217;inize ekleyin.<\/li>\n<li><b>Git:<\/b> Git for Windows&#8217;u indirip kurun.<\/li>\n<\/ul>\n<\/li>\n<li><b>SDK Kaynak Kodunu \u0130ndirin:<\/b><br \/>\n        Komut \u0130stemi (CMD) veya PowerShell&#8217;i a\u00e7\u0131n:<\/p>\n<pre><code>git clone --recurse-submodules https:\/\/github.com\/aws\/aws-sdk-cpp.git\ncd aws-sdk-cpp<\/code><\/pre>\n<\/li>\n<li><b>Derleme Dizinini Olu\u015fturun ve Yap\u0131land\u0131r\u0131n:<\/b>\n<pre><code>mkdir build\ncd build\ncmake .. -DBUILD_SHARED_LIBS=ON ^\n         -Daws-cpp-sdk-s3=ON ^\n         -Daws-cpp-sdk-core=ON ^\n         -Daws-cpp-sdk-transfer=ON ^\n         -DCMAKE_BUILD_TYPE=Release ^\n         -G \"Visual Studio 17 2022\"<\/code><\/pre>\n<p>        <code>-G<\/code> bayra\u011f\u0131 ile kulland\u0131\u011f\u0131n\u0131z Visual Studio s\u00fcr\u00fcm\u00fcne uygun bir jenerat\u00f6r belirtin (\u00f6rne\u011fin, &#8220;Visual Studio 16 2019&#8221; veya &#8220;Visual Studio 15 2017&#8221;). <code>^<\/code> karakteri, komut sat\u0131r\u0131nda sat\u0131r atlamak i\u00e7in kullan\u0131l\u0131r.<\/li>\n<li><b>SDK&#8217;y\u0131 Derleyin:<\/b>\n<pre><code>cmake --build . --config Release<\/code><\/pre>\n<p>        Bu komut, Visual Studio \u00e7\u00f6z\u00fcm dosyas\u0131n\u0131 kullanarak SDK&#8217;y\u0131 derler.<\/li>\n<li><b>SDK&#8217;y\u0131 Y\u00fckleyin (\u0130ste\u011fe Ba\u011fl\u0131 ama Tavsiye Edilir):<\/b>\n<pre><code>cmake --install . --config Release<\/code><\/pre>\n<p>        Bu, SDK ba\u015fl\u0131k dosyalar\u0131n\u0131 ve k\u00fct\u00fcphanelerini sistemin standart konumlar\u0131na (genellikle <code>C:\\Program Files (x86)\\aws-sdk-cpp<\/code> veya benzeri) kopyalar.<\/li>\n<\/ol>\n<h3>DigitalOcean Spaces&#8217;e Dosya Y\u00fckleme Uygulamas\u0131<\/h3>\n<p>\u015eimdi AWS C++ SDK&#8217;s\u0131n\u0131 kullanarak DigitalOcean Spaces&#8217;e bir dosya y\u00fckleyecek basit bir C++ uygulamas\u0131 geli\u015ftirelim.<\/p>\n<h4>Proje Yap\u0131s\u0131<\/h4>\n<p>Projemiz i\u00e7in basit bir yap\u0131 olu\u015ftural\u0131m:<\/p>\n<pre><code>my_s3_upload\/\n\u251c\u2500\u2500 CMakeLists.txt\n\u2514\u2500\u2500 main.cpp<\/code><\/pre>\n<h4><code>CMakeLists.txt<\/code> \u0130\u00e7eri\u011fi<\/h4>\n<p>Projemizin SDK&#8217;y\u0131 do\u011fru bir \u015fekilde bulup ba\u011flant\u0131 kurabilmesi i\u00e7in <code>CMakeLists.txt<\/code> dosyas\u0131n\u0131 yap\u0131land\u0131rmam\u0131z gerekir:<\/p>\n<pre><code class=\"language-cmake\">cmake_minimum_required(VERSION 3.8)\nproject(digitalocean_s3_upload CXX)\n\n<h2>AWS SDK's\u0131n\u0131 bul<\/h2>\n<h2>E\u011fer SDK'y\u0131 make install ile y\u00fcklediyseniz, CMake otomatik olarak bulabilir.<\/h2>\n<h2>Y\u00fcklemediyseniz, AWS_SDK_ROOT ortam de\u011fi\u015fkenini ayarlaman\u0131z veya find_package'e ipucu vermeniz gerekebilir.<\/h2>\nfind_package(AWSSDK REQUIRED COMPONENTS s3 core transfer)\n\n<h2>\u00c7al\u0131\u015ft\u0131r\u0131labilir uygulamay\u0131 ekle<\/h2>\nadd_executable(s3_uploader main.cpp)\n\n<h2>SDK k\u00fct\u00fcphanelerini uygulamam\u0131za ba\u011fla<\/h2>\ntarget_link_libraries(s3_uploader PRIVATE AWSSDK::s3 AWSSDK::core AWSSDK::transfer)\n\n<h2>E\u011fer payla\u015f\u0131ml\u0131 k\u00fct\u00fcphaneler kullan\u0131l\u0131yorsa (Windows'ta DLL'ler gibi),<\/h2>\n<h2>bu DLL'lerin \u00e7al\u0131\u015fma zaman\u0131nda bulunabilmesi i\u00e7in ek ad\u0131mlar gerekebilir.<\/h2>\n<h2>\u00d6rne\u011fin, Windows'ta PATH ortam de\u011fi\u015fkenine SDK'n\u0131n bin dizinini eklemek.<\/h2>\n<h2>Linux'ta genellikle 'make install' ile \/usr\/local\/lib'e kopyaland\u0131\u011f\u0131 i\u00e7in sorun olmaz.<\/h2>\n<\/code><\/pre>\n<h4><code>main.cpp<\/code> \u0130\u00e7eri\u011fi<\/h4>\n<p>Bu dosya, DigitalOcean Spaces&#8217;e dosya y\u00fckleme mant\u0131\u011f\u0131n\u0131 i\u00e7erecektir.<\/p>\n<h5>SDK Ba\u015flatma ve Yap\u0131land\u0131rma<\/h5>\n<p>AWS C++ SDK&#8217;s\u0131n\u0131 kullanmadan \u00f6nce ba\u015flatman\u0131z ve i\u015finiz bitti\u011finde kapatman\u0131z gerekir. Ayr\u0131ca, DigitalOcean Spaces i\u00e7in \u00f6zel endpoint yap\u0131land\u0131rmas\u0131 yapmal\u0131y\u0131z.<\/p>\n<h5>Kimlik Do\u011frulama<\/h5>\n<p>AWS C++ SDK, AWS kimlik bilgilerini \u00e7e\u015fitli yollarla (ortam de\u011fi\u015fkenleri, yap\u0131land\u0131rma dosyalar\u0131, IAM rolleri vb.) otomatik olarak bulabilir. Ancak DigitalOcean Spaces i\u00e7in genellikle do\u011frudan Access Key ve Secret Key&#8217;i sa\u011flamak en basit y\u00f6ntemdir. <strong>\u00dcretim ortamlar\u0131nda bu kimlik bilgilerini kod i\u00e7ine g\u00f6mmek yerine, ortam de\u011fi\u015fkenleri veya g\u00fcvenli bir yap\u0131land\u0131rma mekanizmas\u0131 kullanman\u0131z \u015fiddetle tavsiye edilir.<\/strong><\/p>\n<h5>Dosya Y\u00fckleme Mant\u0131\u011f\u0131<\/h5>\n<p><code>PutObject<\/code> iste\u011fi, bir dosyay\u0131 belirtilen bir Space&#8217;e (bucket&#8217;a) y\u00fcklemek i\u00e7in kullan\u0131l\u0131r.<\/p>\n<p>A\u015fa\u011f\u0131da, t\u00fcm bu ad\u0131mlar\u0131 birle\u015ftiren eksiksiz bir <code>main.cpp<\/code> kodu bulunmaktad\u0131r:<\/p>\n<pre><code class=\"language-cpp\">#include <aws\/core\/Aws.h>\n#include <aws\/s3\/S3Client.h>\n#include <aws\/s3\/model\/PutObjectRequest.h>\n#include <aws\/core\/auth\/AWSCredentialsProvider.h>\n#include <aws\/core\/utils\/logging\/LogLevel.h>\n#include <aws\/core\/utils\/memory\/stl\/AWSStringStream.h>\n#include <fstream>\n#include <iostream>\n#include <memory>\n\n\/\/ Fonksiyon: Dosyay\u0131 DigitalOcean Spaces'e y\u00fckle\nbool UploadFileToDigitalOceanSpaces(\n    const Aws::String& filePath,\n    const Aws::String& spaceName,\n    const Aws::String& remoteFileName,\n    const Aws::String& accessKey,\n    const Aws::String& secretKey,\n    const Aws::String& region, \/\/ DigitalOcean b\u00f6lgesi, \u00f6rn: nyc3\n    const Aws::String& endpointOverride) \/\/ DigitalOcean Spaces endpoint'i\n{\n    \/\/ Kimlik bilgilerini olu\u015ftur\n    Aws::Auth::AWSCredentials credentials(accessKey, secretKey);\n\n    \/\/ S3 istemci yap\u0131land\u0131rmas\u0131n\u0131 olu\u015ftur\n    Aws::Client::ClientConfiguration clientConfig;\n    clientConfig.region = region; \/\/ DigitalOcean b\u00f6lgemizi belirtiyoruz\n    clientConfig.endpointOverride = endpointOverride; \/\/ DigitalOcean Spaces endpoint'ini override ediyoruz\n    clientConfig.scheme = Aws::Http::Scheme::HTTPS; \/\/ Her zaman HTTPS kullan\u0131n\n    clientConfig.connectTimeoutMs = 30000; \/\/ Ba\u011flant\u0131 zaman a\u015f\u0131m\u0131 (30 saniye)\n    clientConfig.requestTimeoutMs = 60000; \/\/ \u0130stek zaman a\u015f\u0131m\u0131 (60 saniye)\n\n    \/\/ S3 istemcisini olu\u015ftur\n    Aws::S3::S3Client s3_client(credentials, clientConfig);\n\n    \/\/ Y\u00fcklenecek dosyay\u0131 a\u00e7\n    std::shared_ptr<Aws::FStream> input_data =\n        Aws::MakeShared<Aws::FStream>(\"PutObjectInputStream\",\n            filePath.c_str(),\n            std::ios_base::in | std::ios_base::binary);\n\n    if (!*input_data)\n    {\n        std::cerr << \"Hata: Dosya a\u00e7\u0131lamad\u0131: \" << filePath << std::endl;\n        return false;\n    }\n\n    \/\/ PutObject iste\u011fini olu\u015ftur\n    Aws::S3::Model::PutObjectRequest putObjectRequest;\n    putObjectRequest.SetBucket(spaceName);\n    putObjectRequest.SetKey(remoteFileName);\n    putObjectRequest.SetBody(input_data);\n\n    \/\/ Content-Type'\u0131 ayarla (iste\u011fe ba\u011fl\u0131 ama iyi bir uygulama)\n    \/\/ Dosya t\u00fcr\u00fcne g\u00f6re dinamik olarak belirlenebilir\n    if (remoteFileName.EndsWith(\".txt\")) {\n        putObjectRequest.SetContentType(\"text\/plain\");\n    } else if (remoteFileName.EndsWith(\".jpg\") || remoteFileName.EndsWith(\".jpeg\")) {\n        putObjectRequest.SetContentType(\"image\/jpeg\");\n    } else if (remoteFileName.EndsWith(\".png\")) {\n        putObjectRequest.SetContentType(\"image\/png\");\n    } else if (remoteFileName.EndsWith(\".pdf\")) {\n        putObjectRequest.SetContentType(\"application\/pdf\");\n    } else {\n        putObjectRequest.SetContentType(\"application\/octet-stream\"); \/\/ Varsay\u0131lan ikili veri\n    }\n\n    \/\/ \u0130ste\u011fi g\u00f6nder\n    Aws::S3::Model::PutObjectOutcome putObjectOutcome = s3_client.PutObject(putObjectRequest);\n\n    if (putObjectOutcome.IsSuccess())\n    {\n        std::cout << \"Dosya '\" << filePath << \"' ba\u015far\u0131yla DigitalOcean Space '\" << spaceName\n                  << \"' i\u00e7ine '\" << remoteFileName << \"' olarak y\u00fcklendi.\" << std::endl;\n        return true;\n    }\n    else\n    {\n        std::cerr << \"Dosya y\u00fcklenirken hata olu\u015ftu: \"\n                  << putObjectOutcome.GetError().GetMessage() << std::endl;\n        return false;\n    }\n}\n\nint main(int argc, char<em><\/em> argv)\n{\n    \/\/ SDK se\u00e7eneklerini olu\u015ftur\n    Aws::SDKOptions options;\n    options.loggingOptions.logLevel = Aws::Utils::Logging::LogLevel::Info; \/\/ Log seviyesini ayarla\n\n    \/\/ SDK'y\u0131 ba\u015flat\n    Aws::InitAPI(options);\n\n    \/\/ Ortam de\u011fi\u015fkenlerinden veya do\u011frudan kimlik bilgilerini al\n    \/\/ \u00dcretim ortamlar\u0131nda ortam de\u011fi\u015fkenleri kullan\u0131lmas\u0131 \u015fiddetle tavsiye edilir.\n    \/\/ \u00d6rne\u011fin:\n    \/\/ const Aws::String ACCESS_KEY = Aws::Environment::GetEnv(\"DO_SPACES_ACCESS_KEY\");\n    \/\/ const Aws::String SECRET_KEY = Aws::Environment::GetEnv(\"DO_SPACES_SECRET_KEY\");\n    \/\/ const Aws::String SPACE_NAME = Aws::Environment::GetEnv(\"DO_SPACE_NAME\");\n    \/\/ const Aws::String REGION = Aws::Environment::GetEnv(\"DO_SPACE_REGION\"); \/\/ \u00f6rn: nyc3\n    \/\/ const Aws::String ENDPOINT = Aws::Environment::GetEnv(\"DO_SPACE_ENDPOINT\"); \/\/ \u00f6rn: https:\/\/nyc3.digitaloceanspaces.com\n\n    \/\/ \u00d6rnek de\u011ferler (kendi bilgilerinizle de\u011fi\u015ftirin!)\n    const Aws::String ACCESS_KEY = \"YOUR_DIGITALOCEAN_SPACES_ACCESS_KEY\";\n    const Aws::String SECRET_KEY = \"YOUR_DIGITALOCEAN_SPACES_SECRET_KEY\";\n    const Aws::String SPACE_NAME = \"your-space-name\"; \/\/ DigitalOcean Space'inizin ad\u0131\n    const Aws::String REGION = \"nyc3\"; \/\/ Space'inizin bulundu\u011fu DigitalOcean b\u00f6lgesi\n    const Aws::String ENDPOINT_OVERRIDE = \"https:\/\/nyc3.digitaloceanspaces.com\"; \/\/ Space'inizin endpoint URL'si\n\n    const Aws::String LOCAL_FILE_PATH = \"my_local_file.txt\"; \/\/ Y\u00fcklenecek yerel dosyan\u0131n yolu\n    const Aws::String REMOTE_FILE_NAME = \"uploaded_file_from_cpp.txt\"; \/\/ Space'te g\u00f6r\u00fcnecek dosya ad\u0131\n\n    \/\/ Test dosyas\u0131 olu\u015ftur (e\u011fer yoksa)\n    std::ofstream testFile(LOCAL_FILE_PATH.c_str());\n    if (testFile.is_open()) {\n        testFile << \"Bu, DigitalOcean Spaces'e AWS C++ SDK ile y\u00fcklenen bir test dosyas\u0131d\u0131r.\\n\";\n        testFile.close();\n        std::cout << \"Test dosyas\u0131 '\" << LOCAL_FILE_PATH << \"' olu\u015fturuldu.\" << std::endl;\n    } else {\n        std::cerr << \"Hata: Test dosyas\u0131 olu\u015fturulamad\u0131.\" << std::endl;\n        \/\/ return 1; \/\/ Test dosyas\u0131 olu\u015fturulamasa bile devam edebiliriz, belki zaten vard\u0131r.\n    }\n\n\n    if (UploadFileToDigitalOceanSpaces(LOCAL_FILE_PATH, SPACE_NAME, REMOTE_FILE_NAME,\n                                       ACCESS_KEY, SECRET_KEY, REGION, ENDPOINT_OVERRIDE))\n    {\n        std::cout << \"Y\u00fckleme i\u015flemi tamamland\u0131.\" << std::endl;\n    }\n    else\n    {\n        std::cerr << \"Y\u00fckleme i\u015flemi ba\u015far\u0131s\u0131z oldu.\" << std::endl;\n    }\n\n    \/\/ SDK'y\u0131 kapat\n    Aws::ShutdownAPI(options);\n\n    return 0;\n}\n<\/code><\/pre>\n<h5>Uygulamay\u0131 Derleme ve \u00c7al\u0131\u015ft\u0131rma<\/h5>\n<p>Proje dizininizin (<code>my_s3_upload<\/code>) k\u00f6k\u00fcnde \u015fu ad\u0131mlar\u0131 izleyin:<\/p>\n<pre><code>mkdir build\ncd build\ncmake ..\nmake\n.\/s3_uploader<\/code><\/pre>\n<p>Windows'ta Visual Studio Solution (.sln) dosyas\u0131 olu\u015fturulacak, onu Visual Studio ile a\u00e7\u0131p derleyebilir ve \u00e7al\u0131\u015ft\u0131rabilirsiniz. \u00c7al\u0131\u015ft\u0131r\u0131rken, <code>.exe<\/code> dosyas\u0131n\u0131n SDK'n\u0131n gerekli DLL'lerini bulabildi\u011finden emin olun (genellikle SDK'n\u0131n <code>bin<\/code> dizinini PATH'e eklemek veya DLL'leri <code>.exe<\/code>'nin yan\u0131na kopyalamak gerekir).<\/p>\n<h3>Geli\u015fmi\u015f Konular ve En \u0130yi Uygulamalar<\/h3>\n<p>Temel dosya y\u00fckleme i\u015flemini \u00f6\u011frendikten sonra, daha sa\u011flam ve verimli uygulamalar i\u00e7in baz\u0131 geli\u015fmi\u015f konular\u0131 ve en iyi uygulamalar\u0131 g\u00f6z \u00f6n\u00fcnde bulundurmak \u00f6nemlidir.<\/p>\n<h4>B\u00fcy\u00fck Dosyalar ve \u00c7ok Par\u00e7al\u0131 Y\u00fckleme (Multipart Upload)<\/h4>\n<p>B\u00fcy\u00fck dosyalar (genellikle 5 MB'tan b\u00fcy\u00fck) i\u00e7in do\u011frudan <code>PutObject<\/code> yerine \u00e7ok par\u00e7al\u0131 y\u00fckleme kullan\u0131lmas\u0131 \u00f6nerilir. \u00c7ok par\u00e7al\u0131 y\u00fckleme, bir dosyay\u0131 daha k\u00fc\u00e7\u00fck par\u00e7alara b\u00f6ler ve bu par\u00e7alar\u0131 paralel olarak y\u00fckler. Bu yakla\u015f\u0131m, y\u00fckleme h\u0131z\u0131n\u0131 art\u0131r\u0131r, a\u011f kesintilerine kar\u015f\u0131 daha dayan\u0131kl\u0131 hale gelir ve bir par\u00e7an\u0131n ba\u015far\u0131s\u0131z olmas\u0131 durumunda t\u00fcm y\u00fcklemeyi ba\u015ftan ba\u015flatmak yerine yaln\u0131zca ba\u015far\u0131s\u0131z olan par\u00e7an\u0131n tekrar y\u00fcklenmesini sa\u011flar.<\/p>\n<p>AWS C++ SDK's\u0131, <code>TransferManager<\/code> ad\u0131 verilen bir bile\u015fen arac\u0131l\u0131\u011f\u0131yla \u00e7ok par\u00e7al\u0131 y\u00fcklemeyi otomatik olarak y\u00f6netir. <code>TransferManager<\/code>, karma\u015f\u0131kl\u0131\u011f\u0131 soyutlayarak b\u00fcy\u00fck dosyalar\u0131n verimli bir \u015fekilde y\u00fcklenmesini ve indirilmesini sa\u011flar.<\/p>\n<pre><code class=\"language-cpp\">#include <aws\/transfer\/TransferManager.h>\n\/\/ ... di\u011fer ba\u015fl\u0131klar ...\n\n\/\/ TransferManager ile dosya y\u00fckleme \u00f6rne\u011fi\nvoid UploadFileWithTransferManager(\n    const Aws::String& filePath,\n    const Aws::String& spaceName,\n    const Aws::String& remoteFileName,\n    const Aws::String& accessKey,\n    const Aws::String& secretKey,\n    const Aws::String& region,\n    const Aws::String& endpointOverride)\n{\n    Aws::Auth::AWSCredentials credentials(accessKey, secretKey);\n    Aws::Client::ClientConfiguration clientConfig;\n    clientConfig.region = region;\n    clientConfig.endpointOverride = endpointOverride;\n    clientConfig.scheme = Aws::Http::Scheme::HTTPS;\n\n    std::shared_ptr<Aws::S3::S3Client> s3_client =\n        Aws::MakeShared<Aws::S3::S3Client>(\"TransferManager\", credentials, clientConfig);\n\n    Aws::Transfer::TransferManagerConfiguration transferConfig;\n    transferConfig.s3Client = s3_client;\n    \/\/ transferConfig.transferExecutor = Aws::MakeShared<Aws::Utils::Threading::PooledThreadExecutor>(\"TransferExecutor\", 25); \/\/ Paralellik ayar\u0131\n    \/\/ transferConfig.uploadDirectory = \"path\/to\/temp\/dir\"; \/\/ B\u00fcy\u00fck dosyalar i\u00e7in ge\u00e7ici dizin\n\n    std::shared_ptr<Aws::Transfer::TransferManager> transferManager =\n        Aws::Transfer::TransferManager::Create(transferConfig);\n\n    std::shared_ptr<Aws::Transfer::UploadHandle> uploadHandle =\n        transferManager->UploadFile(filePath, spaceName, remoteFileName, \"application\/octet-stream\");\n\n    uploadHandle->WaitUntilFinished(); \/\/ Y\u00fckleme tamamlanana kadar bekle\n\n    if (uploadHandle->Get               Status() == Aws::Transfer::TransferStatus::COMPLETED)\n    {\n        std::cout << \"TransferManager ile dosya ba\u015far\u0131yla y\u00fcklendi: \" << remoteFileName << std::endl;\n    }\n    else\n    {\n        std::cerr << \"TransferManager ile dosya y\u00fcklenirken hata olu\u015ftu.\" << std::endl;\n        if (uploadHandle->GetError().GetMessage().length() > 0)\n        {\n            std::cerr << \"Hata: \" << uploadHandle->GetError().GetMessage() << std::endl;\n        }\n    }\n    transferManager->Shutdown();\n}\n<\/code><\/pre>\n<h4>Hata Y\u00f6netimi ve Yeniden Denemeler<\/h4>\n<p>A\u011f i\u015flemleri do\u011fas\u0131 gere\u011fi hatalara a\u00e7\u0131kt\u0131r. AWS C++ SDK, a\u011f kesintileri, ge\u00e7ici sunucu hatalar\u0131 gibi durumlarda otomatik yeniden deneme mekanizmalar\u0131na sahiptir. Ancak, uygulaman\u0131z\u0131n daha sa\u011flam olmas\u0131 i\u00e7in kendi hata y\u00f6netimi ve yeniden deneme stratejilerinizi de uygulaman\u0131z \u00f6nemlidir.<\/p>\n<ul>\n<li><b>Hata Kontrol\u00fc:<\/b> Her SDK \u00e7a\u011fr\u0131s\u0131ndan sonra <code>IsSuccess()<\/code> metodunu kontrol edin ve ba\u015far\u0131s\u0131z olursa <code>GetError().GetMessage()<\/code> ile hata mesaj\u0131n\u0131 loglay\u0131n.<\/li>\n<li><b>Yeniden Deneme Yap\u0131land\u0131rmas\u0131:<\/b> <code>ClientConfiguration<\/code> i\u00e7inde <code>maxConnections<\/code> ve <code>retryStrategy<\/code> gibi ayarlar\u0131 yap\u0131land\u0131rarak SDK'n\u0131n yeniden deneme davran\u0131\u015f\u0131n\u0131 \u00f6zelle\u015ftirebilirsiniz.<\/li>\n<\/ul>\n<h4>G\u00fcvenlik<\/h4>\n<p>Kimlik bilgileri, bulut kaynaklar\u0131n\u0131za eri\u015fimin anahtar\u0131d\u0131r ve bunlar\u0131n g\u00fcvenli\u011fi son derece \u00f6nemlidir.<\/p>\n<ul>\n<li><b>Kimlik Bilgilerini Gizleme:<\/b> Eri\u015fim anahtarlar\u0131n\u0131z\u0131 ve gizli anahtarlar\u0131n\u0131z\u0131 do\u011frudan kod i\u00e7ine g\u00f6mmeyin. Bunun yerine ortam de\u011fi\u015fkenleri (\u00f6rne\u011fin, <code>DO_SPACES_ACCESS_KEY<\/code>, <code>DO_SPACES_SECRET_KEY<\/code>) veya g\u00fcvenli yap\u0131land\u0131rma dosyalar\u0131 kullan\u0131n.<\/li>\n<li><b>HTTPS Kullan\u0131m\u0131:<\/b> <code>ClientConfiguration::scheme<\/code> de\u011ferini <code>Aws::Http::Scheme::HTTPS<\/code> olarak ayarlayarak t\u00fcm ileti\u015fimin \u015fifreli olmas\u0131n\u0131 sa\u011flay\u0131n. DigitalOcean Spaces varsay\u0131lan olarak HTTPS'i destekler ve kullan\u0131lmas\u0131 \u015fiddetle tavsiye edilir.<\/li>\n<li><b>Eri\u015fim Kontrol\u00fc:<\/b> DigitalOcean Spaces, S3 uyumlu ACL'ler (Access Control List) ve Space politikalar\u0131 arac\u0131l\u0131\u011f\u0131yla eri\u015fim kontrol\u00fc sa\u011flar. Yaln\u0131zca gerekli minimum izinleri verin (Least Privilege Principle).<\/li>\n<\/ul>\n<h4>Performans \u0130pu\u00e7lar\u0131<\/h4>\n<ul>\n<li><b>Do\u011fru B\u00f6lge Se\u00e7imi:<\/b> Space'inizi uygulaman\u0131z\u0131n veya kullan\u0131c\u0131lar\u0131n\u0131z\u0131n co\u011frafi konumuna en yak\u0131n b\u00f6lgede olu\u015fturmak, gecikmeyi azalt\u0131r ve performans\u0131 art\u0131r\u0131r.<\/li>\n<li><b>Paralellik:<\/b> B\u00fcy\u00fck dosyalar i\u00e7in <code>TransferManager<\/code> kullanmak, \u00e7ok par\u00e7al\u0131 y\u00fcklemeyi ve paralel y\u00fcklemeyi otomatik olarak y\u00f6netti\u011fi i\u00e7in performans\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r.<\/li>\n<li><b>Ba\u011flant\u0131 Havuzu:<\/b> AWS C++ SDK, dahili olarak ba\u011flant\u0131 havuzu (connection pooling) kullan\u0131r. Bu, her istek i\u00e7in yeni bir ba\u011flant\u0131 a\u00e7ma maliyetinden ka\u00e7\u0131narak performans\u0131 art\u0131r\u0131r.<\/li>\n<li><b>Buffer Boyutlar\u0131:<\/b> <code>PutObject<\/code> veya <code>TransferManager<\/code> kullan\u0131rken, okuma\/yazma buffer boyutlar\u0131n\u0131 uygulaman\u0131z\u0131n ihtiya\u00e7lar\u0131na g\u00f6re optimize edebilirsiniz.<\/li>\n<\/ul>\n<h3>Sonu\u00e7<\/h3>\n<p>Bu makalede, AWS C++ SDK's\u0131n\u0131 kullanarak DigitalOcean Spaces'e dosya y\u00fckleme s\u00fcrecini ayr\u0131nt\u0131l\u0131 bir \u015fekilde ele ald\u0131k. DigitalOcean Spaces'in S3 uyumlulu\u011fu sayesinde, AWS SDK'lar\u0131n\u0131n g\u00fc\u00e7l\u00fc yeteneklerinden faydalanarak nesne depolama i\u015flemlerini C++ uygulamalar\u0131m\u0131za entegre etmenin ne kadar kolay oldu\u011funu g\u00f6rd\u00fck. Gerekli \u00f6nko\u015fullar\u0131n haz\u0131rlanmas\u0131ndan, AWS C++ SDK's\u0131n\u0131n kurulmas\u0131na, kimlik do\u011frulama ve endpoint yap\u0131land\u0131rmas\u0131na, nihayetinde pratik bir dosya y\u00fckleme \u00f6rne\u011fi sunmaya kadar t\u00fcm ad\u0131mlar\u0131 detayland\u0131rd\u0131k.<\/p>\n<p>Ayr\u0131ca, b\u00fcy\u00fck dosyalar i\u00e7in <code>TransferManager<\/code> kullan\u0131m\u0131, sa\u011flam hata y\u00f6netimi, g\u00fcvenlik en iyi uygulamalar\u0131 ve performans ipu\u00e7lar\u0131 gibi geli\u015fmi\u015f konulara da de\u011findik. Bu bilgiler, sadece temel bir y\u00fckleme i\u015flevselli\u011fi sa\u011flamakla kalmay\u0131p, ayn\u0131 zamanda \u00fcretim ortamlar\u0131nda g\u00fcvenilir, \u00f6l\u00e7eklenebilir ve performansl\u0131 uygulamalar geli\u015ftirmenize yard\u0131mc\u0131 olacakt\u0131r. AWS C++ SDK, d\u00fc\u015f\u00fck seviyeli kontrol ve y\u00fcksek performans gerektiren C++ uygulamalar\u0131 i\u00e7in g\u00fc\u00e7l\u00fc bir se\u00e7enektir ve DigitalOcean Spaces gibi S3 uyumlu hizmetlerle sorunsuz bir entegrasyon sunar. Bu k\u0131lavuzun, C++ projelerinizde bulut tabanl\u0131 nesne depolama \u00e7\u00f6z\u00fcmlerini kullanman\u0131z i\u00e7in sa\u011flam bir temel olu\u015fturdu\u011funu umuyoruz.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"AWS C++ SDK Kullanarak DigitalOcean Spaces&#8217;e Dosya Y\u00fckleme\nGiri\u015f\nG\u00fcn\u00fcm\u00fcz\u00fcn bulut tabanl\u0131 uygulamalar\u0131nda veri depolama, kritik bir bile\u015fendi","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":[1406],"tags":[],"class_list":{"0":"post-36195","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-aws","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>AWS C++ SDK Kullanarak DigitalOcean Spaces&#039;e Dosya Y\u00fckleme - 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\/aws-c-sdk-kullanarak-digitalocean-spacese-dosya-yukleme\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"AWS C++ SDK Kullanarak DigitalOcean Spaces&#039;e Dosya Y\u00fckleme\" \/>\n<meta property=\"og:description\" content=\"AWS C++ SDK Kullanarak DigitalOcean Spaces&#039;e Dosya Y\u00fckleme Giri\u015f G\u00fcn\u00fcm\u00fcz\u00fcn bulut tabanl\u0131 uygulamalar\u0131nda veri depolama, kritik bir bile\u015fendi\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/aws-c-sdk-kullanarak-digitalocean-spacese-dosya-yukleme\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-10T00:41:02+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=\"9 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/aws-c-sdk-kullanarak-digitalocean-spacese-dosya-yukleme\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/aws-c-sdk-kullanarak-digitalocean-spacese-dosya-yukleme\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"AWS C++ SDK Kullanarak DigitalOcean Spaces&#8217;e Dosya Y\u00fckleme\",\"datePublished\":\"2025-12-10T00:41:02+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/aws-c-sdk-kullanarak-digitalocean-spacese-dosya-yukleme\/\"},\"wordCount\":2234,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"AWS\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/aws-c-sdk-kullanarak-digitalocean-spacese-dosya-yukleme\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/aws-c-sdk-kullanarak-digitalocean-spacese-dosya-yukleme\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/aws-c-sdk-kullanarak-digitalocean-spacese-dosya-yukleme\/\",\"name\":\"AWS C++ SDK Kullanarak DigitalOcean Spaces'e Dosya Y\u00fckleme - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-10T00:41:02+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/aws-c-sdk-kullanarak-digitalocean-spacese-dosya-yukleme\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/aws-c-sdk-kullanarak-digitalocean-spacese-dosya-yukleme\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/aws-c-sdk-kullanarak-digitalocean-spacese-dosya-yukleme\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"AWS C++ SDK Kullanarak DigitalOcean Spaces&#8217;e Dosya Y\u00fckleme\"}]},{\"@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":"AWS C++ SDK Kullanarak DigitalOcean Spaces'e Dosya Y\u00fckleme - 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\/aws-c-sdk-kullanarak-digitalocean-spacese-dosya-yukleme\/","og_locale":"tr_TR","og_type":"article","og_title":"AWS C++ SDK Kullanarak DigitalOcean Spaces'e Dosya Y\u00fckleme","og_description":"AWS C++ SDK Kullanarak DigitalOcean Spaces'e Dosya Y\u00fckleme Giri\u015f G\u00fcn\u00fcm\u00fcz\u00fcn bulut tabanl\u0131 uygulamalar\u0131nda veri depolama, kritik bir bile\u015fendi","og_url":"https:\/\/fatihsoysal.com\/blog\/aws-c-sdk-kullanarak-digitalocean-spacese-dosya-yukleme\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-10T00:41:02+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"9 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/aws-c-sdk-kullanarak-digitalocean-spacese-dosya-yukleme\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/aws-c-sdk-kullanarak-digitalocean-spacese-dosya-yukleme\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"AWS C++ SDK Kullanarak DigitalOcean Spaces&#8217;e Dosya Y\u00fckleme","datePublished":"2025-12-10T00:41:02+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/aws-c-sdk-kullanarak-digitalocean-spacese-dosya-yukleme\/"},"wordCount":2234,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["AWS"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/aws-c-sdk-kullanarak-digitalocean-spacese-dosya-yukleme\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/aws-c-sdk-kullanarak-digitalocean-spacese-dosya-yukleme\/","url":"https:\/\/fatihsoysal.com\/blog\/aws-c-sdk-kullanarak-digitalocean-spacese-dosya-yukleme\/","name":"AWS C++ SDK Kullanarak DigitalOcean Spaces'e Dosya Y\u00fckleme - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-10T00:41:02+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/aws-c-sdk-kullanarak-digitalocean-spacese-dosya-yukleme\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/aws-c-sdk-kullanarak-digitalocean-spacese-dosya-yukleme\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/aws-c-sdk-kullanarak-digitalocean-spacese-dosya-yukleme\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"AWS C++ SDK Kullanarak DigitalOcean Spaces&#8217;e Dosya Y\u00fckleme"}]},{"@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\/36195","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=36195"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36195\/revisions"}],"predecessor-version":[{"id":36196,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36195\/revisions\/36196"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=36195"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=36195"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=36195"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}