Warm tip: This article is reproduced from serverfault.com, please click

model view controller-ASP.NET Core MVC 3.1应用程序无法访问Ubuntu 20.04.1上的路径

(model view controller - ASP.NET Core MVC 3.1 Application can not access path on Ubuntu 20.04.1)

发布于 2020-11-27 16:36:52

当我dotnet run进入.sln目录后通过启动项目时,此功能可以正常工作。如果我转到projectfolder/../bin/Release/netcoreapp3.1/publish并运行dotnet project.dll它仍然可以正常工作,但是如果我将此服务作为服务启动,则此功能将不起作用,并且catch会写以下行:

Access to the path '/home/.../projectfolder/uploaded-images/3713579a-5b47-48f7-8666-9e0b3ded3bb1.jpg' is denied.

private async Task<FileSaveResult> SaveImage(IFormFile imageFile)
{
    if (!Directory.Exists(IMAGEUPLOADPATH))
    {
        Directory.CreateDirectory(IMAGEUPLOADPATH);
    }
    string postedFileExtension = Path.GetExtension(imageFile.FileName);
    string newName = Guid.NewGuid().ToString() + postedFileExtension;
    string newPath = Path.Combine(IMAGEUPLOADPATH, newName);
    try
    {
        using var fileStream = new FileStream(newPath, FileMode.Create);
        await imageFile.CopyToAsync(fileStream);
        return new FileSaveResult
        {
            ContentType = imageFile.ContentType,
            PhysicalAddress = newPath,
            IsSuccess = true
        };
    }
    catch (Exception e)
    {
        Console.WriteLine(e.Message);
        return new FileSaveResult();
    }
}

这是我初始化的地方 IMAGEUPLOADPATH

public AdminController(..., IWebHostEnvironment environment,...)
{
    ...
    VIDEOUPLOADPATH = Path.Combine(environment.ContentRootPath, "uploaded-videos");
    IMAGEUPLOADPATH = Path.Combine(environment.ContentRootPath, "uploaded-images");
    ...
}

我通过此命令开始服务 sudo systemctl start myprojectname.service

这就是myprojectname.service文件的内容(我通常不知道这些行的含义)。

[Unit]
Description=.....

[Service]
WorkingDirectory=/home/..../myproject
ExecStart=/usr/bin/dotnet /home/.../myproject/bin/Release/netcoreapp3.1/publish/project.dll
Restart=always
RestartSec=10
ProtectHome=off
KillSignal=SIGINT
SyslogIdentifier=myproject
User=www-data
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false

[Install]
WntedBy=multi-user.target

我怎么解决这个问题?我正在通过ssh连接启动该项目。我无法关闭命令行,因为它会杀死应用程序。

Questioner
futur3fry
Viewed
11
futur3fry 2020-11-30 17:24:45

问题

uploaded-videosuploaded-images文件夹需要更多权限。NGINX无法访问这些文件夹。但是,当我们以sudo dotnetdotnet以我的情况启动它时 ,它具有root权限。

检查这是否是我们面临的问题

  1. 将目录更改为包含我们无法访问的文件夹的项目文件夹。

    cd .../.../projectfolder

  2. 列出带有-l参数的文件夹内容-l已添加以查看长列表。我添加| grep uploaded-以仅以开头的内容uploaded-

    ls -l - grep | uploaded-

    ls -l 看全部

    它打印出这样的东西

输出

drwxr-xr-x 2 root root  4096 Nov 27 16:01 uploaded-images
drwxr-xr-x 2 root root  4096 Nov 27 15:04 uploaded-videos

如我们所见,两个文件夹都具有以下权限: drwxr-xr-x

r-x 表示它具有读取和执行的权限,但没有写入权限。

解决方案

当你仍在项目文件夹中时。运行这些命令以向所需的文件夹添加写权限。就我而言,它看起来像这样。

sudo chmod a+rwx uploaded-videos/
sudo chmod a+rwx uploaded-images/

测试解决方案

让我们尝试再次运行此命令

ls -l

输出

drwxrwxrwx 2 root root  4096 Nov 27 16:01 uploaded-images
drwxrwxrwx 2 root root  4096 Nov 27 15:04 uploaded-videos

现在我们有 rwx代替r-x因此,我们已成功授予了写权限。

而且我已经测试了该应用程序,它可以正常工作。

这些更改后,我不必重新启动任何服务。