谁能告诉我如何将物理文件保存到配置提供的路径 - ASP.NET Core MVC

Can Anyone Show Me How to Save Physical Files to a Path Provided by Configuration - ASP.NET Core MVC

我是 ASP.NET Core 开发的新手。我正在尝试设置一个允许特定用户将文件上传到我的网络服务器的应用程序。我已成功将文件上传到临时目录,但想将文件保存在 'wwwroot/images' 而不是临时目录中。

这是处理文件上传的控制器列表:

        [HttpPost("FileUpload")]
        [DisableFormValueModelBinding]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Index(List<IFormFile> files)
        {

            long size = files.Sum(f => f.Length);

            var filePaths = new List<string>();
            foreach (var formFile in files)
            {
                if (formFile.Length > 0)
                {
                    /*full path to file in temp location*/
                    var filePath = Path.GetTempFileName();
                    filePaths.Add(filePath);


                    using (var stream = new FileStream(filePath, FileMode.Create))
                    {
                        await formFile.CopyToAsync(stream);

                    }
                }
            }

            /*
             * Process uploaded files. Don't rely on or trust the FileName
             * property without validation.
             */
            return Ok(new { count = files.Count, size, filePaths });

        }

如您所见,控制器将上传的文件存储到一个临时目录中。谁能告诉我如何手动指定存储文件的位置?

Startup.cs 包含以下代码:

/*To list physical files from a path provided by configuration:*/
                var physicalProvider = new PhysicalFileProvider(Configuration.GetValue<string>("StoredFilesPath"));
                services.AddSingleton<IFileProvider>(physicalProvider);

我相信这两行允许我指定我希望将上传的文件保存到哪个目录,作为我的 appsettings.json 文件中的字符串:

/wwwroot/images

如上所述,我对 ASP.NET 核心 Web 开发还很陌生。因此,如果我忘记包含任何相关信息,请让我知道我的帖子中缺少什么,我会尽力更新我的列表。如果有人能为我提供有关如何实现此功能的指导,我将不胜感激。

感谢您的帮助。

IHostingEnvironmentwebRoot 给出了 wwwroot 的路径。在文件名后附加 webRoot 以获取文件路径。

string folder = env.webRoot;
string fileName = ContentDispositionHeaderValue.Parse(formFile.ContentDisposition).FileName.Trim('"');
string fullPath = Path.Combine(folder, fileName);

注意:env作为参数注入到构造函数中。

在这种情况下,您不需要 PhysicalFileProvider。您可以轻松注入 IWebHostEnvironment(在以前的 asp.net 核心版本中是 IHostingEnvironment,现在已弃用)。

public string _rootPath;
public HomeController(IHostingEnvironment env)
{
    _rootPath = env.WebRootPath;
}

然后在您的 Index 操作方法中只需替换此行:

var filePath = Path.GetTempFileName();

有了这个:

var filePath = Path.Combine(_rootPath, formFile.FileName);

在 Path.Combine 中,如果您想存储在 wwwroot 中的某处,并动态执行此操作,则以 files\images\thumbnailsfiles/images/thumbnails 格式在 _webRootPath 和文件名之间添加一个参数。这会将数据存储在您的 wwwroot/files/images/thumbnails.

此示例特定于 wwwroot 如果您想存储到外部的某个其他目录,请将行 _rootPath = env.WebRootPath; 更改为 _rootPath = env.ContentRootPath;