能否使用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
相关产品推荐
相关产品推荐

