如何获取Flask-WTF上传文件的最后修改时间
获取Flask-WTF上传文件的最后修改时间
嘿,这个问题我刚好处理过!Flask-WTF的FileField返回的是Werkzeug的FileStorage对象,它本身并没有直接提供文件的最后修改时间——毕竟上传的文件是从客户端发过来的,服务器默认拿不到客户端本地的文件修改时间。不过分两种场景,我给你详细说:
场景1:获取客户端本地文件的最后修改时间
服务器本身没办法直接拿到客户端文件的修改时间,得靠前端把这个信息一起提交过来。这里可以用JavaScript读取文件的lastModified属性,然后通过隐藏字段传给后端。
步骤:
- 修改表单:在Flask-WTF表单里加一个
HiddenField用来存修改时间 - 前端处理:用JS监听文件选择事件,获取选中文件的
lastModified,填入隐藏字段 - 后端接收:在视图里从表单的隐藏字段拿到这个时间戳,转成你需要的格式
代码示例:
表单定义(forms.py)
from flask_wtf import FlaskForm from wtforms import FileField, SubmitField, HiddenField from wtforms.validators import DataRequired class UploadForm(FlaskForm): image = FileField('上传图片', validators=[DataRequired()]) file_mtime = HiddenField('文件修改时间') submit = SubmitField('上传')
前端模板(upload.html)
<form method="POST" enctype="multipart/form-data"> {{ form.hidden_tag() }} {{ form.image.label }} {{ form.image() }} {{ form.file_mtime() }} {{ form.submit() }} </form> <script> // 监听文件选择事件 document.querySelector('#image').addEventListener('change', function(e) { const file = e.target.files[0]; if (file) { // 把文件的最后修改时间戳填入隐藏字段(注意JS时间戳是毫秒级) document.querySelector('#file_mtime').value = file.lastModified; } }); </script>
后端视图(app.py)
from flask import Flask, render_template from forms import UploadForm import datetime app = Flask(__name__) app.config['SECRET_KEY'] = 'your-secret-key-here' @app.route('/upload', methods=['GET', 'POST']) def upload(): form = UploadForm() if form.validate_on_submit(): # 将毫秒级时间戳转成datetime对象 mtime_timestamp = int(form.file_mtime.data) / 1000 mtime = datetime.datetime.fromtimestamp(mtime_timestamp) print(f"客户端文件最后修改时间:{mtime}") # 这里可以继续处理文件保存逻辑 # image_file = form.image.data # image_file.save('path/to/save/image.jpg') return "上传成功!" return render_template('upload.html', form=form) if __name__ == '__main__': app.run(debug=True)
场景2:文件保存到服务器后,获取服务器上文件的修改时间
如果是想获取文件保存到服务器本地后的最后修改时间,那和普通文件一样,用os.path.getmtime()就可以了,前提是你已经把文件保存到了服务器的某个路径下。
代码示例(app.py)
import os from flask import Flask, render_template from forms import UploadForm import datetime app = Flask(__name__) app.config['SECRET_KEY'] = 'your-secret-key-here' UPLOAD_FOLDER = 'uploads' os.makedirs(UPLOAD_FOLDER, exist_ok=True) @app.route('/upload', methods=['GET', 'POST']) def upload(): form = UploadForm() if form.validate_on_submit(): image_file = form.image.data # 生成服务器本地的保存路径 save_path = os.path.join(UPLOAD_FOLDER, image_file.filename) # 保存文件到服务器 image_file.save(save_path) # 获取服务器上文件的最后修改时间 mtime_timestamp = os.path.getmtime(save_path) mtime = datetime.datetime.fromtimestamp(mtime_timestamp) print(f"服务器文件最后修改时间:{mtime}") return "上传成功!" return render_template('upload.html', form=form)
注意事项:
- 客户端的修改时间依赖前端JS的支持,主流浏览器都兼容
File.lastModified,但旧浏览器可能存在兼容性问题 - 服务器上的修改时间是文件保存到服务器后的时间,如果你后续修改了这个文件,
getmtime会返回最新的修改时间
内容的提问来源于stack exchange,提问作者tomasn4a
相关产品推荐
相关产品推荐

