Asp.Net Core -上传文件到数据库与ajax



我试图上传一个文件,将其发送到ajax控制器并将其保存在数据库中。如果没有Ajax,它可以完美地工作,但是当我在控制器中使用Ajax提交代码时,我得到一个0结果,并且无法将文件保存到DB中。

下面是我的代码:观点:

<form method="post" id="uploadForm" enctype="multipart/form-data" asp-action="UploadFile">

<div class="k-content">
@(Html.Kendo().Upload()
.Name("files")
.Multiple(true)
.Messages(m=>m.Select("Select"))
.Validation(validation => validation
.AllowedExtensions(new string [] { ".doc", ".docx", ".pdf", ".txt"})
.MaxFileSize(5242880)
)
.HtmlAttributes(new { aria_label = "files"})
)
<p style="padding-top: 1em; text-align: right">
<button type="submit" id="uploadfile" class="btn btn-outline-primary rounded-pill">Upload</button>
</p>
</div>
</form>
ajax调用:

$("#uploadfile").click(function (e) {
e.preventDefault();
var fileUpload = $("#addfile").data("kendoUpload"),
files = fileUpload.getFiles();
var filedata = new FormData();

for (var i = 0; i < files.length; i++) {
filedata.append(files[i].name, files[i]);
}
$.ajax({
type: "POST",
url: '@Url.Action("UploadFile")',
contentType: false,
processData: false,
data: filedata,
success: function (message) {
alert(message);
},
error: function (xhr, status, error) {
alert(error);
},
});
});

和控制器,没有ajax工作得很好,但当数据与ajax提交时,我得到0结果的filedata

[HttpPost]
public async Task<IActionResult> UploadFile(IEnumerable<IFormFile> filedata)
{
foreach (var f in filedata)
{
if (f != null)
{
if (f.Length > 0)
{
var fileName = Path.GetFileName(f.FileName);
var fileExtension = Path.GetExtension(fileName);
var objfiles = new FileUpload
{
FileName = fileName,
FileType = fileExtension,
FileSize = f.Length,
CretedOn = DateTime.UtcNow,
};
using (var target = new MemoryStream())
{
f.CopyTo(target);
objfiles.FileData = target.ToArray();
}
_context.FileUploads.Add(objfiles);
}
}
else
{
return Ok(false);
}
}
await _context.SaveChangesAsync();
return Ok(true);
}

您应该使用rawFile,因为它保存实际的文件数据。密钥名称应与接收参数相对应。

for (var i = 0; i < files.length; i++) {
filedata.append("filedata", files[i].rawFile);
}

简单完整的解决方案如下

<js代码/strong>

var fileupload = $("#FileUpload").get(0);
var files = fileupload.files;
var formData = new FormData();
for (var i = 0; i < files.length; i++) {
formData.append('files', files[i]);
}

controller使用IFormFile代替IEnumerable

public IActionResult UploadFile(IFormFile files)
{
**for storing in your project folder**
string filePath = "";
if (files != null) {
string uploadsFolder = Path.Combine(_webHostEnvironment.WebRootPath, "uploads");
filePath = Path.Combine(uploadsFolder, files.FileName);
using(var fileStream = new FileStream(filePath, FileMode.Create))
{
files.CopyTo(fileStream);
}
}