El objetivo del desarrollo es subir un archivo de gran tamaño a bucket S3 de AWS.

Lo voy a realizar utilizando una aplicación creada en .Net #C que se encargará de realizar una carga multiparte del archivo que deseemos, el cual se irá subiendo poco a poco hasta completar la carga en el bucket S3.

Pasos para su realización

En primer lugar instalaremos al proyecto los siguientes Nuget packages: AWSSDK.Extensions.NETCore.Setup, AWSSDK.S3 y AWSSDK.Transfer. Si trabajamos en local tendremos que iniciar sesión mediante la consola con un usuario que pueda manejar un bucket S3, y si esta desplegado en AWS tendremos que darle permisos a la máquina para que pueda manejar un bucket S3.

Después crearemos una clase propia para realizar la subida, en mi caso la he llamado «SubidaMultiple». Tiene las propiedades del nombre del bucket, la región del bucket con un objeto de la clase «RegionEndpoint» y un objeto cliente de S3 que pertenece a la clase «IAmazonS3».

En nuestra clase «SubidaMultiple» tendrá un método asíncrono para subir los objetos al bucket con carga multiparte que he llamado «UploadFileAsync». En él crearemos el cliente del S3 con el bucket. Una vez lo tengamos, creamos un objeto de la clase «TransferUtility» a partir del cliente del S3.

Seguidamente, invocamos al método asíncrono «UploadAsync» del objeto que hemos creado con la clase «TransferUtility», al cual le pasaremos por parámetros un objeto de la clase «Stream» que contendrá el contenido del archivo a subir, el nombre del bucket y el nombre con el que queremos que se guarde en el bucket.

A continuación, en nuestro controlador crearemos una acción asíncrona en la que recoge el archivo mediante una petición «HttpPost». Una vez tenemos el archivo lo convertiremos a un objeto de la clase «MemoryStream» y invocaremos al método de subida de archivo llamado «UploadFileAsync» para que suba el archivo al bucket.

Principal problema encontrado

El principal problema que te puedas encontrar es que está limitado el tamaño máximo de archivo a subir, por defecto asigna un tamaño máximo de 28,6 MB.

Para solucionar este problema tendremos que realizar 3 pasos:

  • En el controlador al igual que metemos que es una acción de tipo «HttpPost» como encabezado, también es necesario que posea «DisableRequestSizeLimit».
  • En la clase «Program.cs» tenemos que configurar el Kestrel del builder para que el body de la petición pueda tener el tamaño máximo.
  • En el «web.config» tenemos que modificar los valores de «maxRequestLength» y «maxAllowedContentLength» al tamaño del archivo máximo que queramos subir al bucket. Si el proyecto no tiene la clase «web.config» lo creamos en el proyecto y lo configuramos nosotros mismos.

Documentación


Autor:
Carlos Campayo Serrano

Curso: Desarrollo Web Full Stack, MultiCloud y Multiplataforma

Centro: Tajamar

Año académico: 2020-2021

Código / recursos utilizados / Otros datos de interés: https://github.com/CarlosCampayo/SubidaMultipart.git

LinkedIn: https://www.linkedin.com/in/carlos-campayo/

Leave a Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.