如何获取本地上传文件的创建/修改日期(无需服务器路径)
如何在不保存文件到服务器路径的前提下获取上传文件的修改/创建日期
浏览器默认不会将本地文件的修改/创建日期随表单一起提交到服务器,因此需要通过前端获取文件元数据并附加到表单,再由后端接收处理。以下是具体实现方案:
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
相关产品推荐
相关产品推荐

