C# 文件存储.net内核

C# 文件存储.net内核,c#,asp.net-core-webapi,C#,Asp.net Core Webapi,我正在使用项目中的文件夹上载文件 [HttpPost, DisableRequestSizeLimit] public IActionResult Upload() { try { var file = Request.Form.Files[0]; var folderName = Path.Combine("Resources", "Images"); var pathToSave = Path.Combine(Directory

我正在使用项目中的文件夹上载文件

[HttpPost, DisableRequestSizeLimit]
public IActionResult Upload()
{
    try
    {
        var file = Request.Form.Files[0];
        var folderName = Path.Combine("Resources", "Images");
        var pathToSave = Path.Combine(Directory.GetCurrentDirectory(), folderName);

        if (file.Length > 0)
        {
            var fileName = ContentDispositionHeaderValue.Parse(file.ContentDisposition).FileName.Trim('"');
            var fullPath = Path.Combine(pathToSave, fileName);
            var dbPath = Path.Combine(folderName, fileName);

            using (var stream = new FileStream(fullPath, FileMode.Create))
            {
                file.CopyTo(stream);
            }

            return Ok(new { dbPath });
        }
        else
        {
            return BadRequest();
        }
    }
    catch (Exception ex)
    {
        return StatusCode(500, $"Internal server error: {ex}");
    }
}
我想知道当我们为客户提供新的更新时,是否有丢失此文件的风险。 如果有更好的解决方案用于上传文件并在以后使用.net core获取文件链接,请让我知道:)

我想知道当我们为客户提供新的更新时,是否有丢失此文件的风险

部署应用程序意味着,您将把git中存储的新可执行文件(DLL)和其他文件复制到运行旧版本的地方。风险是,您将错误地执行此操作并删除数据目录

也就是说:您不应该将用户数据与应用程序中的可执行文件或其他文件(例如HTML中使用的图像等)一起保存。如果数据明显分开,那么处理(备份、部署等)就容易得多

如果有更好的解决方案

解决方案:将其保存在管理员可以配置的文件夹中。这可以使用所谓的选项来完成:

最终将得到一个存储路径的类

public class StorageOptions {
   public string BasePath {get;set;}
}

因此,最后我决定使用这个代码使用“aws S3 bucket”

PutObjectResponse response = null;

            using (var stream = new MemoryStream(fileBytes))
            {
                var request = new PutObjectRequest
                {
                    BucketName = bucket,
                    Key = "folder/" + fileName,
                    InputStream = stream,
                    ContentType = file.ContentType,
                    CannedACL = S3CannedACL.PublicRead,
                };

                response = await client.PutObjectAsync(request);
            };

正如您在评论中提到的,我可以在文件后面获得链接

,我建议将所有上传代码放在服务类中,这样可以更容易地测试,而不会使控制器膨胀。此外,如果要将文件保存到web服务器本身,则仅限于一个web服务器。您可能需要查看azure存储blob和一个数据库,以存储blob的url。Azure存储Blob将为您复制,因此您不必担心备份等问题。我考虑过这一点,但该公司正在使用aws,因此我尝试使用S3 bucket,但无法将其用于web api,因为它不提供指向文件的链接,您只能将其加载到您的计算机上。(这是我第一次尝试)如果您知道一种在web服务中使用s3 bucket的方法,那将非常有用。给定路径和文件,您应该能够通过第二次调用重建完整的url,第二个答案中的示例如下: