Net Core 3.0文件上传不起作用,但它在Net Core 2.2中运行良好



晚安,伙计们,我再次请求指导。我有一个文件上传,数据通过Ajax请求发送到Controller。它在.net Core 2.2中运行得很好,但我在.net Core 3.0 中遇到了问题

<th hidden><span id="m-aloc-freq">34</span></th>
<div class="input-group">
<input type="file" class="form-control" id="selectedFile" onchange="TrataUpload2(event)">
<span class="input-group-btn">
<input type="button" class="btn btn-secondary" value="Seleciona..." onclick="document.getElementById('selectedFile').click();" />
<button type="button" id="btnSalvar" class="btn btn-primary">
UPLOAD ARQUIVO
</button>
</span>
</div> 

我的Ajax请求

$('#btnSalvar').click(function () {
debugger;
var model = {
ParentId: $('#m-aloc-freq').text(),
Imagem: document.getElementById("selectedFile").src,
filename: filename
};
try {
$.ajax({
type: 'POST',
accepts: "application/json",
url: "/v1/ApiPrestador/Upload2",
data: JSON.stringify(model),
contentType: "application/json;",
success: function (data) {
console.info(data);
alert("Upload efetuado com sucesso!");
location.reload(true);

}
});
} catch (e) {
console.error(e.message);
}
});

我的Api控制器

[HttpPost("Upload2")]
public async Task<IActionResult> Upload2(FotoViewModel model)
{
try
{
if (model == null) return BadRequest("Arquivo não fornecido");
var filename = model.ParentId.ToString("00000000") + (new FileInfo(model.filename)).Extension;
var caminho = _hosting.ContentRootPath + @"wwwrootimagesdocprestadores" + filename;
var url = "/images/docprestadores/" + filename;
model.Imagem = model.Imagem.Substring(model.Imagem.LastIndexOf("base64,") + 7);
byte[] bytes = Convert.FromBase64String(model.Imagem);

System.IO.File.WriteAllBytes(caminho, bytes);
await _frequenciaRepository.UploadDocumento(url, model.ParentId);
return Ok(true);
}
catch (Exception ex)
{              
return BadRequest(ex.Message);
}
}

我需要的数据根本无法到达控制器。我已经放置了断点,它没有被触发,也就是说,请求没有到达控制器。

如何在中解决此问题。NET Core 3.0?

FromBody属性添加到控制器参数:

public async Task<IActionResult> Upload2 ([FromBody] FotoViewModel model)

根据您的代码,以下是我的工作演示中启动和控制器的路由配置,请检查差异:

从ajax url,您应该添加版本为4.0.0 的Microsoft版本控制包Microsoft.AspNetCore.Mvc.Versioning

启动.cs

public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddApiVersioning(o => {
o.ReportApiVersions = true;
o.AssumeDefaultVersionWhenUnspecified = true;
o.DefaultApiVersion = new ApiVersion(1, 0);
});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}

控制器

[ApiVersion("1")]
[Route("v{v:apiVersion}/[controller]")]
[ApiController]
public class ApiPrestadorController : ControllerBase
{
[HttpPost("Upload2")]
public async Task<IActionResult> Upload2(FotoViewModel model)
{
//the stuff you want
}
}

**更新:**这是我的测试演示链接,你可以参考。

最新更新