En Amazon existe un servicio llamado S3 (Simple Storage Service) , que es un almacenamiento de objetos para almacenar y recuperar cualquier volumen de datos desde cualquier ubicación. Esto es conveniente para aquellos webs que se encuentren en la nube para almacenar todas las fotos. En este post os enseñaremos como subir imágenes a un S3.

Primero que nada , tenemos que crearnos un usuario IAM y asignarle permisos FullAccess sobre un S3. Descargamos sus credenciales para poder loguearnos posteriormente. Ahora creamos un bucket en S3 y nos guardamos el nombre del bucket.

Ahora creamos un proyecto MVC llamado MVCCoreS3Post. Cuando este le instalamos los siguiente Nuget.

img

Nos dirigimos al fichero appsetting.json y almacenamos el nombre del bucket. Ahora creamos un directorio Services y la clase ServicesAWSS3. Inyectamos las dependencias de IAmazonS3 e Configuration , que son las que usaremos en el servicio. El objeto de la dependencia IAmazonS3 le llame awsclient.

Primero creamos un metodo asíncrono de tipo List<String> que nos de todos los objetos que estén dentro del bucket. Creamos un objeto ListVersionsResponse , llamamos al objeto awsclient y a su funcion ListVersionsAsync pasándole por parametro el nombre la función. Con el objeto de ListVersionsResponse las versiones de todos los objetos pero que solo seleccione su Key ,es decir, el nombre del fichero en el bucket. Lo transformamos a una lista y dicha lista la devolvemos.

ListVersionsResponse listVersions = await this.awsclient.ListVersionsAsync(this.bucketName);
listVersions.Versions.Select(x => x.Key).ToList();

Creamos un metodo asíncrono con una tarea de tipo Stream llamada GetFile, que recibe por parametro el nombre de fichero en el bucket. Creamos un objeto GetObjectResponse , llamamos al objeto awsclient a su función GetObjectAsync pasándole por parámetro el nombre del bucket y el nombre del fichero.

GetObjectResponse response = await this.awsclient.GetObjectAsync(this.bucketName, filename);

Creamos un condicional donde comprobamos que si el objeto encontrado esta bien , es decir, si se ha encontrado en bucket que lo devuelva como un Stream y si no lo encontró como un null.

Ahora viene el método que nos interesa como subir la imagen a un bucket, creamos un método asíncrono de tipo boleano llamado UploadFileinBucket que recibe por parametro un Stream y el nombre del fichero. Ahora creamos un objeto PutObjectRequest , le asignaremos ciertos valores dicho objeto.

PutObjectRequest request = new PutObjectRequest()
{
InputStream = stream,
Key = filename,
BucketName = this.bucketName
};

Ahora creamos un PutObjectResponse ,llamamos al objeto awsclient y su función PutObjectAsync pasándole por parámetro el objeto a PutObjectRequest ,creado anteriormente. Creamos un condicional con el cual comprobamos si se subió bien el fichero al bucket.

En el caso de una imagen que subimos al bucket queremos visualizarla tenemos que irnos al bucket. Nos vamos a los permisos del bucket e editar los Bloquear acceso público para que se pueda acceder de manera externa. Desmarcamos el checkbox Bloquear todo el acceso público y guardamos. Ahora más abajo , modificamos la Política de bucket. Copiamos el ARN que nos aparece y elegimos Generador de políticas que nos abre una nueva ventana para crear políticas para el bucket.

img2

Primero, seleccionamos a que servicio afectara la nueva política en nuestro caso al S3.

img3

Segundo, dejamos por defecto marcado la opción de Allow. En principal escribimos *, con esto decimos que la política afectara a todos los objetos que estén dentro del bucket. En Actions elegimos la opción de GetObject. Ahora pegamos el ARN que anteriormente copiamos y lo pegamos en ARN en sección de ARN, agreagandole al finalzar un bara con un asterisco (ejemplo : arn:aws:s3:::ejemplo/*) .

img4
img5

Tercero, hacemos click sobre Add Statement. Y nos habilitar una opción para generar la política

img6

Cuarto, hacemos click en Generate Policy. Aparece una venta con un json. Copiamos dicho json. Volvemos a la ventana e Editar política del bucket y pegamos el json en política y guardamos cambios.

img7
img8

Con esto nos dejará ver la imágenes si intentamos acceder de manera externa al bucket.

Cambiar el nombre al fichero cuando se suba al bucket

Creamos un método igual anterior para subir un fichero a un bucket pero tiene una pequeña diferencia. Antes de crear el objeto PutObjectRequest, creamos un objeto string con el cual le agreamos un frase o clave y la concatenamos al nombre de la imagen. Cuando creamos el objeto PutObjectRequest, en la Key ponemos el objeto string creado con el cambio del nombre. Y con este pequeño cambio suficiente para cambiar el nombre fichero cuando lo subas al bucket.

String namechange = "prueba" + filename;
PutObjectRequest request = new PutObjectRequest()
{
     InputStream = stream,
     Key = namechange,
     BucketName = this.bucketName
};

Subir un fichero al directorio de un bucket

Creamos un método igual anterior para subir un fichero a un bucket pero tiene una pequeña diferencia. Antes de crear el objeto PutObjectRequest, creamos un objeto string pero en este caso le daremos un formato a al string. Dicho formato primero el formato que tendrá el string , seguido del nombre del directorio y el nombre del fichero. Cuando creamos el objeto PutObjectRequest, en la Key ponemos el objeto string creado con el cambio del nombre. Y con este pequeño cambio suficiente para cambiar el nombre fichero cuando lo subas al bucket.

String fileinDirectory = String.Format("{0}/{1}", "directorio1", filename);
PutObjectRequest request = new PutObjectRequest()
{
       InputStream = stream,
       Key = fileinDirectory,
       BucketName = this.bucketName
};

Bibliografía

Adding A File To AWS S3 Bucket In .NET Core 2.0 : https://www.c-sharpcorner.com/article/net-core-2-0-aws-tutorial-adding-a-file-to-s3-bucket/

How To Upload A File To Amazon S3 Using AWS SDK In MVC : https://www.c-sharpcorner.com/article/how-to-upload-a-file-to-amazon-s3-using-aws-sdk-in-mvc/

Autor/a: Alejandro Navaroli Sallés

Curso: Desarrollo Web Full Stack, MultiCloud y Multiplataforma

Centro: Tajamar

Año académico: 2020-2021

Código de Github: https://github.com/AlexxDan/MvcCoreS3…

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.