【问题标题】:Get access to wwwroot folder in AWS Elastic Beanstalk .net core application访问 AWS Elastic Beanstalk .net 核心应用程序中的 wwwroot 文件夹
【发布时间】:2019-02-01 09:01:15
【问题描述】:

在过去的几天里,我一直在尝试为我的 EB .net 核心项目找出存储图像的最佳方式。当我最初开发它时,我只是将图像存储在wwwroot/images/{whatever I needed} 目录中。但是,我在部署后不久发现,该项目没有权限写入(并且可能读取,尚无法知道)该文件夹。

我得到的具体错误信息是"Access to the path 'C:\\inetpub\\AspNetCoreWebApps\\app\\wwwroot\\images' is denied

我尝试过集成 AWS 的 EFS,但我似乎也无法弄清楚。我添加了 AWS EB EFS 文档中提到的 storage-efs-mountfilesystem.config 文件,但无济于事。我不仅无法访问任何名为 /efs 的文件夹,我什至不确定这是正确的路径。

关于我看到的唯一可用选项是将所有图像作为 blob 存储在数据库中,我真的宁愿避免这样做。

我尝试使用此答案here 访问 wwwroot 文件夹,但我得到的响应似乎没有任何变化。

我已签订合同,需要尽快完成这项工作,而不是迟到。如果必须,我会走 db 路线,但这不是一个长期的选择。虽然它是一个小型应用程序,而且在可预见的未来只会有一个活跃用户。

文件上传代码如下:

[Route("Image"), HttpPost()]
    public async Task<ResponseInfo> SaveImage()
    {
        try
        {
            var file = Request.Form.Files.FirstOrDefault();
            if (file != null && file.Length > 0)
            {
                if (file.Length > _MaxFileSize)
                {
                    return ResponseInfo.Error($"File too large. Max file size is { _MaxFileSize / (1024 * 1024) }MB");
                }
                var extension = Path.GetExtension(file.FileName).ToLower();
                if (extension == ".png" || extension == ".jpg" || extension == ".jpeg" || extension == ".gif")
                {
                    var filename = String.Concat(DateTime.UtcNow.ToString("yyyy-dd-M--HH-mm-ss"), extension);
                    var basePath = Path.Combine(_Env.WebRootPath, "images", "tmp");
                    if (Directory.Exists(basePath) == false)
                    {
                        Directory.CreateDirectory(basePath);
                    }
                    using (var inputStream = new FileStream(Path.Combine(basePath, filename), FileMode.Create))
                    {
                        try
                        {
                            await file.CopyToAsync(inputStream);
                            return ResponseInfo.Success(filename);
                        }
                        catch (Exception ex)
                        {
                            ex.Log();
                            return ResponseInfo.Error("Failed to save image");
                        }
                    }
                }
                else
                {
                    return ResponseInfo.Error($"File type not accepted. Only PNG, JPG/JPEG, and gif are allowed");
                }
            }
        }
        catch (Exception ex) {
            return ResponseInfo.Error(ex.Message);
        }
        return ResponseInfo.Error("No files received.");
    }

如果重要的话,我正在运行最新的 VS 2017 社区。使用 AWS Toolkit for Visual Studio 2017 V1.14.4.1 发布到 aws。

【问题讨论】:

  • 您好!你找到解决办法了吗?
  • 您好!不,我没有。我最终将我的文件作为 blob 直接存储在数据库中。
  • 嘿!一种解决方法对我们有用。 :) 我会将其发布为答案。

标签: amazon-web-services .net-core amazon-elastic-beanstalk


【解决方案1】:

我可能会迟到,但这可能对其他人有所帮助。但是,我们无法访问 wwwroot,但我们创建了一个新目录并更改了我们的代码以从该路径访问文件。

我们在项目.ebextensions 中添加了一个文件夹,并在其下添加了一个文件dirAccess.config(名称可以不同)

dirAccess.conifg

commands:
  0_:
    command: 'if not exist "C:\\inetpub\\assets" mkdir C:\\inetpub\\assets'
  1_:
    command: 'icacls "C:\\inetpub\\assets" /grant "IIS APPPOOL\DefaultAppPool:(OI)(CI)F"'
  2_:
    command: 'icacls "C:\\inetpub\\assets"'

请确保此文件夹 (.ebextensions) 包含在发布 zip 中。

要将文件夹包含在发布中,需要在.csproj 中添加以下行

  <ItemGroup>
    <None Include=".ebextensions\alarms.config">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
    <None Include=".ebextensions\assetsDirectory.config">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
  </ItemGroup>

【讨论】:

    猜你喜欢
    • 2013-04-21
    • 2022-08-02
    • 2021-03-02
    • 2019-05-11
    • 2015-04-06
    • 2021-03-11
    • 1970-01-01
    • 2020-02-23
    • 2013-07-14
    相关资源
    最近更新 更多