本指南将构建一套基于MinIO对象存储的档案管理系统,实现纸质档案的数字化扫描入库、OCR文字提取以及基于预签名URL的跨部门安全共享。整个系统不依赖昂贵的商业软件,使用开源技术栈零成本落地。
核心技术栈包括:
在开始操作前,请准备一台安装了Linux (推荐Ubuntu 20.04及以上)的服务器。为了确保环境一致性,我们将使用Docker进行部署。如果未安装Docker,请执行以下命令:
1. 安装Docker及Docker Compose
curl -fsSL https://get.docker.com | bash
sudo usermod -aG docker $USER
newgrp docker
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
2. 安装Python基础环境及OCR依赖
系统需要Python 3.8+环境以及Tesseract识别引擎。执行以下命令完成安装:
sudo apt-get update
sudo apt-get install -y python3 python3-pip tesseract-ocr tesseract-ocr-chi-sim libpng-dev libjpeg-dev libtiff-dev
pip3 install flask pytesseract Pillow minio
MinIO将作为档案文件的底层存储库。我们通过Docker Compose快速启动一个单节点实例。
1. 创建项目目录
mkdir -p /data/archive_system
cd /data/archive_system
2. 编写docker-compose.yml文件
在当前目录下创建docker-compose.yml文件,完整内容如下。注意,这里我们将控制台端口设置为9001,API端口设置为9000,并设置了默认的账号密码。
version: '3.8'
services:
minio:
image: minio/minio:latest
container_name: archive_minio
command: server /data --console-address ":9001"
ports:
- "9000:9000"
- "9001:9001"
environment:
- MINIO_ROOT_USER=admin
- MINIO_ROOT_PASSWORD=Admin@123
volumes:
- ./minio_data:/data
restart: always
3. 启动MinIO服务
docker-compose up -d
4. 初始化存储桶
服务启动后,我们需要创建一个名为digital-archives的存储桶,并设置公共读取策略为None(私有),确保所有访问必须经过后端鉴权。
访问 http://服务器IP:9001,使用admin / Admin@123登录。点击左侧菜单Buckets -> Create Bucket,名称填写digital-archives,点击创建。创建后,保持默认的Private权限不变。
后端服务负责接收上传的图片,调用Tesseract进行文字提取(数字化),将文件存入MinIO,并生成带有过期时间的跨部门访问链接。

1. 编写后端代码 app.py
在/data/archive_system目录下创建app.py,完整代码如下:
import os
import uuid
from flask import Flask, request, jsonify, render_template_string
from minio import Minio
from minio.error import S3Error
import pytesseract
from PIL import Image
from io import BytesIO
app = Flask(__name__)
MinIO 配置
MINIO_ENDPOINT = "localhost:9000"
MINIO_ACCESS_KEY = "admin"
MINIO_SECRET_KEY = "Admin@123"
MINIO_BUCKET = "digital-archives"
MINIO_SECURE = False 本地测试通常用HTTP
初始化MinIO客户端
minio_client = Minio(
MINIO_ENDPOINT,
access_key=MINIO_ACCESS_KEY,
secret_key=MINIO_SECRET_KEY,
secure=MINIO_SECURE
)
检查存储桶是否存在,不存在则创建
try:
if not minio_client.bucket_exists(MINIO_BUCKET):
minio_client.make_bucket(MINIO_BUCKET)
except S3Error as e:
print(f"MinIO连接错误: {e}")
HTML_TEMPLATE = """
档案数字化上传
档案数字化处理中心
上传档案扫描件
{% if result %}
处理成功
档案ID: {{ result.file_id }}
识别文字 (前100字): {{ result.text_preview }}...
跨部门共享链接 (有效期1小时):
{{ result.share_link }}
{% endif %}
{% if error %}
{{ error }}
{% endif %}
"""
@app.route('/')
def index():
return render_template_string(HTML_TEMPLATE)
@app.route('/upload', methods=['POST'])
def upload_file():
if 'file' not in request.files:
return render_template_string(HTML_TEMPLATE, error="未选择文件")
file = request.files['file']
if file.filename == '':
return render_template_string(HTML_TEMPLATE, error="文件名为空")
try:
1. 读取图片并进行OCR识别
image_bytes = file.read()
image = Image.open(BytesIO(image_bytes))
使用Tesseract进行OCR,指定中文语言包
text = pytesseract.image_to_string(image, lang='chi_sim')
2. 生成唯一文件名
file_id = str(uuid.uuid4())
file_ext = os.path.splitext(file.filename)[1]
object_name = f"{file_id}{file_ext}"
3. 将文件上传至MinIO
file.seek(0) 重置指针
minio_client.put_object(
MINIO_BUCKET,
object_name,
file,
length=-1,
part_size=1010241024,
content_type=file.content_type
)
4. 生成预签名URL (有效期1小时)
share_url = minio_client.presigned_get_object(
MINIO_BUCKET,
object_name,
expires=3600
)
return render_template_string(HTML_TEMPLATE, result={
'file_id': file_id,
'text_preview': text[:100].strip(),
'share_link': share_url
})
except Exception as e:
return render_template_string(HTML_TEMPLATE, error=f"处理失败: {str(e)}")
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000, debug=True)
代码编写完成后,即可启动后端服务进行验证。
1. 启动Flask应用
export FLASK_APP=app.py
python3 app.py
2. 执行档案数字化上传
http://服务器IP:5000。3. 验证跨部门共享链接
1. OCR识别报错 "tesseract is not installed"
如果Python提示找不到Tesseract,请检查系统环境变量。通常需要在代码中指定路径,或者在终端运行 which tesseract 确认路径。如果是在Docker中运行Python,需要确保Docker镜像内安装了tesseract-ocr。
2. MinIO连接超时
如果后端报错连接MinIO失败,请检查docker-compose.yml中的端口映射,并确认代码中的MINIO_ENDPOINT。如果后端在Docker容器内运行,localhost应改为MinIO容器的服务名(如minio);如果后端在宿主机运行,则使用localhost:9000。
3. 中文显示为乱码
确保安装了tesseract-ocr-chi-sim语言包。如果识别结果全为方框,说明系统缺少中文字体支持,需安装fonts-wqy-zenhei等字体包。