如何使用 FormData 将文件提交到 MVC Action
How to submit files to MVC Action using FormData
我正在创建一个 ASP.NET Core 6 文件上传应用程序。这是我的代码:
表格
<form asp-controller="Home" asp-action="UploadFiles" method="post" enctype="multipart/form-data" id="uploadForm">
<input type="file" class="form-control-file" multiple name="files">
@foreach (var folder in @Model.Folders)
{
<input id="filePathUrl" type="radio" asp-for="Folders" value="@folder" />
@folder
}
<button type="submit" class="btn custom-button">Upload Files</button>
jQuery
function processFiles(confirmOverwrite = false){
const filePath = $("#filePathUrl").val();
const fileList = $(".form-control-file")[0].files;
const files = Array.from(fileList);
let formData = new FormData();
files.forEach(file => formData.append("files[]", file));
const URL = '@Url.Action("UploadFiles", "Home")';
$.ajax({
url: URL + '?folders=' + filePath + '&confirmOverwrite=' + confirmOverwrite,
type: 'post',
data: formData,
// dataType: 'json',
contentType: false,
processData: false,
...
MVC 动作
[HttpPost]
public async Task<JsonResult> UploadFiles(IEnumerable<IFormFile> files, string folders, bool confirmOverwrite = false)
{
List<string> existingFiles = new();
var filesToBeSaved = new List<(IFormFile file, string filePath)>();
foreach (var file in files)
{
string trimmedFileName = file.FileName.Replace(" ", "");
var filePath = Path.Combine(folders, trimmedFileName);
if (System.IO.File.Exists(filePath) && !confirmOverwrite)
{
existingFiles.Add(file.FileName + "(" + trimmedFileName + ")");
}
else
{
filesToBeSaved.Add((file, filePath));
}
}
...
我删除了很多代码以保持相关性和简单性。
为什么我提交表单时文件参数显示为空?
模型绑定按名称绑定参数。您的后台 IEnumerable<IFormFile> files
名称是 files
。
所以您需要像下面这样更改您的代码:
files.forEach(file => formData.append("files", file));
此外,我知道您可能希望通过数组索引 post 它。仅对于复杂列表模型类型,您可能需要 post,例如:model[index].PropertyName
。参考.
我正在创建一个 ASP.NET Core 6 文件上传应用程序。这是我的代码:
表格
<form asp-controller="Home" asp-action="UploadFiles" method="post" enctype="multipart/form-data" id="uploadForm">
<input type="file" class="form-control-file" multiple name="files">
@foreach (var folder in @Model.Folders)
{
<input id="filePathUrl" type="radio" asp-for="Folders" value="@folder" />
@folder
}
<button type="submit" class="btn custom-button">Upload Files</button>
jQuery
function processFiles(confirmOverwrite = false){
const filePath = $("#filePathUrl").val();
const fileList = $(".form-control-file")[0].files;
const files = Array.from(fileList);
let formData = new FormData();
files.forEach(file => formData.append("files[]", file));
const URL = '@Url.Action("UploadFiles", "Home")';
$.ajax({
url: URL + '?folders=' + filePath + '&confirmOverwrite=' + confirmOverwrite,
type: 'post',
data: formData,
// dataType: 'json',
contentType: false,
processData: false,
...
MVC 动作
[HttpPost]
public async Task<JsonResult> UploadFiles(IEnumerable<IFormFile> files, string folders, bool confirmOverwrite = false)
{
List<string> existingFiles = new();
var filesToBeSaved = new List<(IFormFile file, string filePath)>();
foreach (var file in files)
{
string trimmedFileName = file.FileName.Replace(" ", "");
var filePath = Path.Combine(folders, trimmedFileName);
if (System.IO.File.Exists(filePath) && !confirmOverwrite)
{
existingFiles.Add(file.FileName + "(" + trimmedFileName + ")");
}
else
{
filesToBeSaved.Add((file, filePath));
}
}
...
我删除了很多代码以保持相关性和简单性。
为什么我提交表单时文件参数显示为空?
模型绑定按名称绑定参数。您的后台 IEnumerable<IFormFile> files
名称是 files
。
所以您需要像下面这样更改您的代码:
files.forEach(file => formData.append("files", file));
此外,我知道您可能希望通过数组索引 post 它。仅对于复杂列表模型类型,您可能需要 post,例如:model[index].PropertyName
。参考