You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否使用Flask或其他工具实现目录内图片自动上传至Web服务器?

本地图片自动上传到Web服务器的Flask实现方案

完全可以实现,你可以用Flask搭建服务端接收上传请求,搭配本地目录监控脚本实现全自动上传,以下是可直接运行的最小实现方案:

1. 服务端(Web服务器端):Flask图片接收接口

依赖安装

pip install flask flask-cors

服务端代码

from flask import Flask, request
import os
from flask_cors import CORS

app = Flask(__name__)
CORS(app)
# 自定义服务端存储图片的目录
UPLOAD_FOLDER = './uploaded_images'
os.makedirs(UPLOAD_FOLDER, exist_ok=True)
# 允许上传的图片后缀
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif', 'bmp'}

def allowed_file(filename):
    return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS

@app.route('/upload', methods=['POST'])
def upload_file():
    if 'file' not in request.files:
        return {"code": 400, "msg": "没有上传的文件"}, 400
    file = request.files['file']
    if file.filename == '':
        return {"code": 400, "msg": "未选择文件"}, 400
    if file and allowed_file(file.filename):
        filename = file.filename
        file.save(os.path.join(UPLOAD_FOLDER, filename))
        return {"code": 200, "msg": "上传成功"}, 200
    return {"code": 400, "msg": "不允许的文件类型"}, 400

if __name__ == '__main__':
    # 0.0.0.0 允许同局域网其他设备访问,默认端口5000
    app.run(host='0.0.0.0', port=5000, debug=True)

2. 本地端:目录监控+自动上传脚本

用watchdog库监控本地目录的文件新增事件,检测到新图片就自动上传到服务端

依赖安装

pip install requests watchdog

本地脚本代码

import os
import time
import requests
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler

# 配置项,可根据实际情况修改
LOCAL_MONITOR_FOLDER = "./to_upload"  # 要监控的本地目录,新增的图片放这里就会自动上传
SERVER_UPLOAD_URL = "http://127.0.0.1:5000/upload"  # Flask服务的上传接口地址,部署到公网后改对应地址
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif', 'bmp'}

class ImageUploadHandler(FileSystemEventHandler):
    def on_created(self, event):
        # 忽略目录创建事件,只处理新增文件
        if event.is_directory:
            return
        filename = os.path.basename(event.src_path)
        # 校验是否为允许的图片格式
        if '.' not in filename or filename.rsplit('.', 1)[1].lower() not in ALLOWED_EXTENSIONS:
            return
        
        # 等待文件完全写入,避免大文件还没拷贝完就触发上传
        while True:
            try:
                with open(event.src_path, 'rb') as f:
                    break
            except PermissionError:
                time.sleep(0.5)
        
        # 执行上传
        try:
            with open(event.src_path, 'rb') as f:
                files = {'file': (filename, f)}
                resp = requests.post(SERVER_UPLOAD_URL, files=files, timeout=30)
                if resp.status_code == 200:
                    print(f"上传成功:{filename}")
                    # 可选:上传成功后删除本地文件/移动到已归档目录
                    # os.remove(event.src_path)
                else:
                    print(f"上传失败:{filename},错误:{resp.json().get('msg', '未知错误')}")
        except Exception as e:
            print(f"上传 {filename} 时异常:{str(e)}")

if __name__ == "__main__":
    os.makedirs(LOCAL_MONITOR_FOLDER, exist_ok=True)
    event_handler = ImageUploadHandler()
    observer = Observer()
    observer.schedule(event_handler, LOCAL_MONITOR_FOLDER, recursive=False)
    observer.start()
    print(f"已启动目录监控,监控路径:{LOCAL_MONITOR_FOLDER}")
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()
    observer.join()

3. 运行步骤

  • 先启动Flask服务端,运行服务端代码即可
  • 再启动本地监控脚本,运行本地端代码即可
  • 往LOCAL_MONITOR_FOLDER对应的目录里新增图片,会自动上传到服务端的UPLOAD_FOLDER目录下

4. 可选优化项

  • 公网部署时建议添加鉴权逻辑,比如请求头携带自定义token,服务端校验通过才允许上传,避免接口被恶意调用
  • 可添加上传失败自动重试机制,网络异常时自动重新提交
  • 大体积图片可改为分片上传,避免单次请求超时
  • 可添加文件名去重逻辑,避免同名文件覆盖

内容的提问来源于stack exchange,提问作者Phumin Pmn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 15:27:03