You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 7 文件上传至控制器时Ubuntu服务器出现CORS错误(已解决)

问题已解决

我找到问题并最终修复了它!原因是我没有在Ubuntu中为www-data用户设置权限。只需运行命令sudo chown -R www-data /var/www/abc.vn/wwwroot/uploads,配合我上面编写的上传API,问题就解决了!


部署后FormData上传遭遇CORS错误

本地环境(Windows + IIS)运行正常,但部署到Ubuntu 22 + Nginx服务器后,上传FormData到控制器时触发CORS错误:

从源地址'http://central.abc.vn'访问'http://api.abc.vn/OnPostUpload'时被CORS策略阻止:请求的资源上不存在'Access-Control-Allow-Origin'标头。如果您需要不透明响应,请将请求的mode设置为'no-cors'以禁用CORS获取资源。

前端请求代码

let formData = new FormData();
formData.append('FileDetails', e.target.files[0]);
formData.append('FileName', e.target.files[0].name);
formData.append('TenantId', localStorage.getItem('TenantId'));
fetch(API_URL + 'OnPostUpload',
{
    method: 'POST',
    headers: {
        'Accept': 'application/json',
        'TenantId': localStorage.getItem('TenantId'),
        'Token': localStorage.getItem("Token")
    },
    body: formData
})

后端上传API代码

[HttpPost]
[Route("/OnPostUpload")]
public async Task<IActionResult> OnPostUploadAsync([FromForm] FileUploadModel data)
{
    if (data == null)
    {
        return new JsonResult(false);
    }

    if (data != null)
    {
        string path = Path.GetFullPath(Path.Combine(Environment.CurrentDirectory, @"wwwroot/uploads/" + data.TenantId + "/"));
        if (!Directory.Exists(path))
        {
            Directory.CreateDirectory(path);
        }

        var fileName = Guid.NewGuid().ToString("N") + Path.GetExtension(data.FileName);
        var absolutePath = Path.Combine(path, fileName);

        var appfile = await _repository.AddAsync(new AppFile()
        {
            FileName = data.FileName,
            Path = absolutePath,
            TenantId = data.TenantId,
        });
        await _repository.SaveChangesAsync();

        using (var fileStream = new FileStream(absolutePath, FileMode.Create))
        {
            await data.FileDetails.CopyToAsync(fileStream);
        }
        return new JsonResult(new { Path = "uploads/" + data.TenantId + "/" + fileName, AppFileId = appfile.Id });
    }
    return new JsonResult(false);
}

FileUploadModel 定义

public class FileUploadModel
{
    public IFormFile FileDetails { get; set; }
    public string FileName { get; set; }
    public string TenantId { get; set; }
}

已尝试的解决方案

  • 调整文件上传大小限制为100M,无效
  • 在Program.cs中配置CORS,仅本地生效,服务器上无效:
    builder.Services.AddCors(options =>
    {
    options.AddPolicy(DefaultCorsPolicyName, builder =>
    {
    builder.WithOrigins("https://localhost:44460",
    "http://central.abc.vn",
    "http://demo.abc.vn")
    .AllowAnyHeader()
    .AllowAnyMethod()
    .AllowCredentials();
    });
    });
    
  • 在API方法上添加[EnableCors]特性,无效

内容的提问来源于stack exchange,提问作者Ryan can fly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 13:05:11