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

ASP.NET 5通过POST请求实现本地文件存储及属性自动赋值问题

问题1 解答

可以实现,需要先明确一个前提:如果你传入的ContentPath是客户端本地的文件路径,API无权直接访问客户端的文件系统,这个场景需要前端先把文件以multipart/form-data格式上传到API端再处理。如果ContentPath是API服务器可直接访问的路径(比如服务器临时目录、同服务器其他业务目录的路径),最简单的实现方式如下:

  1. 先在控制器中注入IWebHostEnvironment服务,用来获取解决方案本地目录的路径
  2. 校验ContentPath的合法性,避免路径遍历攻击,同时确认源文件真实存在
  3. 拼接目标存储路径(一般放在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 10:12:01