asp.net-core-webapiaws-sdkcloudflarecloudflare-r2

Problem uploading files to cloudflare r2 with ASP.NET Core Web API


I want to make a small API, but I could not solve the problem.

I created a simple ASP.NET Core Web API project. I'm trying to upload files to cloudflare r2 using AWSSDK but I'm getting an error.

Code:

using Amazon.Runtime;
using Amazon.S3;
using Amazon.S3.Model;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Infrastructure;

namespace xxx.API.Controllers
{
    [ApiController]
    [Route("api/[controller]")]
    [AllowAnonymous]
    public class CloudflareR2Controller
    {
        private readonly IAmazonS3 _s3Client;

        public CloudflareR2Controller(IConfiguration configuration)
        {
            string accessKeyId = "aaa";
            string secretAccessKey = "bbb";
            string serviceUrl = "https://ccc.r2.cloudflarestorage.com";
            AWSCredentials credentials = new BasicAWSCredentials(accessKeyId, secretAccessKey);
            AmazonS3Config config = new AmazonS3Config
            {
                ServiceURL = serviceUrl

            };
            _s3Client = new AmazonS3Client(credentials, config);
        }

        [HttpPut("objects/{bucketName}")]
        public async Task<IActionResult> UploadObject(string bucketName, [FromBody] string filePath)
        {
            try
            {
                PutObjectRequest request = new PutObjectRequest
                {
                    FilePath = @filePath,
                    BucketName = bucketName,
                    ServerSideEncryptionMethod = ServerSideEncryptionMethod.AES256
                };

                PutObjectResponse response = await _s3Client.PutObjectAsync(request);

                Console.WriteLine("ETag: {0}", response.ETag);
                //await _cloudflareR2Client.UploadObject(filePath, bucketName);
                return Ok(response);
            }
            catch (Exception ex)
            {
                return StatusCode(500, "Error: " + ex.Message);
            }
        }

        private IActionResult StatusCode(int v1, string v2)
        {
            throw new NotImplementedException();
        }

        [HttpGet]
        public virtual OkObjectResult Ok([ActionResultObjectValue] object? value)
        => new OkObjectResult(value);

        [HttpGet("presigned-url/{bucketName}/{objectKey}")]
        public IActionResult GeneratePresignedUrl(string bucketName, string objectKey)
        {
            try
            {
                //_cloudflareR2Client.GeneratePresignedUrl(bucketName, objectKey);
                return Ok(bucketName);
            }
            catch (Exception ex)
            {
                return StatusCode(500, "Error: " + ex.Message);
            }
        }

    }
}

1st problem in this code:

"STREAMING-AWS4-HMAC-SHA256-PAYLOAD not implemented"

To fix this issue I am editing the following code:

PutObjectRequest request = new PutObjectRequest
                 {
                     FilePath = @filePath,
                     bucketName = bucketName,
                     DisablePayloadSigning=true, //new code
                     ServerSideEncryptionMethod = ServerSideEncryptionMethod.AES256
                 };

This time I get another error:

{Please use "STREAMING-AWS4-HMAC-SHA256-PAYLOAD"}

I couldn't solve the problem. Anyone have an idea or an alternative solution?


Solution

  • You're receiving the {Please use STREAMING-AWS4-HMAC-SHA256-PAYLOAD} error because Cloudflare doesn't support Streaming SigV4.

    DisablePayloadSigning = true must be passed as Cloudflare R2 does not currently support the Streaming SigV4 implementation used by AWSSDK.S3.

    To resolve this, remove ServerSideEncryptionMethod = ServerSideEncryptionMethod.AES256

    For further guidance, check out the Cloudflare R2 Asp.net Examples page.