如何在Python中获取文件存入S3前的原始创建日期?
实现思路与代码示例
核心逻辑
要保留文件的原始创建/修改时间,必须在文件上传至S3前读取本地文件的元数据,再将该时间作为自定义元数据附加到S3对象中——因为S3默认的LastModified字段是上传时刻的时间,无法保留原始文件的时间戳。
方案1:本地Python读取原始时间并上传
不同操作系统的文件创建时间获取方式有差异,需做跨平台兼容:
- Windows:通过
os.stat()的st_ctime获取文件创建时间 - macOS/Linux:优先用
os.stat()的st_birthtime获取创建时间;若部分Linux发行版不支持该字段,可退而求其次使用st_mtime(文件最后修改时间,通常与创建时间接近)
读取到时间后,上传时将其存入S3的自定义元数据(比如original-created-at)。
示例代码:
import os import boto3 from datetime import datetime def get_original_file_time(file_path): stat_info = os.stat(file_path) try: # macOS/Linux优先取创建时间 timestamp = stat_info.st_birthtime except AttributeError: # Windows用st_ctime,Linux fallback到修改时间 timestamp = stat_info.st_ctime if os.name == 'nt' else stat_info.st_mtime # 转为ISO格式字符串,方便存储和解析 return datetime.fromtimestamp(timestamp).isoformat() def upload_to_s3_with_original_time(file_path, bucket_name, s3_key): s3 = boto3.client('s3') original_time = get_original_file_time(file_path) # 上传文件并附加自定义元数据 s3.upload_file( file_path, bucket_name, s3_key, ExtraArgs={ 'Metadata': { 'original-created-at': original_time } } ) # 验证:读取S3对象的自定义元数据 response = s3.head_object(Bucket=bucket_name, Key=s3_key) print("原始创建时间:", response['Metadata']['original-created-at']) # 调用示例 upload_to_s3_with_original_time("test_audio.mp3", "your-bucket-name", "audio/test_audio.mp3")
方案2:前端配合获取原始时间(浏览器上传场景)
如果是用户通过浏览器上传文件,前端File对象自带lastModified属性(对应本地文件的最后修改/创建时间),可先将该时间传给后端,再由后端附加到S3元数据中:
- 前端代码(JavaScript):
const fileInput = document.getElementById('audio-file'); fileInput.addEventListener('change', (e) => { const file = e.target.files[0]; const originalTime = new Date(file.lastModified).toISOString(); // 封装文件和原始时间到FormData const formData = new FormData(); formData.append('audio', file); formData.append('originalCreatedAt', originalTime); // 发送到后端上传接口 fetch('/upload', { method: 'POST', body: formData }); });
- 后端Python代码(以Flask为例):
from flask import Flask, request import boto3 app = Flask(__name__) s3 = boto3.client('s3') @app.route('/upload', methods=['POST']) def upload(): file = request.files['audio'] original_time = request.form['originalCreatedAt'] s3_key = f"audio/{file.filename}" s3.upload_fileobj( file, "your-bucket-name", s3_key, ExtraArgs={ 'Metadata': { 'original-created-at': original_time } } ) return "上传成功" if __name__ == '__main__': app.run()
注意事项
- 自定义元数据的键名可自定义,S3会自动为其添加
x-amz-meta-前缀 - 若依赖
st_mtime,需注意用户可能修改过文件,但这是无法避免的,除非能获取系统级的原始创建时间 - 确保S3桶权限允许上传时附加元数据,以及后续读取元数据的权限
内容的提问来源于stack exchange,提问作者Atul Deshpande
相关产品推荐
相关产品推荐

