پروژه و کدهای مورد استفاده در ویدیوی فوق در اینجا قابل مشاهده و دسترسی هستند.
برای استفاده از Object Storage در برنامههای NET. میتوانید از
پکیج AWSSDK.S3 استفاده کنید که بایستی با دستور زیر، آن را در پروژه خود، نصب کنید:
کپی
dotnet add package AWSSDK.S3
پس از آن، کافیست تا طبق مستندات ایجاد کلید، یک کلید جدید برای باکت خود بسازید.
اطلاعات مربوط به ENDPOINT و نام باکت نیز در صفحه تنظیمات، در بخش دسترسی با SDK،
برای شما قرار گرفته است.
در نهایت نیز، بایستی
اطلاعات مربوط به Object Storage خود را
به متغیرهای محیطی برنامه خود، اضافه کنید؛ به عنوان مثال:
تمامی کارها انجام شده است و میتوانید از Object Storage در برنامه خود، استفاده کنید؛
در ادامه، مثالهایی از نحوه مدیریت فایلها در باکت قرار گرفته است که میتوانید از آنها استفاده کنید.
نمونه کد آپلود فایل
کپی
[HttpPost]
public async Task<IActionResult> UploadFile(IFormFile file)
{
if (file != null && file.Length > 0)
{
using var stream = file.OpenReadStream();
await UploadFileAsync(file.FileName, stream);
}
return RedirectToAction("Index");
}
private async Task UploadFileAsync(string fileName, Stream fileStream)
{
var putRequest = new PutObjectRequest
{
BucketName = _bucketName,
Key = fileName,
InputStream = fileStream
};
await _s3Client.PutObjectAsync(putRequest);
}
public async Task<IActionResult> GeneratePresignedUrl(string fileName)
{
var url = await GeneratePresignedUrlAsync(fileName);
ViewBag.PresignedUrl = url;
return View("Index", await ListFilesAsync());
}
private async Task<string> GeneratePresignedUrlAsync(string fileName)
{
var request = new GetPreSignedUrlRequest
{
BucketName = _bucketName,
Key = fileName,
Expires = System.DateTime.UtcNow.AddHours(1) // URL valid for 1 hour
};
return _s3Client.GetPreSignedURL(request);
}
نمونه کد دریافت لینک موقت دانلود فایل با دامنه اختصاصی
اگر طبق مستندات اتصال دامنه، یک دامنه اختصاصی به باکت خود متصل کردهاید، سادهترین روش برای دریافت لینک موقت (Presigned) با دامنه اختصاصی این است که لینک را با Endpoint اصلی لیارا تولید کنید و سپس مقدار Host آن را به دامنه اختصاصی تغییر دهید.
برای این کار، لینک باید بهصورت virtual-hosted ساخته شود؛ یعنی نام باکت در ابتدای Host قرار بگیرد (مانند bucket-name.storage.c2.liara.site) و نه در مسیر لینک. کلاینت S3 در این مستندات با ForcePathStyle = true ساخته شده است؛ به همین دلیل، در قطعه کد زیر یک کلاینت جداگانه با ForcePathStyle = false برای ساخت لینک ایجاد شده است:
کپی
using Amazon;
using Amazon.Runtime;
using Amazon.S3;
using Amazon.S3.Model;
private static string GenerateCustomDomainPresignedUrl(IConfiguration configuration, string fileName)
{
const string customDomain = "example.com"; // change this to your custom domain
var config = new AmazonS3Config
{
ServiceURL = configuration["LIARA_ENDPOINT_URL"],
ForcePathStyle = false // the bucket name is placed in the host
};
var credentials = new BasicAWSCredentials(
configuration["LIARA_ACCESS_KEY"],
configuration["LIARA_SECRET_KEY"]
);
using var client = new AmazonS3Client(credentials, config);
var request = new GetPreSignedUrlRequest
{
BucketName = configuration["BUCKET_NAME"],
Key = fileName,
Expires = System.DateTime.UtcNow.AddHours(1), // URL valid for 1 hour
Protocol = Protocol.HTTPS
};
var builder = new UriBuilder(client.GetPreSignedURL(request))
{
Host = customDomain
};
return builder.Uri.AbsoluteUri;
}
فقط مقدار host را تغییر دهید و پارامترهای *-X-Amz موجود در لینک را دستکاری نکنید؛ در غیر این صورت امضای لینک نامعتبر میشود و دسترسی به فایل با خطا مواجه خواهد شد.
public async Task<IActionResult> Index()
{
var files = await ListFilesAsync();
return View(files); // Pass the list of files as the Model
}
private async Task<List<string>> ListFilesAsync()
{
var listRequest = new ListObjectsV2Request
{
BucketName = _bucketName
};
var response = await _s3Client.ListObjectsV2Async(listRequest);
var files = new List<string>();
foreach (var entry in response.S3Objects)
{
files.Add(entry.Key);
}
return files;
}
نمونه کد کامل شامل تمامی قابلیتها
در ابتدا، متغیرهای خود را در appsettings.json قرار دهید: