ASP.NET कोर वेब एपीआई से AWS S3 में बहु-जीबी फ़ाइल स्ट्रीम करें



amazon-web-services amazon-s3 (1)

ऐसे स्थितियों के लिए एडब्ल्यूएस डॉक्स दो विकल्प प्रदान करता है:

हाई-स्तरीय एपीआई आपको केवल एक PartSize निर्दिष्ट के साथ एक TransferUtilityUploadRequest PartSize बनाने के लिए सुझाव देता है, इसलिए क्लास स्वयं ही अपने द्वारा अपलोड को बनाए रखने की आवश्यकता के बिना फ़ाइल अपलोड कर सकता है। इस मामले में आप StreamTransferProgress इवेंट के लिए सदस्यता लेने के साथ मल्टीपार्ट अपलोड पर प्रगति प्राप्त कर सकते हैं। आप एक फ़ाइल, एक स्ट्रीम या एक निर्देशिका अपलोड कर सकते हैं

निम्न स्तरीय एपीआई , जाहिर है, अधिक जटिल है, लेकिन अधिक लचीला है - आप अपलोड आरंभ कर सकते हैं, और इसके बाद आप किसी लूप में किसी फ़ाइल के अगले हिस्से को अपलोड कर सकते हैं। प्रलेखन से नमूना कोड:

var s3Client = new AmazonS3Client(Amazon.RegionEndpoint.USEast1);

// List to store upload part responses.
var uploadResponses = new List<UploadPartResponse>();

// 1. Initialize.
var initiateRequest = new InitiateMultipartUploadRequest
    {
        BucketName = existingBucketName,
        Key = keyName
    };

var initResponse = s3Client.InitiateMultipartUpload(initRequest);

// 2. Upload Parts.
var contentLength = new FileInfo(filePath).Length;
var partSize = 5242880; // 5 MB

try
{
    long filePosition = 0;
    for (var i = 1; filePosition < contentLength; ++i)
    {
        // Create request to upload a part.
        var uploadRequest = new UploadPartRequest
            {
                BucketName = existingBucketName,
                Key = keyName,
                UploadId = initResponse.UploadId,
                PartNumber = i,
                PartSize = partSize,
                FilePosition = filePosition,
                FilePath = filePath
            };

       // Upload part and add response to our list.
       uploadResponses.Add(s3Client.UploadPart(uploadRequest));

       filePosition += partSize;
   }

   // Step 3: complete.
   var completeRequest = new CompleteMultipartUploadRequest
       {
           BucketName = existingBucketName,
           Key = keyName,
           UploadId = initResponse.UploadId,
        };

   // add ETags for uploaded files
   completeRequest.AddPartETags(uploadResponses);

   var completeUploadResponse = s3Client.CompleteMultipartUpload(completeRequest);     
}
catch (Exception exception)
{
    Console.WriteLine("Exception occurred: {0}", exception.ToString());
    var abortMPURequest = new AbortMultipartUploadRequest
        {
            BucketName = existingBucketName,
            Key = keyName,
            UploadId = initResponse.UploadId
        };
    s3Client.AbortMultipartUpload(abortMPURequest);
}

UploadPart का असिंक्रोनस संस्करण भी उपलब्ध है, इसलिए आपको उस रास्ते की जांच करनी चाहिए, अगर आपको अपने अपलोड के लिए पूर्ण नियंत्रण की आवश्यकता हो।

मैं एएसपी.नेट कोर वेब एपीआई से एडब्ल्यूएस एस 3 बाल्टी में एक बड़ी (बहु-जीबी) फाइल बनाना चाहता हूं। फ़ाइल पर्याप्त रूप से बड़ी है कि मैं Stream को स्मृति में लोड करने से पहले उसे AWS S3 अपलोड करने के लिए नहीं चाहता।

PutObjectAsync() का उपयोग करना मुझे PutObjectAsync() एसडीके को पास करने से पहले Stream को पहले से पॉप्युलेट करने के लिए मजबूर कर दिया गया है, जो नीचे सचित्र है:

var putObjectRequest = new PutObjectRequest
{
    BucketName = "my-s3-bucket",
    Key = "my-file-name.txt",
    InputStream = stream
};
var putObjectResponse = await amazonS3Client.PutObjectAsync(putObjectRequest);

मेरे आदर्श पैटर्न में एडब्ल्यूएस एसडीके को एक StreamWriter (प्रकार की) लौटाने के लिए मैं कई बार Write() सकता हूं और फिर जब मेरा काम पूरा करता हूं तो Finalise()

मेरी चुनौती से संबंधित दो प्रश्न:

  • क्या मैं PutObjectAsync() को कॉल करने से पहले Stream को पूर्व-पॉप्यूलेट करने के बारे में गलत तरीके से जानता हूं?
  • मेरी बड़ी (बहु-जीबी) फ़ाइल अपलोड करने के बारे में मुझे कैसे जाना चाहिए?




.net-core