Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在ajax请求中发送包含JSON数据的文件_Javascript_Jquery_Ajax_Asp.net Mvc - Fatal编程技术网

Javascript 在ajax请求中发送包含JSON数据的文件

Javascript 在ajax请求中发送包含JSON数据的文件,javascript,jquery,ajax,asp.net-mvc,Javascript,Jquery,Ajax,Asp.net Mvc,我想向控制器发送一个图像文件,但HttpPostedFileBase为空,我在JSON.stringify({})外部输入了image:image,但未工作。 另外,我更改了contentType,看到这个并用它来回答问题,但我的问题没有解决 var file_data = $("#Image").prop("files")[0]; var image = new FormData(); image.append("file", file_data); $.ajax({

我想向控制器发送一个图像文件,但
HttpPostedFileBase
为空,我在
JSON.stringify({})
外部输入了
image:image
,但未工作。 另外,我更改了
contentType
,看到这个并用它来回答问题,但我的问题没有解决

var file_data = $("#Image").prop("files")[0];   
var image = new FormData();

image.append("file", file_data);

$.ajax({
        url: '@postUrl',
        method: "POST",
        contentType: 'application/json',
        data:
            JSON.stringify({
                    image: image,
                    isFirst : true,
                    ExternalProjects: ExternalProjects,
                    // more data

            })
       })

不要将
FormData
实例放在对象中并将其字符串化。您可以执行相反的操作:将文件和其他数据放在FormData实例中

正如您链接到的答案所说,将
contentType
processData
选项更改为false,告诉jQuery不要处理数据本身

var file_data = $("#Image").prop("files")[0];   
var fd = new FormData();

fd.append("file", file_data);
fd.append("isFirst", true);
fd.append("ExternalProjects", ExternalProjects);
$.ajax({
    url: '@postUrl',
    method: "POST",
    contentType: false,
    processData: false,
    data:fd
});

您的数据将在相应的字段中:
文件
是第一个
,以及
外部项目
我为自己发现的最好的wat:

export const convertDataToFormDataFormat = (data, formData = null, keyPrefix = '') => {
  if (!data) {
    return null;
  }

  let currentFormData = formData || new FormData();
  if (Array.isArray(data)) {
    data.forEach((entry, i) => {
      currentFormData = convertDataToFormDataFormat(entry, currentFormData, `${keyPrefix}[${i}].`);
    });

    return currentFormData;
  }

  if (data) {
    Object.entries(data).forEach(([key, value]) => {
      const fullKey = keyPrefix + key;
      if (value === undefined || value === null) {
        currentFormData.append(fullKey, '');
      } else if (value.constructor === File) {
        currentFormData.append(fullKey, value);
      } else if (Array.isArray(value)) {
        currentFormData = convertDataToFormDataFormat(value, currentFormData, `${fullKey}`);
      } else if (value === Object(value)) {
        currentFormData = convertDataToFormDataFormat(value, currentFormData, `${fullKey}.`);
      } else {
        currentFormData.append(fullKey, value);
      }
    });
  }

  return currentFormData;
};
转换为以下内容:

fieild.test1= 'test';
fieild.test2= 'test';
field.arr[0].testField1 = 'testField ';
field.arr[0].testField2 = 'testField ';
field.arr[1].testField = 'testField ';
field.arr[1].testField2 = 'testField ';
field.arr[2].testField = 'testField ';
field.arr[2].testField2 = 'testField ';
适用于asp.net core 2.0:

[HttpPost]
public async Task<IActionResult> CreateExpense([FromForm] List<SomeModelWithIFormFileField> dto)
{
    ....
}
[HttpPost]
公共异步任务CreateExpense([FromForm]列表dto)
{
....
}

谢谢您的回答。获取此错误:
未捕获类型错误:非法调用
@SoheilAlizadeh,oops,意外地将
false
设置为字符串,而不是实际的布尔值
false
。只需删除
false
,更新答案以反映如何访问相应字段?@user8016906,这取决于后端及其解析请求的方式。特别是对于asp,我不知道,因为我从未使用过它。