Вопрос или проблема
Я ищу веб-сервер, очень похожий на CouchDB, который хранит свои данные в виде обычных файлов и папок.
Мне нужно:
-
Получать содержимое директории
- с поддержкой фильтрации по имени файла (аналогично
startkey
,endkey
,sort
иlimit
опциям CouchDB) - с поддержкой длинного опроса
- с поддержкой фильтрации по имени файла (аналогично
-
Получать файл
Существует ли кросс-платформенное (Windows и Linux) автономное веб-серверное приложение для этой цели?
Сценарий использования
Приложение принимает изображения и сохраняет их в папку. На другом компьютере мне нужно эффективно получить эти изображения, а затем отправить их в базу данных. В основном это rsync
, но без сохранения полученных файлов на целевом устройстве.
Эта цель может быть достигнута с помощью rsync
, когда удаленные файлы в целевой папке добавляются в файл и --exclude
исключаются из синхронизации.
Ответ или решение
Для реализации вашего запроса на создание веб-сервера с поддержкой фильтрации документов, который будет хранить свои данные в виде обычных файлов и папок, можно рассмотреть несколько решений. Вот как можно подойти к данной задаче.
Решение 1: Использование Node.js с Express и дополнительными библиотеками
Node.js предоставляет мощную экосистему для построения веб-серверов, и благодаря библиотекам и фреймворкам, таким как Express, вы можете легко создать сервер с нужными функциями.
-
Установка Node.js и Express:
Убедитесь, что у вас установлен Node.js. Затем создайте новый проект и установите Express:mkdir my-web-server cd my-web-server npm init -y npm install express
-
Создание сервера:
В основной файл вашего проекта (например,server.js
) добавьте следующий код:const express = require('express'); const fs = require('fs'); const path = require('path'); const app = express(); const PORT = process.env.PORT || 3000; const DIRECTORY = './images'; // директория с изображениями // Middleware для фильтрации файлов app.get('/files', (req, res) => { const { startkey, endkey, limit } = req.query; fs.readdir(DIRECTORY, (err, files) => { if (err) return res.status(500).send(err); // Фильтрация имен файлов let filteredFiles = files .filter(file => { const fileName = path.basename(file); return fileName >= startkey && fileName <= endkey; }); // Сортировка и ограничение количества файлов filteredFiles.sort(); if (limit) { filteredFiles = filteredFiles.slice(0, limit); } res.json(filteredFiles); }); }); // Эндпоинт для загрузки файлов app.get('/files/:filename', (req, res) => { const filePath = path.join(DIRECTORY, req.params.filename); res.sendFile(filePath, err => { if (err) { res.status(err.status).end(); } }); }); app.listen(PORT, () => { console.log(`Server is running on http://localhost:${PORT}`); });
-
Поддержка долгосрочного опроса:
Для обеспечения долгосрочного опроса можно использовать WebSocket или периодический запрос с клиентской стороны.
Решение 2: Использование Python и Flask
Если вы предпочитаете Python, можно использовать Flask для создания подобного сервера.
-
Установка Flask:
Убедитесь, что у вас установлен Python. Затем установите Flask:pip install Flask
-
Создание сервера:
Создайте файлapp.py
и добавьте следующий код:from flask import Flask, request, jsonify, send_from_directory import os app = Flask(__name__) DIRECTORY = './images' @app.route('/files', methods=['GET']) def get_files(): startkey = request.args.get('startkey', '') endkey = request.args.get('endkey', '') limit = int(request.args.get('limit', 0)) files = [f for f in os.listdir(DIRECTORY) if startkey <= f <= endkey] files.sort() if limit > 0: files = files[:limit] return jsonify(files) @app.route('/files/<filename>', methods=['GET']) def get_file(filename): return send_from_directory(DIRECTORY, filename) if __name__ == '__main__': app.run(debug=True)
Общее решение
Оба вышеупомянутых способа предоставляют вам необходимые функции для фильтрации содержимого каталога и загрузки файлов. Вы можете адаптировать и модифицировать их в соответствии с вашими потребностями.
Для обеспечения долгосрочного опроса, как было указано в вашем вопросе, рассмотрите возможность внедрения WebSocket для динамичного обновления клиентских приложений или используйте простые AJAX-запросы с установленным интервалом.
Заключение
Выбор технологии зависит от вашего комфорта с определёнными языками программирования и инструментами. И Node.js с Express, и Python с Flask предоставляют простые и мощные способы реализации вашего веб-сервера с необходимой функциональностью.