使用ASP.NET Core 8.0上传文件在Windows上运行良好,但在Ubuntu 22.04中失败

0sgqnhkj  于 12个月前  发布在  .NET
关注(0)|答案(1)|浏览(136)

我使用Windows操作系统和Visual Studio开发Web应用程序。我使用Ubuntu Server 22.04(LTS)作为生产操作系统。我可以在Ubuntu 22.04上运行我的应用程序,它工作正常,但客户端可以上传文件的应用程序部分不工作,并导致错误500。不幸的是,我在Windows上开发我的应用程序,我无法调试它。经过大量的试验,我发现部分原因错误500.以下是我用于上传文件的代码部分:

[HttpPost]
[Authorize]
public async Task<IActionResult> UploadNewPmFile(IList<IFormFile> uploadedFile)
{
    .
    .
    .
    var fileName = Path.GetFileName(file.FileName);
    var fileExtension = Path.GetExtension(fileName);
    var newFileName = string.Concat(userId, fileExtension);
    var path = Path.Combine(Directory.GetCurrentDirectory(), @"wwwroot\Data\Temp", newFileName);

    using (var stream = new FileStream(path, FileMode.Create)) //***Error is here***
    {
        await file.CopyToAsync(stream);
    }
    .
    .
    .
}

字符串
正如你所看到的,using部分在Ubuntu上导致错误500,但它在Windows上工作正常。我在Windows和Ubuntu上都使用.NET 8.0运行时。我在这个网站上搜索了很多问题,但我找不到任何与此相关的内容。我如何解决这个问题?

**更新:**请注意,已发布的应用程序在Windows上运行正常,没有错误,但文件上传部分在Ubuntu上不起作用。

dwthyt8l

dwthyt8l1#

Linux/Unix使用/作为目录路径字符,而Windows使用\。有关详细信息,请参阅Path.DirectorySeparatorChar
OP中的代码包含:

var path = Path.Combine(Directory.GetCurrentDirectory(), @"wwwroot\Data\Temp", newFileName);

字符串
可以删除\并将代码重写为:

Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "Data", "Temp", newFileName);


这将允许Path.Combine为代码运行的操作系统使用正确的目录分隔符。
有关远程调试的信息,请参见Debug .NET Core on Linux using SSH by attaching to a process

相关问题