import watchdog import datetime from PIL import Image import signal import sys def on_change(event): if event.is_directory: return file_path = event.src_path file_mtime = datetime.datetime.fromtimestamp(event.modified) print(f'File Modified: {file_path}') print(f'File Modified Time: {file_mtime}') # 读取图片文件内容 with open(file_path, 'rb') as image_file: image_data = image_file.read() # 生成 HTML 图像元素 image_element = f'<img src="data:image/png;base64,{image_data.decode("utf-8")}" alt="{file_mtime}">' # 将图像元素添加到 HTML 输出中 html_output += f'<p>File Modified: {event.src_path}</p><p>File Modified Time: {event.modified}</p>{image_element}' html_output += '</body></html>' # 处理 SIGINT 信号 def signal_handler(signalnum, handler): if signalnum == signal.SIGINT: print("收到 CTRL+C,退出监听") watchdog_object.stop() sys.exit(1) # 设置要监听的目录 watchdog_path = '/var/img/' # 创建一个 watchdog 对象并添加监听目录 watchdog_object = watchdog.observers.Watchdog(watchdog_path) # 处理 SIGINT 信号 signal.signal(signal.SIGINT, signal_handler) while True: watchdog_object.observe(on_change) # 开始监听目录 # 输出 HTML 格式的文件修改时间信息 with open('file_modified_time.html', 'w') as html_file: html_file.write(html_output)
from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler import time import os from datetime import datetime class MyHandler(FileSystemEventHandler): def on_modified(self, event): if event.is_directory: return None if event.event_type == 'modified': # 获取文件修改时间 timestamp = os.path.getmtime(event.src_path) modify_time = datetime.fromtimestamp(timestamp).strftime('%Y-%m-%d %H:%M:%S') # 获取相对路径 relative_path = os.path.relpath(event.src_path, '/var/img') # 生成HTML文件 with open('/var/www/img.html', 'w') as f: f.write(f'<img src="{relative_path}" alt="Image"><p>{modify_time}</p>') event_handler = MyHandler() observer = Observer() observer.schedule(event_handler, path='/var/img', recursive=False) observer.start() while True: try: time.sleep(1) except KeyboardInterrupt: observer.stop() break observer.join()
from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler import time import os from datetime import datetime import threading from bottle import route, run, response, ServerAdapter, static_file # 可配置的变量 image_dir = '/var/www/img' web_root_dir = '/var/www' httphost = '0.0.0.0' httpport = 8080 #index.html页面放入内存中 html_content = '' class MyHandler(FileSystemEventHandler): def on_modified(self, event): global html_content if event.is_directory: return None if event.event_type == 'modified': # 添加延迟 time.sleep(5) # 获取文件修改时间 timestamp = os.path.getmtime(event.src_path) modify_time = datetime.fromtimestamp(timestamp).strftime('%Y-%m-%d %H:%M:%S') # 获取相对路径 relative_path = os.path.relpath(event.src_path, image_dir) # 重新计算图片文件的相对路径 static_path = os.path.join('static', relative_path) # 生成HTML内容 html_content = f'<img src="/{static_path}" alt="Image"><p>{modify_time}</p>' @route('/') def index(): response.content_type = 'text/html' return html_content @route('/static/<filepath:path>') def server_static(filepath): return static_file(filepath, root=web_root_dir) class StoppableServer(ServerAdapter): def run(self, handler): from wsgiref.simple_server import make_server, WSGIRequestHandler if self.quiet: class QuietHandler(WSGIRequestHandler): def log_request(*args, **kw): pass self.options['handler_class'] = QuietHandler self.server = make_server(self.host, self.port, handler, **self.options) self.server.serve_forever() def stop(self): self.server.shutdown() event_handler = MyHandler() observer = Observer() observer.schedule(event_handler, path=image_dir, recursive=False) observer.start() # 在一个新的线程中运行Bottle服务器 server = StoppableServer(host=httphost, port=httpport) threading.Thread(target=lambda: run(server=server)).start() try: while True: time.sleep(1) except KeyboardInterrupt: observer.stop() server.stop() observer.join()
[Unit] Description=Web Server for Pictures After=network.target [Service] ExecStart=/usr/bin/python3 /path/to/websrvpic.py Restart=always User=username Group=groupname Environment=PYTHONUNBUFFERED=1 [Install] WantedBy=multi-user.target
from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler import time import os from datetime import datetime import threading from bottle import route, run, response, ServerAdapter, static_file # 可配置的变量 image_dir = os.path.expanduser('~/www/img') web_root_dir = os.path.expanduser('~/www') httphost = '0.0.0.0' httpport = 8080 # index.html页面放入内存中 html_content = '' def gen_html(srcpath): global html_content # 获取文件修改时间 timestamp = os.path.getmtime(srcpath) modify_time = datetime.fromtimestamp( timestamp).strftime('%Y-%m-%d %H:%M:%S') # 获取相对路径 relative_path = os.path.relpath(srcpath, web_root_dir) # 重新计算图片文件的相对路径 static_path = os.path.join('static', relative_path) # 生成HTML内容 html_content = f'''<head> <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" /> <meta http-equiv="Pragma" content="no-cache" /> <meta http-equiv="Expires" content="0" /> </head> <img src="/{static_path}?t={int(time.time())}" alt="Image"><p>{modify_time}</p>''' class MyHandler(FileSystemEventHandler): def on_modified(self, event): global html_content if event.is_directory: return None if event.event_type == 'modified': gen_html(event.src_path) @route('/') def index(): global html_content print(html_content) response.content_type = 'text/html' return html_content @route('/static/<filepath:path>') def server_static(filepath): return static_file(filepath, root=web_root_dir) class StoppableServer(ServerAdapter): def run(self, handler): from wsgiref.simple_server import make_server, WSGIRequestHandler if self.quiet: class QuietHandler(WSGIRequestHandler): def log_request(*args, **kw): pass self.options['handler_class'] = QuietHandler self.server = make_server( self.host, self.port, handler, **self.options) self.server.serve_forever() def stop(self): self.server.shutdown() # 初始化页面,picture.jpg文件需存在 gen_html(f'{image_dir}/picture.jpg') print(html_content) # 启动文件监听 event_handler = MyHandler() observer = Observer() observer.schedule(event_handler, path=image_dir, recursive=False) observer.start() # 在一个新的线程中运行Bottle服务器 server = StoppableServer(host=httphost, port=httpport) threading.Thread(target=lambda: run(server=server)).start() try: while True: time.sleep(1) except KeyboardInterrupt: observer.stop() server.stop() observer.join()