Вступление
Для большей части программного обеспечения и веб-приложений, которые мы создаем сегодня, требуется какой-то хостинг для файлов - изображений, счетов-фактур, аудиофайлов и т. Д. Традиционный способ хранения файлов заключался в простом сохранении их на жестком диске сервера. Однако сохранение файлов на жестком диске сервера имеет ограничения, такие как невозможность масштабирования, необходимость выделения места перед использованием и гораздо более высокие / негибкие цены. Не говоря уже о том, что запрос огромного количества (потенциально больших) изображений может действительно вызвать нагрузку на сервер.
Чтобы разгрузить серверы, разработчики начали размещать файлы с такими поставщиками хранилищ, как AWS S3 , Google Cloud Storage и т. Д.
В этой статье мы покажем вам, как написать код Node.js для загрузки файлов на S3.
Что такое S3?
S3 или Simple Storage Service - это облачный сервис хранения, предоставляемый Amazon Web Services (AWS). Используя S3, вы можете размещать любое количество файлов, платя только за то, что используете.
S3 также предоставляет мультирегиональный хостинг для клиентов в их регионе и, таким образом, может действительно быстро обслуживать запрошенные файлы с минимальной задержкой.
Настройка среды
Учетные данные AWS
Для начала вам необходимо сначала сгенерировать учетные данные для доступа с ключом безопасности AWS. Для этого войдите в консоль управления AWS .
Нажмите на свое имя пользователя:
{.ezlazyload}
Затем выберите Ключи доступа -> Создать новый ключ доступа :
{.ezlazyload}
После этого вы можете либо скопировать идентификатор ключа доступа и
секретный ключ доступа из этого окна, либо загрузить его в виде файла
.CSV
{.ezlazyload}
Создание сегмента S3
Теперь давайте создадим AWS S3 Bucket с надлежащим доступом. Мы можем сделать это с помощью консоли управления AWS или с помощью Node.js.
Чтобы создать корзину S3 с помощью консоли управления, перейдите в службу S3, выбрав ее в меню службы:
{.ezlazyload}
Выберите «Create Bucket» и введите имя своего сегмента и регион, в котором вы хотите разместить свой сегмент. Если вы уже знаете, из какого региона будет приезжать большинство ваших пользователей, разумно выбрать регион как можно ближе к их. Это гарантирует, что файлы с сервера будут обслуживаться в более оптимальные сроки.
Имя, которое вы выбираете для своей корзины, должно быть уникальным для всех пользователей AWS, поэтому попробуйте новое, если имя недоступно:
{.ezlazyload}
Следуйте инструкциям мастера и настройте разрешения и другие параметры в соответствии с вашими требованиями.
Чтобы создать корзину с использованием Node.js, нам сначала нужно настроить нашу среду разработки.
Среда разработки
Итак, теперь давайте начнем с нашего примера, настроив новый проект Node.js:
$ npm init
Чтобы начать использовать любые облачные сервисы AWS в Node.js, мы должны установить AWS SDK (System Development Kit).
Установите его, используя предпочитаемый вами менеджер пакетов - мы
будем использовать npm
:
$ npm i --save aws-sdk
Выполнение
Создание сегмента S3
Если вы уже создали ведро вручную, вы можете пропустить эту часть. Но
если нет, давайте создадим файл, скажем, create-bucket.js
в каталоге
вашего проекта.
Импортируйте aws-sdk
для доступа к вашей корзине S3:
const AWS = require('aws-sdk');
Теперь давайте определим три константы для хранения ID
, SECRET
и
BUCKET_NAME
. Они используются для идентификации нашей корзины и
доступа к ней:
// 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';
Теперь нам нужно инициализировать интерфейс S3, передав наши ключи доступа:
const s3 = new AWS.S3({
accessKeyId: ID,
secretAccessKey: SECRET
});
После успешной инициализации интерфейса S3 мы можем продолжить и создать корзину:
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);
});
На этом этапе мы можем запустить код и проверить, создана ли корзина в облаке:
$ node create-bucket.js
Если выполнение кода выполнено успешно, вы должны увидеть сообщение об успешном завершении, за которым следует адрес корзины в выходных данных:
Bucket Created Successfully http://test-bucket-2415soig.s3.amazonaws.com/
Вы можете посетить свою панель управления S3 и убедиться, что корзина создана:
{.ezlazyload}
Полный список регионов и других параметров можно найти в официальной документации .
Загрузка файлов
На этом этапе давайте реализуем функцию загрузки файлов. В новом файле,
например, upload.js
, импортируйте aws-sdk
для доступа к вашей fs
для чтения файлов с вашего компьютера:
const fs = require('fs');
const AWS = require('aws-sdk');
Нам нужно определить три константы для хранения ID
, SECRET
и
BUCKET_NAME
и инициализировать клиент S3, как мы делали раньше.
Теперь давайте создадим функцию, которая принимает fileName
,
представляющий файл, который мы хотим загрузить:
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}`);
});
};
Перед тем, как загрузить файл, нам нужно прочитать его содержимое как
буфер. Прочитав его, мы можем определить необходимые параметры для
загрузки файла, такие как Bucket
, Key
и Body
.
Помимо этих трех параметров, существует длинный список других необязательных параметров. Чтобы получить представление о том, что вы можете определить для файла во время загрузки, вот несколько полезных:
StorageClass
: определите класс, в котором вы хотите сохранить объект. S3 предназначен для обеспечения быстрого обслуживания файлов. Но если к файлам обращаются редко, вы можете использовать другой класс хранилища. Например, если у вас есть файлы, которые практически не касаются, вы можете хранить их в «S3 Glacier Storage», где цена очень низкая по сравнению со «S3 Standard Storage». Но для доступа к этим файлам потребуется больше времени, если он вам понадобится, и на него распространяется другое соглашение об уровне обслуживания.ContentType
: устанавливает MIME-тип изображения. Тип по умолчанию будет «двоичный / октетный поток». Добавление типа MIME, например image / jpeg, поможет браузерам и другим HTTP-клиентам определять тип файла.ContentLength
: устанавливает размер тела в байтах, что удобно, если размер тела не может быть определен автоматически.ContentLanguage
: установите этот параметр, чтобы определить, на каком языке находится содержимое. Это также поможет HTTP-клиентам идентифицировать или переводить содержимое.
Для Bucket
мы будем использовать имя нашей Key
мы добавим имя файла,
которое мы хотим сохранить как, а для Body
мы будем использовать
fileContent
.
После этого мы можем загрузить любой файл, передав имя файла функции:
uploadFile('cat.jpg');
Вы можете заменить «cat.jpg» на имя файла, которое существует в том же каталоге, что и код, относительный путь к файлу или абсолютный путь к файлу.
На этом этапе мы можем запустить код и проверить, работает ли он:
$ node upload.js
Если все в порядке, вы должны увидеть результат, подобный показанному
ниже, со ссылкой на ваш файл, который хранится в data.Location
.
File uploaded successfully. https://test-bucket-1242tsr.s3.ap-northeast-2.amazonaws.com/cat.jpg
Если есть какая-либо ошибка, она также должна отображаться на консоли.
Кроме того, вы можете перейти к своей корзине в Консоли управления AWS и убедиться, что файл загружен.
{.ezlazyload}
Заключение
Чтобы разгрузить наши серверы приложений, разработчики часто выбирают
размещение файлов с помощью поставщиков хранилищ, таких как AWS S3,
Google Cloud Storage и т. Д. Мы создали очень простое приложение
Node.js, которое обрабатывает загрузку файлов в S3, используя свой
интерфейс через модуль aws-sdk
В зависимости от ваших требований вы также можете настроить общий доступ к вашей корзине или файлам с помощью консоли.
Если вы хотите поэкспериментировать с кодом, как всегда, вы можете найти его на GitHub в этом Gist .