Introducción
Contenido
Muchos de los software y aplicaciones web que creamos hoy requieren algún tipo de alojamiento de archivos: imágenes, facturas, archivos de audio, etc. La forma tradicional de almacenar archivos era simplemente guardarlos en el disco duro del servidor. Sin embargo, existen limitaciones para guardar archivos en el disco duro del servidor, no poder escalar, tener que asignar espacio antes de su uso y precios mucho más altos / inflexibles. Sin mencionar que si solicita una gran cantidad de imágenes (potencialmente grandes), pueden ejercer presión sobre el servidor.
Para descargar los servidores, los desarrolladores comenzaron a alojar archivos con proveedores de almacenamiento como AWS S3, Almacenamiento en la nube de Googleetc.
En este artículo, le mostraremos cómo escribir código Node.js para cargar archivos en S3.
¿Qué es S3?
S3, o Simple Storage Service, es un servicio de almacenamiento en la nube proporcionado por Amazon Web Services (AWS). Con S3, no puede alojar ningún número de archivos y solo paga por lo que usa.
S3 proporciona alojamiento multirregional a los clientes según su región y, por lo tanto, pueden servir los archivos solicitados rápidamente y sin demora.
Establecer el entorno
Credenciales de AWS
Para comenzar, primero debe generar las credenciales de clave de acceso de seguridad de AWS. Para hacerlo, inicie sesión en su Consola de administración de AWS.
Te puede interesar:Git: presione sucursal local y realice un seguimientoHaga clic en su nombre de usuario:
Luego seleccione Claves de acceso -> Crear nueva clave de acceso:
Luego puede copiar el ID de la clave de acceso y la Clave de acceso secreta de esta ventana o puede descargarla como .CSV
archivo:
Crear un depósito de S3
Ahora creemos un AWS S3 Bucket con el acceso adecuado. Podemos hacer esto usando la consola de administración de AWS o por Node.js.
Para crear un bucket de S3 con la consola de administración, vaya al servicio S3 seleccionándolo en el menú de servicio:
Seleccione «Crear depósito» e introduzca el nombre de su depósito y la región en la que desea alojar su depósito. Si ya sabe de qué región vendrá la mayoría de los usuarios, tiene sentido elegir una región lo más cercana posible a la suya. Esto asegurará que los archivos del servidor se sirvan en un mejor período de tiempo.
El nombre que elija para su depósito debe tener un nombre único entre todos los usuarios de AWS, así que pruebe con uno nuevo si el nombre no está disponible:
Te puede interesar:Git: agregar un mensaje dedicadoSiga el asistente y configure los permisos y otras configuraciones según sus necesidades.
Para crear el depósito con Node.js, primero necesitaremos configurar nuestro entorno de desarrollo.
Entorno de desarrollo
Así que ahora comencemos con nuestro ejemplo configurando un nuevo proyecto Node.js:
$ npm init
Para comenzar a utilizar cualquier servicio en la nube de AWS en Node.js, debemos instalar el AWS SDK (System Development Kit).
Instálelo usando su administrador de paquetes favorito; usaremos npm
:
$ npm i --save aws-sdk
Implementación
Crear un depósito de S3
Si ya ha creado un depósito manualmente, puede omitir esta sección. Pero si no es así, creemos un archivo, digamos, create-bucket.js
en el directorio de su proyecto.
Importar el aws-sdk
biblioteca para acceder a su depósito S3:
const AWS = require('aws-sdk');
Ahora, definamos tres constantes para el almacenamiento ID
, SECRET
y BUCKET_NAME
. Estos se utilizan para identificar y acceder a nuestro depósito:
// Enter copied or downloaded access ID and secret key here
const ID = '';
const SECRET = '';
// The name of the bucket that you have created
const BUCKET_NAME = 'test-bucket';
Ahora necesitamos iniciar la interfaz S3 ejecutando nuestras claves de acceso:
const s3 = new AWS.S3({
accessKeyId: ID,
secretAccessKey: SECRET
});
Con la interfaz S3 iniciada correctamente, podemos seguir adelante y crear el depósito:
const params = {
Bucket: BUCKET_NAME,
CreateBucketConfiguration: {
// Set your region here
LocationConstraint: "eu-west-1"
}
};
s3.createBucket(params, function(err, data) {
if (err) console.log(err, err.stack);
else console.log('Bucket Created Successfully', data.Location);
});
En este punto, podemos ejecutar el código y probar si el depósito se crea en la nube:
$ node create-bucket.js
Si la ejecución del código es exitosa, debería ver el mensaje de éxito, seguido de la dirección del depósito en el resultado:
Bucket Created Successfully http://test-bucket-2415soig.s3.amazonaws.com/
Puede visitar su panel S3 y asegurarse de que el depósito esté creado:
Para obtener una lista completa de regiones y otros parámetros, consulte la documentación oficial.
Te puede interesar:Git: una introducción para principiantesCarga de archivos
En este punto, implementemos la función de carga de archivos. En un archivo nuevo, p. Ej. upload.js
, importación del aws-sdk
biblioteca para acceder a su bucket de S3 y al fs
módulo para leer archivos de su computadora:
const fs = require('fs');
const AWS = require('aws-sdk');
Necesitamos definir tres constantes para el almacenamiento ID
, SECRET
y BUCKET_NAME
e inicie el cliente S3 como lo hicimos antes.
Ahora, creemos una función que acepte fileName
parámetro, indicando el archivo que queremos subir:
const uploadFile = (fileName) => {
// Read content from the file
const fileContent = fs.readFileSync(fileName);
// Setting up S3 upload parameters
const params = {
Bucket: BUCKET_NAME,
Key: 'cat.jpg', // File name you want to save as in S3
Body: fileContent
};
// Uploading files to the bucket
s3.upload(params, function(err, data) {
if (err) {
throw err;
}
console.log(`File uploaded successfully. ${data.Location}`);
});
};
Antes de cargar el archivo, necesitamos leer su contenido como un búfer. Después de leerlo, podemos definir los parámetros necesarios para la carga de archivos, por ejemplo Bucket
, Key
y Body
.
Además de estos tres parámetros, existe una larga lista de otros parámetros opcionales. Para tener una idea de lo que puede definir para un archivo durante la carga, aquí hay algunos útiles:
StorageClass
: Defina la clase para la que desea almacenar el objeto. S3 está destinado a proporcionar un servicio de archivos rápido. Pero cuando no se accede a los archivos con frecuencia, puede utilizar una clase de almacenamiento diferente. Por ejemplo, si tiene archivos que no son muy relevantes, puede almacenarlos en «S3 Glacier Storage» donde el precio es muy bajo en comparación con «S3 Standard Storage». Pero tomará más tiempo acceder a esos archivos en caso de que lo necesite y está cubierto por un acuerdo de nivel de servicio diferente.ContentType
: Establece el tipo de imagen MIME. El tipo predeterminado es «binary / octet-stream». Un tipo MIME como «image / jpeg» ayudará a los navegadores y otros clientes HTTP a identificar el tipo de archivo.ContentLength
: Establezca el tamaño del cuerpo en bytes, lo que resulta útil si el tamaño del cuerpo no se puede determinar automáticamente.ContentLanguage
: Establezca este parámetro para definir en qué idioma está el contenido. Esto también ayudará a los clientes HTTP a identificar o transferir el contenido.
Don Bucket
, usaremos nuestro nombre de depósito, pero para el Key
parámetro agregaremos el nombre del archivo que queremos guardar como, y para Body
parámetro, usaremos fileContent
.
Una vez hecho esto, podemos subir cualquier archivo reenviando el nombre del archivo a la función:
Te puede interesar:Obtenga HTTP POST Body en Express.jsuploadFile('cat.jpg');
Puede sustituir «cat.jpg» por un nombre de archivo en el mismo directorio que el código, la ruta de archivo relativa o la ruta de archivo completa.
En este punto, podemos ejecutar el código y probar si funciona:
$ node upload.js
Si todo está bien, debería ver una salida similar a la que se muestra a continuación con un enlace a su archivo, que está almacenado allí. data.Location
:
File uploaded successfully. https://test-bucket-1242tsr.s3.ap-northeast-2.amazonaws.com/cat.jpg
Si hay algún error, también debería mostrarse en la consola.
Además, puede ir a su depósito en la Consola de administración de AWS y asegurarse de que el archivo esté cargado.
Conclusión
Para descargar nuestros servidores de aplicaciones, los desarrolladores tienen una excelente opción para alojar archivos utilizando proveedores de almacenamiento como AWS S3, Google Cloud Storage, etc. Hemos creado una aplicación Node.js muy simple que maneja la carga de archivos a S3 usando su interfaz a través del aws-sdk
módulo.
Según sus necesidades, puede configurar el acceso público a su depósito o archivos mientras usa la consola.
Te puede interesar:Uso de la gestión y mitigación de riesgos en el desarrollo webSi te gusta jugar con el código, como de costumbre, puedes conseguirlo en GitHub y esta esencia.