Автономный веб-сервер с поддержкой фильтрации документов

Вопрос или проблема

Я ищу веб-сервер, очень похожий на CouchDB, который хранит свои данные в виде обычных файлов и папок.

Мне нужно:

  • Получать содержимое директории

    • с поддержкой фильтрации по имени файла (аналогично startkey, endkey, sort и limit опциям CouchDB)
    • с поддержкой длинного опроса
  • Получать файл

Существует ли кросс-платформенное (Windows и Linux) автономное веб-серверное приложение для этой цели?

Сценарий использования

Приложение принимает изображения и сохраняет их в папку. На другом компьютере мне нужно эффективно получить эти изображения, а затем отправить их в базу данных. В основном это rsync, но без сохранения полученных файлов на целевом устройстве.

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

Ответ или решение

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

Решение 1: Использование Node.js с Express и дополнительными библиотеками

Node.js предоставляет мощную экосистему для построения веб-серверов, и благодаря библиотекам и фреймворкам, таким как Express, вы можете легко создать сервер с нужными функциями.

  1. Установка Node.js и Express:
    Убедитесь, что у вас установлен Node.js. Затем создайте новый проект и установите Express:

    mkdir my-web-server
    cd my-web-server
    npm init -y
    npm install express
  2. Создание сервера:
    В основной файл вашего проекта (например, 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}`);
    });
  3. Поддержка долгосрочного опроса:
    Для обеспечения долгосрочного опроса можно использовать WebSocket или периодический запрос с клиентской стороны.

Решение 2: Использование Python и Flask

Если вы предпочитаете Python, можно использовать Flask для создания подобного сервера.

  1. Установка Flask:
    Убедитесь, что у вас установлен Python. Затем установите Flask:

    pip install Flask
  2. Создание сервера:
    Создайте файл 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 предоставляют простые и мощные способы реализации вашего веб-сервера с необходимой функциональностью.

Оцените материал
Добавить комментарий

Капча загружается...