您如何 post 将图像文件发送到 asp.net 核心 5 中的 api 控制器? (415 错误)
how do you post an image file to an api controller in asp.net core 5? (415 error)
我正在尝试使用 entity framework.
在我的 ASP.net Core 5 Web 应用程序中实现 Filepond 图像上传器
我无法将上传的图片保存到服务器。
对 Api 控制器的 post 请求出错,出现 415“不支持的媒体类型”错误。
来自 Api 控制器构造函数的代码被命中,但 Create 方法中的代码没有被命中。
javascript 文件:
const inputElement = document.querySelector('input[type="file"]');
const pond = FilePond.create(inputElement);
FilePond.setOptions({
server: {
url: "/SaveImage/",
process: (fieldName, file, metadata, load, error, progress, abort) => {
const formData = new FormData();
formData.append(fieldName, file, file.name);
formData.append("CaseId", "@Model.CaseId");
const request = new XMLHttpRequest();
request.open('POST', '/SaveImage/');
request.upload.onprogress = (e) => {
progress(e.lengthComputable, e.loaded, e.total);
};
request.onload = function () {
if (request.status >= 200 && request.status < 300) {
load(request.responseText);
}
else {
error('Error during Image Upload');
}
};
request.send(formData);
return {
abort: () => {
request.abort();
abort();
}
};
},
}
})
Api 控制器:
[Route("[controller]")]
[ApiController]
public class saveImageController : ControllerBase
{
private readonly NoPainNoGameDbContext _context;
public saveImageController(NoPainNoGameDbContext context)
{
_context = context;
}
[HttpPost]
public async Task<ActionResult> Create([FromForm] Models.GameImage doc, [FromForm] List<IFormFile> files)
{
if (files != null && doc.CaseId != 0)
{
foreach (var file in files)
{
doc.Guid = Guid.NewGuid().ToString();
doc.ImageName = file.FileName.Split('.').FirstOrDefault();
doc.FileType = file.FileName.Split('.').LastOrDefault().ToLower();
doc.CreatedOn = DateTime.Now;
doc.FileSize = file.Length;
_context.GameImages.Add(doc);
await _context.SaveChangesAsync();
}
return Ok(doc.Guid);
}
else
{
return BadRequest("The file is null");
}
}
}
输入
<input type="file" multiple class="filepond" id="imageUploader" name="files">
我以前从未使用过 FilePond,但我设法使用您提供的代码重现了您的问题。您需要做的就是在您的操作参数上使用 [FromForm]
属性,即
public async Task<ActionResult> Create([FromForm] Models.GameImage doc, [FromForm] List<IFormFile> files)
您没有提供您的 input[type='file']
的外观,但它还应该具有与操作参数 files
(List<IFormFile> files
) 匹配的 name
属性,即你的 input[type='file]
应该有一个 name='files'
属性(如果它还没有的话)。
此外,我不建议将您的实体作为操作参数传递,随着项目的进展,它往往会出现问题。相反,您应该使用 DTO,什么是数据传输对象 (DTO)?
我正在尝试使用 entity framework.
在我的 ASP.net Core 5 Web 应用程序中实现 Filepond 图像上传器我无法将上传的图片保存到服务器。
对 Api 控制器的 post 请求出错,出现 415“不支持的媒体类型”错误。
来自 Api 控制器构造函数的代码被命中,但 Create 方法中的代码没有被命中。
javascript 文件:
const inputElement = document.querySelector('input[type="file"]');
const pond = FilePond.create(inputElement);
FilePond.setOptions({
server: {
url: "/SaveImage/",
process: (fieldName, file, metadata, load, error, progress, abort) => {
const formData = new FormData();
formData.append(fieldName, file, file.name);
formData.append("CaseId", "@Model.CaseId");
const request = new XMLHttpRequest();
request.open('POST', '/SaveImage/');
request.upload.onprogress = (e) => {
progress(e.lengthComputable, e.loaded, e.total);
};
request.onload = function () {
if (request.status >= 200 && request.status < 300) {
load(request.responseText);
}
else {
error('Error during Image Upload');
}
};
request.send(formData);
return {
abort: () => {
request.abort();
abort();
}
};
},
}
})
Api 控制器:
[Route("[controller]")]
[ApiController]
public class saveImageController : ControllerBase
{
private readonly NoPainNoGameDbContext _context;
public saveImageController(NoPainNoGameDbContext context)
{
_context = context;
}
[HttpPost]
public async Task<ActionResult> Create([FromForm] Models.GameImage doc, [FromForm] List<IFormFile> files)
{
if (files != null && doc.CaseId != 0)
{
foreach (var file in files)
{
doc.Guid = Guid.NewGuid().ToString();
doc.ImageName = file.FileName.Split('.').FirstOrDefault();
doc.FileType = file.FileName.Split('.').LastOrDefault().ToLower();
doc.CreatedOn = DateTime.Now;
doc.FileSize = file.Length;
_context.GameImages.Add(doc);
await _context.SaveChangesAsync();
}
return Ok(doc.Guid);
}
else
{
return BadRequest("The file is null");
}
}
}
输入
<input type="file" multiple class="filepond" id="imageUploader" name="files">
我以前从未使用过 FilePond,但我设法使用您提供的代码重现了您的问题。您需要做的就是在您的操作参数上使用 [FromForm]
属性,即
public async Task<ActionResult> Create([FromForm] Models.GameImage doc, [FromForm] List<IFormFile> files)
您没有提供您的 input[type='file']
的外观,但它还应该具有与操作参数 files
(List<IFormFile> files
) 匹配的 name
属性,即你的 input[type='file]
应该有一个 name='files'
属性(如果它还没有的话)。
此外,我不建议将您的实体作为操作参数传递,随着项目的进展,它往往会出现问题。相反,您应该使用 DTO,什么是数据传输对象 (DTO)?