Проблема при попытке загрузки файла в s3 bucket cloud.ru evolution?
Проблема при попытки загрузки файла в s3 bucket cloud.ru evolution. С#
С бакетом все нормально, подключился к нему через cyberduck. С самого начала начались проблемы, т.к сервис не имеет полной документации для .нет и ссылается на документацию амазон, которая не работает. Пробовал несколько схем авторизации, которые подсказывали в поддержки, сейчас использую tenant:access, secret-key.
Сейчас ближе всего, т.к происходит соединение, но появилась ошибка об отсутствии такого бакета Amazon.S3.AmazonS3Exception: Specified bucket does not exist
. Может у кого-то есть опыт работы с этой технологией, буду очень благодарен за любую помощь.
Прежде чем работать с кодом, вы добились работы с хранилищем через awscli или s3cmd?
Очень помогает - у вас под рукой будут готовы и рабочие конфиги подключения.
Михаил Р.,
using Microsoft.AspNetCore.Mvc;
using AutoMapper;
using Microsoft.AspNetCore.Http;
using Amazon.S3;
using Amazon.S3.Model;
using Amazon;
using Amazon.Runtime;
using filer_sharing_api.Models;
using System.IO;
namespace filer_sharing_api.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class BucketController : Controller
{
private readonly IAmazonS3 _s3Client;
//AmazonS3Client initialization
public BucketController(S3Client s3Client)
{
if (string.IsNullOrEmpty(s3Client.AccessKeyId) || string.IsNullOrEmpty(s3Client.SecretAccessKey) || s3Client.BucketRegion == null)
{
throw new Exception("wrong credits in s3Client");
}
_s3Client = new AmazonS3Client(s3Client.AccessKeyId, s3Client.SecretAccessKey, s3Client.configsS3);
}
///
/// Shows how to upload a file from the local computer to an Amazon S3
/// bucket.
///
/// An initialized Amazon S3 client object.
/// The Amazon S3 bucket to which the object
/// will be uploaded.
/// The object to upload.
/// The path, including file name, of the object
/// on the local computer to upload.
/// A boolean value indicating the success or failure of the
/// upload procedure.
[HttpPut("/sendfile")]
public async Task UploadFileAsync(
//deleted IS3Clent parameter
string bucketName,
string objectName,
string filePath)
{
var request = new PutObjectRequest
{
BucketName = bucketName,
Key = objectName,
FilePath = filePath,
};
//using _s3Client patameter as default
var response = await _s3Client.PutObjectAsync(request);
if (response.HttpStatusCode == System.Net.HttpStatusCode.OK)
{
Console.WriteLine($"Successfully uploaded {objectName} to {bucketName}.");
return true;
}
else
{
Console.WriteLine($"Could not upload {objectName} to {bucketName}.");
return false;
}
}
}
}
код для подключения взят из документации cloud.ru. Kод для отправки файла из документации aws, ссылку на которую указана в документации cloud.ru
ошибка:
Amazon.S3.AmazonS3Exception: Specified bucket does not exist
---> Amazon.Runtime.Internal.HttpErrorResponseException: Exception of type 'Amazon.Runtime.Internal.HttpErrorResponseException' was thrown.
at Amazon.Runtime.HttpWebRequestMessage.ProcessHttpResponseMessage(HttpResponseMessage responseMessage)
at Amazon.Runtime.HttpWebRequestMessage.GetResponseAsync(CancellationToken cancellationToken)
at Amazon.Runtime.Internal.HttpHandler`1.InvokeAsync[T](IExecutionContext executionContext)
at Amazon.Runtime.Internal.RedirectHandler.InvokeAsync[T](IExecutionContext executionContext)
at Amazon.Runtime.Internal.Unmarshaller.InvokeAsync[T](IExecutionContext executionContext)
at Amazon.S3.Internal.AmazonS3ResponseHandler.InvokeAsync[T](IExecutionContext executionContext)
at Amazon.Runtime.Internal.ErrorHandler.InvokeAsync[T](IExecutionContext executionContext)
--- End of inner exception stack trace ---
at Amazon.Runtime.Internal.HttpErrorResponseExceptionHandler.HandleExceptionStream(IRequestContext requestContext, IWebResponseData httpErrorResponse, HttpErrorResponseException exception, Stream responseStream)
at Amazon.Runtime.Internal.HttpErrorResponseExceptionHandler.HandleExceptionAsync(IExecutionContext executionContext, HttpErrorResponseException exception)
at Amazon.Runtime.Internal.ExceptionHandler`1.HandleAsync(IExecutionContext executionContext, Exception exception)
at Amazon.Runtime.Internal.ErrorHandler.ProcessExceptionAsync(IExecutionContext executionContext, Exception exception)
at Amazon.Runtime.Internal.ErrorHandler.InvokeAsync[T](IExecutionContext executionContext)
at Amazon.Runtime.Internal.CallbackHandler.InvokeAsync[T](IExecutionContext executionContext)
at Amazon.Runtime.Internal.Signer.InvokeAsync[T](IExecutionContext executionContext)
at Amazon.S3.Internal.S3Express.S3ExpressPreSigner.InvokeAsync[T](IExecutionContext executionContext)
at Amazon.Runtime.Internal.EndpointDiscoveryHandler.InvokeAsync[T](IExecutionContext executionContext)
at Amazon.Runtime.Internal.EndpointDiscoveryHandler.InvokeAsync[T](IExecutionContext executionContext)
at Amazon.Runtime.Internal.CredentialsRetriever.InvokeAsync[T](IExecutionContext executionContext)
at Amazon.Runtime.Internal.RetryHandler.InvokeAsync[T](IExecutionContext executionContext)
at Amazon.Runtime.Internal.RetryHandler.InvokeAsync[T](IExecutionContext executionContext)
at Amazon.Runtime.Internal.CallbackHandler.InvokeAsync[T](IExecutionContext executionContext)
at Amazon.Runtime.Internal.CallbackHandler.InvokeAsync[T](IExecutionContext executionContext)
at Amazon.S3.Internal.AmazonS3ExceptionHandler.InvokeAsync[T](IExecutionContext executionContext)
at Amazon.Runtime.Internal.ErrorCallbackHandler.InvokeAsync[T](IExecutionContext executionContext)
at Amazon.Runtime.Internal.MetricsHandler.InvokeAsync[T](IExecutionContext executionContext)
at filer_sharing_api.Controllers.BucketController.UploadFileAsync(String bucketName, String objectName, String filePath) in D:\folder\file-sharing-api\Controllers\BucketController.cs:line 57
Привет! У меня была точно такая же проблема и решил ее методом перебора :)
я работаю в ruby on rails и там нужно прописать конфиг подключения к хранилищу.
Я уверен что все прописывал правильно, но возникала та же ошибка что и у тебя.
В итоге, у амазона есть обязательный параметр bucket. по логике я думал что нужно прописать название своего созданного бакета, а на самом деле нужно просто написать s3 и тогда все заработает.
Далее мой конфиг, который меня спас! Очень надеюсь что поможет!