【问题标题】:file storage .net core文件存储.net核心
【发布时间】:2020-08-05 15:35:18
【问题描述】:

我正在使用项目中的文件夹来上传文件。

[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 获取文件链接,请告诉我:)

【问题讨论】:

  • 我建议将所有上传代码放在一个服务类中,这样可以更容易测试并且不会使控制器膨胀。此外,如果您要将文件保存到 Web 服务器本身,则仅限于一台 Web 服务器。您可能想查看 azure 存储 blob 和一个数据库来将 url 存储到 blob。将为您复制 Azure 存储 blob,因此您不必担心备份等问题。
  • 我想过这个,但公司正在使用 aws,所以我尝试使用 S3 存储桶,但我无法将它用于 web api,因为它没有为您提供指向您的文件的链接只能下载到你的机器上。 (这是我的第一次尝试)如果您知道在 Web 服务中使用 s3 存储桶的方法会很有帮助
  • docs.aws.amazon.com/AmazonS3/latest/dev/HLuploadFileDotNet.html。给定路径和文件,您应该能够通过第二次调用重建完整的 url,例如在第二个答案中:stackoverflow.com/questions/10975475/…

标签: c# asp.net-core-webapi


【解决方案1】:

我想知道当我们为客户提供新更新时是否存在丢失这些文件的风险

部署应用程序意味着,您将把新的可执行文件 (dll) 和存储在 git 中的其他文件复制到运行旧版本的位置。风险是,你会做错并删除数据目录。

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

如果有更好的解决方案

解决方案:将其保存在管理员可以配置的文件夹中。这可以使用所谓的选项来完成:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/options?view=aspnetcore-3.1

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

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

【讨论】:

    【解决方案2】:

    所以最后我决定使用此代码使用“aws S3 存储桶”

    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);
                };
    

    正如你在 cmets 中提到的,我可以在之后获取文件的链接

    【讨论】:

      猜你喜欢
      • 2017-03-08
      • 1970-01-01
      • 2011-05-30
      • 1970-01-01
      • 1970-01-01
      • 2011-03-21
      • 1970-01-01
      • 2017-10-23
      相关资源
      最近更新 更多