Получите доступ к папке wwwroot в основном приложении AWS Elastic Beanstalk .net - PullRequest
0 голосов
/ 26 августа 2018

В последние пару дней я пытался найти лучший способ хранения изображений для моего основного проекта EB .net. Когда я его изначально разрабатывал, я просто сохранял изображения в каталогах wwwroot/images/{whatever I needed}. Однако вскоре после развертывания я обнаружил, что у проекта нет разрешения на запись (и, вероятно, на чтение, пока нет возможности узнать) эту папку.

Я получаю конкретное сообщение об ошибке "Access to the path 'C:\\inetpub\\AspNetCoreWebApps\\app\\wwwroot\\images' is denied

Я пытался интегрировать EFS AWS, но, похоже, не могу этого понять. Я добавил файл storage-efs-mountfilesystem.config, упомянутый в документации AWS EB EFS, но безрезультатно. Я не только не имею доступа ни к одной папке с именем /efs, я даже не уверен, что это правильный путь.

О единственной доступной опции, которую я вижу, - это сохранение всех изображений в виде BLOB-объектов в БД, чего я действительно предпочел бы избежать.

Я попытался получить доступ к папке wwwroot, используя этот ответ здесь , но, похоже, в ответе, который я получаю, нет никаких изменений.

У меня контракт, и мне нужно, чтобы это работало раньше, а не позже. Если я должен, я пойду по маршруту БД, но вряд ли это долгосрочный вариант. Хотя это небольшое приложение, и в обозримом будущем у него будет только один активный пользователь.

Код для загрузки файла на тот случай, если он вам нужен, приведен ниже:

[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 Community. Публикация в aws с использованием AWS Toolkit for Visual Studio 2017 V1.14.4.1.

...