Обработка загрузки и хранения файлов в приложении node.js с использованием AWS S3

Я занят приложением, похожим на ToDo, где я хочу, чтобы пользователи могли добавлять вложения к задачам.

Я борюсь с архитектурой своего приложения больше, чем с кодом.

Для моего внешнего интерфейса я использую Vuejs с Nodejs в качестве внутреннего интерфейса и MongoDB для моей базы данных, которую я рассматриваю для размещения на Heroku. Я думал использовать AWS S3 для хранения вложений для своих задач.

Я не уверен, следует ли мне загружать файлы через мой сервер Node на S3 или мне следует выполнять загрузку через предварительно подписанные URL-адреса. Также я не уверен, как лучше всего загружать вложения с S3, я думал, что лучше всего это сделать с помощью предварительно подписанных URL-адресов.

Моя главная путаница заключается в том, как сохранить индекс всех вложений задачи. Будет ли хранение индекса в MongoDB, связанного с моей моделью задач, лучшим способом сделать это? Кроме того, какие соглашения существуют относительно того, какие метаданные следует хранить?

Наконец, мне было интересно, существуют ли какие-либо соглашения относительно организации файлов, загружаемых на S3. Можно ли просто сохранить файл под идентификатором базы данных задачи? Стоит ли вообще менять имя файла?


person yourstruly22    schedule 11.05.2020    source источник


Ответы (1)


Храните вложения в S3. Я бы порекомендовал вам создать отдельную корзину в S3 для вложений и отслеживать эти файлы в коллекции MongoDB под названием «Вложения».

Для каждого файла вы храните следующий документ:

{
  "source_name" : "helloworld.txt"
  "s3_url" : "https://bucket-name.s3-eu-west-1.amazonaws.com/A591A6D40BF420404A011733CFB7B190D62C65BF0BCDA32B57B277D9AD9F146E"
  "sha256" : "A591A6D40BF420404A011733CFB7B190D62C65BF0BCDA32B57B277D9AD9F146E"
  "uploaded" : "Mon May 11 2020 13:40:28" #  Alway UTC time
  "size" : 12
}

source_name — это имя загруженного файла. s3_url — это место в S3. Это должно быть закрытое ведро. Это контрольная сумма sha256 файла, который вы создаете. Вы также сохраняете это как отдельный объект. Наконец, дата загрузки и размер в байтах.

Зачем идти на накладные расходы контрольной суммы? Автоматическая дедупликация ваших файлов более безопасна, и вы можете легко обнаружить загруженные файлы, которые уже есть в вашей коллекции.

Это означает, что вы можете быстро находить файлы по контрольной сумме и имени, а в будущем вы можете добавить другие поля дискриминатора.

Загрузка и загрузка должны управляться вашим приложением. Вы сохраняете поле _id этого документа в своих документах задач, чтобы вложения можно было быстро получить.

Последняя оптимизация заключается в том, чтобы встроить этот документ в ваш документ Task и сэкономить сложность и накладные расходы, связанные с дополнительной коллекцией. Сделайте это, если соотношение вложений к задачам низкое.

person Joe Drumgoole    schedule 11.05.2020
comment
Спасибо за четкий ответ. Мне очень интересна часть контрольной суммы для автоматического дедупликации файлов. Мне просто интересно, как я тогда узнаю, какой тип файла хранится, если он хранится без расширения? Кроме того, когда вы говорите, что мое приложение должно управлять загрузкой/загрузкой, я предполагаю, что это бэкэнд nodejs? Спасибо - person yourstruly22; 12.05.2020
comment
Да, ваш бэкэнд справляется с этим. Тип файла должен быть выведен из типа MIME в загрузке или вы можете догадаться по расширению. Это также должно быть сохранено, чтобы вы знали, как обрабатывать файл позже. Я оставил это поле для ясности. - person Joe Drumgoole; 12.05.2020