فرآیند آپلود بهصورت Multi-Part
اگر شما بخواهید یک فایل با حجم بالا رو آپلود کنید باید اون رو به تکه های کوچک تر بشکنید. آستانه ی حجم برای آپلود در یک تک ریکوست، سمت کلاستر استوریج ستون 5GB هست، اما ممکنه کلاینت یا sdk ای که برای آپلود استفاده میکنید تنظیماتی برای ماکزیمم سایز آپلود سینگل داشته باشن، و اگر شما فایلی بزرگ تر از اون سایز برای آپلود بهش بدید، خودشون آپلود رو تبدیل به آپلود مالتی پارت میکنن. اما اگر بخواید آپلود مالتی پارت رو بطور دلخواه و دستی انجام بدید اول فایلتون رو به چندین chunk تقسیم میکنید و سپس احتیاج به ۳ مدل ریکوست دارید:
createMultiPartUpload:
یک ریکوست POST که یک آپلود خالی میسازه و به شما UploadId برمیگردونه. این id رو در ادامه استفاده میکنید.
https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html
UploadPart:
چندین ریکوست PUT که با استفاده از این نوع ریکوست شما chunk هایی که جدا کردید رو آپلود میکنید. این ریکوست به پارامتر UploadId که از ریکوست قبلی میاد و پارامتر partNumber احتیاج داره که بدونه این چانک تکه ی چندم از آپلود شماست. این ریکوست همچنین بعد از اتمام آپلود کردن چانک یک Etag برمیگردونه که Etag های مربوط به هر PartNumber رو لازمه نگهداری کنید.
داک رسمی و جزییات ریکوست:
https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html
CompleteMultiPartUpload:
یک ریکوست POST، بعد از اینکه همه ی پارت هارو UploadPart کردید برای اتمام آپلود لازمه که این ریکوست احتیاج به UploadId و یک لیست از همه ی پارت های آپلود شده که هر المنت لیست PartNumber و Etag اون پارت هست داره.
داک رسمی و جزییات ریکوست:
https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html
اگر در حین آپلود خواستید آپلود رو ابورت کنید باید از ریکوست AbortMultiPartUpload استفاده کنید (که بعد از اون دیگه با UploadId سابق آپلود جدیدی نمیتونید انجام بدید:
برای اینکه بتوانیم فایلهای بزرگ را بر روی S3 آپلود کنیم دو راه وجود دارد. اولین راه این است که خود فایلها را آپلود کنیم که این مورد بدون هیچ گونه مشکلی انجام خواهد شد و در صورتی که آپلود با مشکل مواجه شود فضایی از S3 گرفته نمیشود و فایلی آپلود نخواهد شد و هرچیزی که آپلود شده بدون مشکل پاک خواهد شد.
حالت دوم برای آپلود فایل، به این صورت است که کاربر آپلود فایل را بهصورت MultiPart انجام خواهد داد. بهعنوان مثال فایلی با حجم ده گیگ را به ده قسمت یک گیگی تبدیل میکند و هرکدام از قسمتها را بهصورت جدا جدا آپلود میکند. مسئلهای که در آپلود Multi Part در S3 وجود دارد این است که باید پس از اتمام آپلود قسمتها، اطلاع داده شود که آپلود همهی قسمتها کامل شده است در این صورت S3 همهی ده قسمت را به یک آبجکت تبدیل میکند. اگر کامل شدن فرآیند به S3 اطلاع داده نشود، شما ده آبجکت یک گیگی غیرقابل استفاده خواهید داشت. یعنی از حجم باکت شما استفاده میشود ولی در واقعیت شما آن فایل را نخواهید داشت.
برای کامل کردن فرآیند آپلود میتوانید گامهای زیر را طی کنید:
برای اینکه بتوانید لیست آپلودهای Multi Part خود را بگیرید میتوانید از دستور زیر استفاده کنید. دستور زیر همهی آپلودهای Multi Part فعال باکت My-bucket را برای شما لیست میکند.
هنگامی که یک آپلود دچار مشکلی میشود و نیمه کاره میماند باید آن را abort کنید. برای مثال دستور زیر یک آپلود Multi Part برای کلید multipart/01 در باکت my-bucket را abort میکند.
اگر میخواهیم یک آپلود Multi Part را کامل کنیم میتوانیم از دستور زیر استفاده کنید. برای مثال دستور زیر یک آپلود Multi Part برای کلید multipart/01 در باکت my-bucket را کامل میکند.
داک رسمی و جزییات ریکوست:
https://docs.aws.amazon.com/AmazonS3/latest/API/API_AbortMultipartUpload.html
همچنین اگر میخواهید پارت هایی که آپلود شدن اما به هر دلیلی آپلود کامل نشده و ابورت شدن و دستی هم پاک نشدن بطور اتوماتیک بعد از زمان مشخصی پاک بشن میتونید در کانفیگوریشن Lifecycle باکت گزینه ی AbortIncompleteMultipartUpload رو ست کنید. مراجعه شود به داک Lifecycle:
https://sotoon.ir/docs/storage/object-storage/how-to-guides/LifeCycle
آپلود مالتی پارت از طریق Presigned-url :
معمولا زمانی استفاده میشه که شما میخواید آپلود فایل حجیم رو دست کاربر بسپرید و سمت بکند خودتون نیارید اما نمیخواید credentials استوریجتون رو در اختیارشون قرار بدید: