This project is a .NET 8 API application designed to handle file uploads to an Amazon S3 bucket. It prominently features the use of Amazon S3's low-level multipart upload API, enabling large files to be sent in smaller, manageable, and parallelized parts.
-
Multipart Upload: The project leverages Amazon S3's multipart upload approach, designed to improve the speed and reliability of file uploads by breaking them into smaller pieces.
-
Part Management: Each upload is split into multiple "parts" which are sent in parallel to improve upload speed. If any part fails, only that part needs to be resent instead of the entire file.
-
Large File Support: Due to the nature of multipart upload, this project can handle uploading large files which would be unwieldy to send in one go.
This project also utilizes Amazon DynamoDB to persist the state of the upload. This feature allows uploads to be resumed if they fail midway. The current state of the upload is saved in a DynamoDB table, including information about parts that have been uploaded and those yet to be uploaded. This allows for better control and management of uploads, especially for large files that are sent in multiple parts.
Before running the application, several configuration steps and resource setups are required:
-
DynamoDB Table Creation: A DynamoDB table named
UploadState
should be created. This table must have an attribute namedKeyName
that is used as the partition key. -
AWS Bucket Creation: The application requires an AWS S3 Bucket to store uploaded files. Ensure you create a bucket in the AWS S3 service and take note of the bucket name.
-
AWS Credentials Setup: The AWS credentials should be configured in one of the following ways:
- Directly on your machine: Use the AWS CLI with the
aws configure
command.aws configure
- In Docker: Create a
.env
file in the root of your project with all necessary environment variables. These might includeAWS_ACCESS_KEY_ID
,AWS_SECRET_ACCESS_KEY
,AWS_DEFAULT_REGION
,AWS_S3_BUCKET_NAME
, and any other environment-specific variables.
- Directly on your machine: Use the AWS CLI with the
Remember to add .env
to your .gitignore
file to prevent accidentally pushing sensitive information to a public repository.
To run this application on JetBrains Rider:
- Ensure that both the DynamoDB table and the AWS S3 bucket have been created and that the AWS credentials have been configured on your machine.
- Clone the repository to your local development environment.
- Open JetBrains Rider and select
File
>Open
. - Navigate to the project directory and click
OK
. - Once the project is loaded, select
Run
>Start Without Debugging
.
The application should now be running and accessible via localhost. The port number will vary based on your configuration.
To run this application with Docker Compose:
- Ensure that the
.env
file is located at the root of your project directory for Docker to use. - Run the following command to start your application:
docker-compose up
The application should now be accessible on the ports defined in your docker-compose.yml
file.
Este projeto é uma aplicação .NET 8 API desenvolvida para realizar o upload de arquivos para um bucket do Amazon S3. A característica mais notável deste projeto é a utilização da API de upload multipart de nível baixo da Amazon S3, que permite que arquivos de grande porte sejam enviados em partes menores, gerenciáveis e paralelizadas.
-
Upload Multipart: O projeto se beneficia da abordagem de upload multipart da Amazon S3, que é projetada para melhorar a velocidade e a confiabilidade dos uploads, dividindo-os em partes menores.
-
Gerenciamento de Partes: Cada upload é dividido em múltiplas "partes", as quais são enviadas em paralelo para aumentar a velocidade do upload. Caso alguma parte falhe, somente essa parte precisa ser reenviada, ao invés do arquivo completo.
-
Suporte para Arquivos Grandes: Devido à natureza do upload multipart, este projeto é capaz de fazer upload de arquivos grandes, que seriam problemáticos para serem enviados de uma só vez.
Este projeto também utiliza o Amazon DynamoDB para persistir o estado do upload. Esta funcionalidade permite que os uploads sejam retomados caso falhem no meio do processo. O estado atual do upload é salvo em uma tabela do DynamoDB, incluindo informações sobre as partes que já foram enviadas e as que ainda precisam ser enviadas . Isso permite melhor controle e gerenciamento do upload, especialmente para arquivos grandes que são enviados em partes múltiplas.
Antes de executar a aplicação, várias etapas de configuração e definição de recursos são necessárias:
-
Criação de Tabela no DynamoDB: Uma tabela no DynamoDB com o nome de
UploadState
deve ser criada. Esta tabela deve possuir um atributo chamadoKeyName
, que será utilizado como partition key. -
Criação de Bucket AWS: A aplicação precisa de um bucket no AWS S3 para armazenar os arquivos enviados. Certifique-se de criar um bucket no serviço AWS S3 e anote o nome do bucket.
-
Configuração de Credenciais AWS: As credenciais AWS devem ser configuradas de uma das seguintes formas:
- Diretamente na sua máquina: Use a CLI da AWS com o comando
aws configure
.
aws configure
- No Docker: Crie um arquivo
.env
na raiz do seu projeto com todas as variáveis de ambiente necessárias. Estas podem incluirAWS_ACCESS_KEY_ID
,AWS_SECRET_ACCESS_KEY
,AWS_DEFAULT_REGION
,AWS_S3_BUCKET_NAME
e quaisquer outras variáveis específicas do ambiente.
- Diretamente na sua máquina: Use a CLI da AWS com o comando
Lembre-se de adicionar .env
ao seu arquivo .gitignore
para evitar publicar informações sensíveis em um repositório público acidentalmente.
Para rodar esta aplicação no JetBrains Rider:
- Certifique-se que a tabela DynamoDB e o bucket AWS S3 foram criados e que as credenciais da AWS foram configuradas em sua máquina.
- Clone o repositório para o seu ambiente de desenvolvimento local.
- Abra o JetBrains Rider e selecione
File
>Open
. - Navegue até o diretório do projeto e clique em
OK
. - Assim que o projeto for carregado, selecione
Run
>Start Without Debugging
.
A aplicação deve estar rodando e acessível por meio do localhost. O número do porto variará conforme sua configuração.
Para rodar esta aplicação com Docker Compose:
- Certifique-se que o arquivo
.env
está localizado na raiz do diretório do seu projeto para ser usado pelo Docker. - Execute o seguinte comando para iniciar sua aplicação:
docker-compose up
A aplicação agora deve estar acessível nas portas definidas no seu arquivo docker-compose.yml
.