Я создаю API, который должен принимать загрузки файлов. Таким образом, пользователь может POST
файл до конечной точки, файл будет отправлен на проверку на вирусы, а затем, если он очищен, будет отправлен в хранилище (вероятно, S3). До сих пор я добился этого с одной проблемой: файлы временно сохраняются в файловой системе приложений. Мне нужно разработать приложение, которое не хранит вещи в памяти. Вот мой рабочий код:
приложение. js
const express = require('express');
const bb = require('express-busboy');
const app = express();
// Busboy modules extends the express app to handle incoming files
bb.extend(app, {
upload: true,
path: './tmp'
});
Маршруты. js
const express = require('express');
const router = express.Router();
const fileManagementService = require('./file-management-service')();
router
.route('/:fileId')
.post(async (req, res, next) => {
try {
const {fileId} = req.params;
const {files} = req;
const response = await fileManagementService.postFile(files, fileId);
res.status(201).json(response);
} catch (err) {
next(err);
}
})
file-management-service. js
const fs = require('fs');
function createUploader() {
// POST /:fileId
async function postFile(data, fileId) {
const {file} = data.file;
const fileStream = fs.createReadStream(file);
const scanOutput = await scanFile(fileStream); // Function scans file for viruses
const status = scanOutput.status === 'OK';
let upload = 'NOT UPLOADED';
if (status) {
upload = await postS3Object({file}); // Some function that sends the file to S3 or other storage
}
fs.unlinkSync(file);
return {
fileId,
scanned: scanOutput,
upload
};
}
return Object.freeze({
postFile
});
}
module.exports = createUploader;
Как уже упоминалось, вышеприведенное работает, как и ожидалось, файл отправляется на сканирование, а затем отправляется в корзину S3 перед возвратом ответа на постер на этот счет. Однако моя реализация express -busboy хранит файл в папке ./tmp
, затем я преобразую это в читаемый поток, используя fs.createReadStream(filePath);
перед отправкой его в AV и снова в функцию, которая отправляет файл в S3.
Этот API размещен в кластере kubernetes, и мне нужно избегать создания состояний. Как я могу достичь вышеупомянутого без фактического сохранения файла? Я предполагаю, что busboy получает этот файл как какой-то поток, поэтому, если он не звучит плотно, может ли он не просто оставаться потоком и передаваться через эти функции для достижения того же результата?