ASP.NET 5通过POST请求实现本地文件存储及属性自动赋值问题
问题1 解答
可以实现,需要先明确一个前提:如果你传入的ContentPath是客户端本地的文件路径,API无权直接访问客户端的文件系统,这个场景需要前端先把文件以multipart/form-data格式上传到API端再处理。如果ContentPath是API服务器可直接访问的路径(比如服务器临时目录、同服务器其他业务目录的路径),最简单的实现方式如下:
- 先在控制器中注入
IWebHostEnvironment服务,用来获取解决方案本地目录的路径 - 校验
ContentPath的合法性,避免路径遍历攻击,同时确认源文件真实存在 - 拼接目标存储路径(一般放在
wwwroot下的专用目录,或者项目根目录的自定义文件夹),调用文件拷贝方法完成存储
对应的示例代码如下:
using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc; [ApiController] [Route("api/[controller]")] public class VideoController : ControllerBase { private readonly IWebHostEnvironment _webHostEnv; // 注入IWebHostEnvironment public VideoController(IWebHostEnvironment webHostEnv) { _webHostEnv = webHostEnv; } [HttpPost] public IActionResult AddVideo([FromBody] Video requestVideo) { // 校验路径合法性 if (!Path.IsPathRooted(requestVideo.ContentPath) || !File.Exists(requestVideo.ContentPath)) { return BadRequest("传入的ContentPath无效或对应文件不存在"); } // 定义解决方案内的存储目录,这里以wwwroot/uploads/videos为例 var saveRootPath = Path.Combine(_webHostEnv.WebRootPath, "uploads", "videos"); // 目录不存在则创建 if (!Directory.Exists(saveRootPath)) { Directory.CreateDirectory(saveRootPath); } // 生成唯一目标文件名,避免重名覆盖 var fileName = $"{requestVideo.VideoId}_{Path.GetFileName(requestVideo.ContentPath)}"; var fullSavePath = Path.Combine(saveRootPath, fileName); // 拷贝文件到目标路径 File.Copy(requestVideo.ContentPath, fullSavePath, overwrite: true); // 可选:将存储后的相对路径赋值回ContentPath,方便后续访问 requestVideo.ContentPath = Path.Combine("uploads", "videos", fileName); // 这里省略后续将Video对象存入数据库的逻辑 return Ok(requestVideo); } }
注意:生产环境建议不要把上传文件存在解决方案目录下,避免发布新版本时覆盖历史上传文件,优先使用独立存储目录或者对象存储服务。
问题2 解答
可以自动赋值,只需要在确认文件存在后,通过FileInfo类读取文件的Length属性直接赋值即可,在上面的示例代码中补充一行逻辑就行:
// 自动赋值SizeInBytes var fileInfo = new FileInfo(requestVideo.ContentPath); requestVideo.SizeInBytes = fileInfo.Length;
如果是前端直接上传文件的场景,不需要传ContentPath,直接接收IFormFile对象即可,IFormFile自带Length属性可以直接获取文件大小。
内容的提问来源于stack exchange,提问作者Matheus Reis
相关产品推荐
相关产品推荐

