.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
相关产品推荐
相关产品推荐

