Skip to content

lovebugss/image-processor

Repository files navigation

Image Processing Service API

项目描述

本项目是一个基于 Node.js 和 Express 构建的高性能图片处理 API 服务。它允许用户通过 URL 参数动态地对图片进行各种操作,如调整大小、裁剪、格式转换、质量调整等。服务支持从多种来源(如本地文件系统、用户上传)获取图片,并集成了缓存机制以提高重复请求的响应速度和效率。

主要特性:

  • 动态图像处理: 使用 Sharp 库进行高效的图像转换。
  • 多图片源: 支持从配置的本地目录或用户上传获取图片,并可扩展至 S3、Minio 等云存储。
  • URL 参数驱动: 通过简单的 URL 查询参数控制图像处理选项。
  • 缓存策略: 支持文件系统缓存,并可扩展至内存缓存 (LRU) 或 Redis 等分布式缓存。
  • 文件上传: 提供图片上传接口,上传后的图片可被动态处理。
  • 可配置和可扩展: 设计上考虑了模块化,方便添加新的图片源、缓存策略和处理参数。
  • Docker 支持: 提供 Dockerfile 和 Docker Compose 配置,方便本地开发和部署。

项目结构

image-processor-service/
├── config/                   # 应用配置文件
│   └── index.js
├── src/                      # 源代码目录
│   ├── sources/              # 图片源实现 (localFileSource.js, s3Source.js, etc.)
│   │   └── baseSource.js     # 图片源基类/接口
│   ├── caches/               # 缓存策略实现 (fileSystemCache.js, memoryCache.js, etc.)
│   │   └── baseCache.js      # 缓存基类/接口
│   ├── processing/           # 图片处理逻辑 (sharpProcessor.js)
│   ├── middleware/           # Express 中间件 (imageHandler.js, uploadHandler.js)
│   ├── utils/                # 工具函数 (paramParser.js, cacheKeyGenerator.js, fileNameUtils.js)
│   └── app.js                # Express 应用设置和路由初始化
├── original_images/          # 示例: 存放 'local' 源类型的预置图片
├── uploaded_images/          # 示例: 存放通过 '/upload' 源上传的图片 (如果使用本地文件存储)
├── cached_images/            # 示例: 存放文件系统缓存处理后的图片
├── public/                   # (可选) 存放静态资源,如测试上传表单
├── .env.example              # 环境变量示例文件
├── .eslintrc.js              # (可选) ESLint 配置文件
├── .gitignore
├── Dockerfile                # 用于构建 Docker 镜像
├── docker-compose.yml        # 用于本地 Docker 开发环境
├── package.json
├── package-lock.json
├── README.md
└── server.js                 # Node.js 应用入口文件

技术栈

  • Node.js: JavaScript 运行时环境。
  • Express.js: Web 应用框架。
  • Sharp: 高性能图像处理库。
  • Multer: Node.js 中间件,用于处理 multipart/form-data,主要用于文件上传。
  • dotenv: 用于从 .env 文件加载环境变量到 process.env
  • Docker: 容器化平台。

使用方式

1. 环境准备

  • 安装 Node.js (推荐 LTS 版本,请参考 package.json 中的 engines 字段)。
  • 安装 DockerDocker Compose (如果使用 Docker 进行本地开发或部署)。
  • 克隆项目仓库:
    git clone https://github.com/lovebugss/image-processor.git
    cd image-processor-service

2. 本地开发 (不使用 Docker)

  • 安装依赖:
    npm install
  • 配置环境变量: 复制 .env.example 文件为 .env,并根据你的本地环境修改其中的值。
    cp .env.example .env
    # 编辑 .env 文件
    至少需要配置 PORT 和图片/缓存目录路径 (如果与默认不同)。
  • 启动开发服务器:
    npm run dev
    服务器将启动 (通常在 http://localhost:3000,取决于 .env 中的 PORT 设置),并使用 nodemon 监控文件更改自动重启。

3. 本地开发 (使用 Docker Compose)

  • 配置环境变量: Docker Compose 会自动加载项目根目录下的 .env 文件。确保 .env 文件已根据你的需求配置。
  • 构建并启动服务:
    docker-compose up --build
    服务将在 Docker 容器中运行,通常可以通过 http://localhost:3000 访问。
  • 查看日志:
    docker-compose logs -f app
  • 停止服务:
    docker-compose down

4. API 端点示例

假设服务器运行在 http://localhost:3000

  • 处理图片: GET /<sourceName>/images/<imageFilename>?param1=value1&param2=value2

    • <sourceName>: 图片源的名称 (在 config/index.js 中定义,例如 local, upload)。
    • <imageFilename>: 图片文件名。
    • 示例:
      • 调整 'local' 源的 'nature.jpg' 宽度为 300px: http://localhost:3000/local/images/nature.jpg?w=300
      • 裁剪 'upload' 源的 'myphoto.png' 为 200x150, 并转换为 webp 格式: http://localhost:3000/upload/images/myphoto.png?w=200&h=150&crop=true&format=webp
  • 支持的图片处理参数 (示例,具体请参考 src/processing/sharpProcessor.js):

    • w: 宽度 (像素)
    • h: 高度 (像素)
    • crop: 是否裁剪 (truefalse)。通常与 wh 结合使用。
    • fit: Sharp 的 fit 选项 (如 cover, contain, fill, inside, outside)。
    • gravity: Sharp 的 gravity 选项 (如 north, center, attention, entropy),用于裁剪焦点。
    • format: 输出图片格式 (如 jpeg, png, webp, gif, tiff)。
    • q: 图片质量 (1-100,主要对 jpegwebp 有效)。
    • (更多参数可根据 sharpProcessor.js 的实现添加)
  • 上传图片: POST /<sourceName>/images

    • <sourceName>: 通常是配置为允许上传的源,例如 upload
    • 请求体需要是 multipart/form-data,包含一个名为 imageFile 的文件字段。
    • 示例 (使用 curl):
      curl -X POST -F "imageFile=@/path/to/your/image.jpg" http://localhost:3000/upload/images
    • 成功后会返回包含上传文件信息的 JSON 对象,包括处理该图片的 URL。
    • 项目可能提供一个简单的 HTML 上传表单,例如访问 http://localhost:3000/upload-form (如果已配置)。

部署方式

1. 使用 Docker (推荐)

  • 构建 Docker 镜像:

    docker build -t your-username/image-processor-service:latest .
  • 推送到镜像仓库 (可选但推荐):

    docker login your-registry.com # 例如 Docker Hub, AWS ECR, Google GCR
    docker push your-username/image-processor-service:latest
  • 部署到生产环境:

    • Kubernetes: 创建 Deployment 和 Service YAML 文件,使用 PersistentVolumeClaims 处理持久化存储 (上传的图片、文件缓存)。通过 Ingress 暴露服务。
    • AWS ECS: 创建 Task Definition 和 Service。使用 EFS 或 S3 (通过应用逻辑) 进行持久化存储。使用 Application Load Balancer。
    • PaaS 平台 (如 Heroku, Render, Fly.io): 如果平台支持从 Docker 镜像部署,按照其文档操作。配置环境变量和持久化存储 (如果平台提供)。
    • 单个 VPS: 可以使用 docker run 命令,或继续使用 docker-compose.yml (调整配置以适应生产)。强烈建议在 Node.js 应用前配置 Nginx 或 Apache 作为反向代理,处理 SSL 终止、静态资源、负载均衡等。

    生产 Docker 运行示例 (简版,假设镜像已构建):

    docker run -d \
      --name image-processor \
      -p 8080:3000 \ # 将主机的 8080 映射到容器的 3000 (假设Nginx在主机80处理请求)
      -v /path/on/host/uploaded_images:/usr/src/app/uploaded_images \ # 持久化上传目录
      -v /path/on/host/cached_images:/usr/src/app/cached_images \   # 持久化缓存目录
      -e NODE_ENV=production \
      -e PORT=3000 \
      -e UPLOAD_IMAGES_PATH=/usr/src/app/uploaded_images \
      -e CACHE_DIR=/usr/src/app/cached_images \
      # ... 其他生产环境变量 (S3 密钥, Redis 连接等) ...
      your-username/image-processor-service:latest

    重要: 对于生产环境中的 uploaded_imagescached_images (如果是文件系统缓存),强烈建议使用云存储服务 (如 AWS S3, Google Cloud Storage) 或分布式缓存 (如 Redis, Memcached) 而不是本地卷挂载,以实现更好的可扩展性和可靠性。

2. 非 Docker 部署 (传统方式)

  • 将项目代码(不包括 node_modules)部署到服务器。
  • 在服务器上安装 Node.js 和 npm/yarn。
  • 安装生产依赖: npm install --production
  • 配置生产环境变量 (例如通过系统环境变量、.bashrc、或特定于部署工具的方式)。
  • 使用进程管理器 (如 PM2systemd) 启动和管理 Node.js 应用,确保其在后台运行并在崩溃时自动重启。
    # 使用 PM2 示例
    pm2 start server.js --name image-processor-api -i max # -i max 启动集群模式
    pm2 startup # 设置 PM2 开机自启
    pm2 save    # 保存当前进程列表
  • 配置 Web 服务器 (Nginx/Apache) 作为反向代理。

环境变量配置 (生产)

在生产环境中,绝不使用 .env 文件。环境变量应通过部署平台提供的安全机制进行配置。关键环境变量包括:

  • NODE_ENV=production
  • PORT
  • 图片源和缓存目录的路径 (如果使用本地文件系统,应指向持久化存储位置)
  • 数据库连接字符串 (如果使用)
  • 云服务凭证 (AWS keys, S3 bucket names, Redis connection strings等)
  • 任何 API 密钥

贡献

欢迎提交 Pull Requests 或 Issues 来改进此项目!

在提交代码前,请确保:

  1. 代码符合项目的 ESLint 规范 (npm run lint)。
  2. (如果适用) 添加了必要的测试并通过了所有测试 (npm test)。
  3. 更新了相关文档。

许可证

本项目使用 MIT 许可证。

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published