Бывают случаи, когда вы можете захотеть скачать файл и сразу же загрузить его на S3. Без предварительного сохранения на локальный диск. Это трудоемкая операция; сначала скачать, а потом загрузить. Почему бы не сделать и то, и другое одновременно?
В этом конкретном случае нам нужно было загрузить файл от партнера, а затем синхронизировать его с базой данных. Загрузка на S3 позволила нам установить запись о том, когда этот файл поступил в целях аудита. Это также позволило нам настроить правило жизненного цикла, чтобы состарить эти файлы до ледника. Файлы, о которых идет речь, имеют размер 1–2 ГБ, что привело бы к нехватке места на диске для параллельных операций. Это укрепило, почему мы не хотели загружать весь файл на диск и загружать.
Использование потока PassThrough позволяет нам одновременно записывать и читать из одного и того же потока. Теперь мы используем только нашу сеть и память на этом этапе. Давайте посмотрим на код!
Вы, наверное, заметили, что здесь есть некоторые хитрости. Итак, давайте ненадолго объясним их.
Во-первых, мы используем libcurl через библиотеку node-libcurl. Это обеспечивает такие функции, как CurlFeature.RAW и CurlFeature.NoStorage. RAW предоставляет двоичные данные, а NoStorage сообщает клиенту curl, что мы не хотим ничего сохранять.
Далее, для S3 нам нужно указать размер контента при отправке потока контента. Заголовки HTTP всегда идут перед содержимым. Таким образом, мы можем определить размер загрузки с помощью заголовка Content-Length.
Используя сквозной поток, мы записываем по мере получения данных от curl, который записывает файл в S3. Теперь у вас есть простая система для загрузки и выгрузки на S3 без сохранения файла на диске. Он по-прежнему проходит через память и использует сеть; но хранение не требуется.