javascript - 使用ajax将照片和多个数据发送到控制器
问题描述
我正在使用 ajax 和 javascript 将选定的照片发送到我在 asp.net 核心中的控制器。感谢下面的代码:
<form id="form" name="form" style="display:none;" method="post" enctype="multipart/form-data">
<div class="row">
<div class="col-md-12">
<input onchange="uploadFiles('files');" class="form-control" type="file" id="files">
</div>
</div>
</form>
我的 javascript 和 ajax 代码:
var sliderFotografEkle = "@Url.Action("sliderFotoKayit", "slider")";
function uploadFiles(inputId) {
var input = document.getElementById(inputId);
var files = input.files;
var formData = new FormData();
for (var i = 0; i != files.length; i++) {
formData.append("files", files[i]);
}
$.ajax(
{
url: sliderFotografEkle,
data: formData,
processData: false,
contentType: false,
type: "POST",
success: function (data) {
alert("Files Uploaded!");
}
}
);
}
它只在数据部分采用 formData。我想发送第二个数据。它不发送。可能 processData: false, contentType: false, 从我给的。但如果我不给他们,这次就不会发送照片。请帮我。
这是控制器中给出参数的地方:
[HttpPost]
public async Task<IActionResult> sliderFotoKayit(slider item, List<IFormFile> files)
解决方案
我已经在 ASP.NET Core 3.1 上测试了您的代码,发现一次上传一个文件没有问题。
据我了解,您的问题是您不能一次选择和发送多个文件。
为了一次选择和发送多个文件,您的 html 输入标签必须具有一个multiple
属性。否则,它一次只允许您选择一个文件。
<input onchange="uploadFiles('files');" class="form-control" type="file" id="files" multiple>
在作者提供更多上下文后更新:
对于您想在表单数据中发送的任何附加值,只需您自己的append(key: string, value: any)
方法。
使用附加int
字段更新了 JS:
function uploadFiles(inputId) {
var input = document.getElementById(inputId);
var files = input.files;
var formData = new FormData();
for (var i = 0; i != files.length; i++) {
formData.append("files", files[i]);
}
formData.append("id", 3); // append additional int field here
$.ajax(
{
url: sliderFotografEkle,
data: formData,
processData: false,
contentType: false,
type: "POST",
success: function (data) {
alert("Files Uploaded!");
}
}
);
}
</script>
接收文件的控制器方法签名和一个附加int
字段:
[HttpPost]
public async Task<IActionResult> HandleFileUpload(int id, List<IFormFile> files)
更多细节:
当您将表单数据发送到服务器时,请求将具有content-type: multipart/form-data;
. 由于一个 HTTP 请求只能有一种内容类型,因此有两种选择:
最简单的方法:通过
input
html 或formData.append(key, value)
js 中的字段向表单添加新字段。建议这样做是因为:content-type: multipart/form-data;
可以包括文件和 HTML 表单支持的任何其他类型。content-type: multipart/form-data;
在 ASP.NET 中具有内置支持,因此表单内容将自动绑定到控制器方法参数。
- 困难的方法:将formdata 序列化为字符串,然后返回
content-type: application/json;
. 如果您无法控制服务器,请执行此操作,通常是在您必须符合另一台服务器的 API 的情况下。这显然更灵活,但也更复杂。
您将能够以以下形式获取数据:
{
"formData": serializedFormData,
"id": id
}
最大的缺点是服务器必须手动反序列化表单数据。
推荐阅读
- animation - 旋转文字动画和持续时间
- javascript - JS用一个实例创建不同的账户
- json - Firefox 插件:将加载的 json 解析/保存为 HAR 或文本文件
- pyspark - pySpark 数据框过滤方法
- shell - 我正在尝试通过在 osx 10.14 上制作可点击的 shell 脚本来启动“jupyter notebook”
- flutter - 更改文本相对于其他小部件的大小/位置
- sorting - 如何从 29 年的数据集中按小时计算一年的中值?
- c# - 这是 C# Monad,问题出在哪里?
- python - 将嵌套字典转换为数据框,键作为行名,值中的字典作为列?
- command-line-interface - 使用 spaCy 命令行训练器管理训练/开发拆分