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

如何在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元数据中:

  1. 前端代码(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 });
});
  1. 后端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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 19:31:02