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

如何获取本地上传文件的创建/修改日期(无需服务器路径)

如何在不保存文件到服务器路径的前提下获取上传文件的修改/创建日期

浏览器默认不会将本地文件的修改/创建日期随表单一起提交到服务器,因此需要通过前端获取文件元数据并附加到表单,再由后端接收处理。以下是具体实现方案:


1. 前端修改:获取文件元数据并附加到表单

修改原HTML表单,添加JavaScript监听文件选择事件,提取每个文件的最后修改日期,生成隐藏字段随表单提交:

HTML代码

@using (Html.BeginForm("UploadFiles", "QuestionForm", FormMethod.Post, new { enctype = "multipart/form-data", id = "uploadForm" }))
{
    <input type="file" name="files" multiple="multiple" id="Button_select" />
    <!-- 用于存放文件元数据的隐藏字段容器 -->
    <div id="fileMetadataContainer"></div>
    <button type="submit">上传文件</button>
}

JavaScript代码

document.getElementById('Button_select').addEventListener('change', function(e) {
    const metadataContainer = document.getElementById('fileMetadataContainer');
    metadataContainer.innerHTML = ''; // 清空历史元数据

    // 遍历选中的所有文件
    Array.from(e.target.files).forEach((file, index) => {
        // 获取文件最后修改日期(转成标准ISO格式字符串)
        const lastModifiedDate = new Date(file.lastModified).toISOString();
        
        // 创建隐藏字段,与文件顺序一一对应
        const hiddenInput = document.createElement('input');
        hiddenInput.type = 'hidden';
        hiddenInput.name = `fileLastModifieds[${index}]`;
        hiddenInput.value = lastModifiedDate;
        
        metadataContainer.appendChild(hiddenInput);
    });
});

注意:前端无法跨浏览器可靠获取文件创建日期,File对象仅提供标准的lastModified属性(修改日期),部分浏览器的非标准属性(如Chrome的creationTime)不具备通用性,不建议依赖。


2. 后端修改:接收并解析文件元数据

在控制器方法中添加参数接收前端传递的日期数组,与上传的文件按顺序匹配,再将日期与文件内容一起保存到数据库:

控制器代码

[HttpPost("UploadFiles")]
public async Task<IActionResult> UploadFiles([Bind] QuestionModel modelVal, List<string> fileLastModifieds)
{
    var uploadedFiles = Request.Form.Files;
    if (uploadedFiles.Count == 0)
    {
        return BadRequest("未选择任何文件");
    }

    for (int i = 0; i < uploadedFiles.Count; i++)
    {
        IFormFile file = uploadedFiles[i];
        string lastModifiedStr = fileLastModifieds[i];

        // 解析ISO格式日期字符串为DateTime
        if (DateTime.TryParse(lastModifiedStr, out DateTime lastModifiedDate))
        {
            // 将文件内容转为字节数组(用于保存到数据库)
            byte[] fileContent;
            using (var memoryStream = new MemoryStream())
            {
                await file.CopyToAsync(memoryStream);
                fileContent = memoryStream.ToArray();
            }

            // 这里将文件名、修改日期、文件内容保存到数据库
            // 示例:
            // var dbFile = new DbFileEntity
            // {
            //     FileName = file.FileName,
            //     LastModified = lastModifiedDate,
            //     Content = fileContent
            // };
            // _dbContext.DbFiles.Add(dbFile);
        }
    }

    // 提交数据库更改
    // await _dbContext.SaveChangesAsync();
    return Ok("文件上传完成");
}

关键说明

  • 文件与日期的顺序一致性:前端按用户选择文件的顺序生成隐藏字段,后端遍历Request.Form.Files的顺序与之完全匹配,确保日期与文件一一对应。
  • 时区问题:使用toISOString()生成标准UTC日期字符串,后端解析时可自动处理时区转换,避免日期偏差。

内容的提问来源于stack exchange,提问作者cr7oo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 15:35:45