IFormFile作为Web API中类的属性

时间:2019-07-01 05:58:36

标签: c# ajax asp.net-core

我正在将文件从jquery ajax发送到asp.net核心Web api,但是Web api会将每个属性都接受为null。

public class YuklenecekDosya 
{
    public IFormFile File { get; set; }
    public int ID { get; }
    public string TableAdi { get; }
}

[HttpPost]
    public IActionResult Upload([FromForm]YuklenecekDosya File)
    {
        var file = File.File;

        if (file == null || file.Length == 0)
            return Content("Yuklenecek fayl Secmemisiniz!");

        if (file.Length > 0)
        {
            string path = Path.Combine(_env.WebRootPath, "Dosyalar");
            string fullfilepath = Path.Combine(path, file.FileName);

            if (!Directory.Exists(path))
            {
                Directory.CreateDirectory(path);
            }



            using (var fs=new FileStream(fullfilepath, FileMode.Create))
            {
                file.CopyTo(fs);
            }

            return new OkObjectResult(file);
        }

        return BadRequest();
    }

和clintside ajax代码如下:

let f=new FormData();
    f.append('File',$('input').files[0]);


    let File={
        File:f,
        iD:2,
        tableAdi:"Table1"
    };

    $.ajax({
        method:'Post',
        url:'api/Values/Upload',
        data:File,
        processData:false,
        contentType:false,
        enctype: 'multipart/form-data',
    }).then(model=>{
        console.log(model);
    });

当我调试它时,YuklenecekDosya参数中的所有内容都为null。 我不知道哪里出了问题。 顺便说一句,当我尝试将参数仅作为IFormFile而不是YuklenecekDosya时,它可以工作,但是当我将IFormFile作为YuklenecekDosya参数的属性时,它将所有属性设置为空

2 个答案:

答案 0 :(得分:0)

尝试一下:

因此$ajax的呼叫将是:

let f = new FormData();
f.append('File', $('input').files[0]);
f.append('ID', 2);
f.append('TableAdi', 'Table1');

$.ajax({
    method: 'Post',
    url: 'api/Values/Upload',
    data: f, <-- Here pass f
    processData: false,
    contentType: false,
    enctype: 'multipart/form-data',
}).then(model => {
    console.log(model);
});

答案 1 :(得分:0)

关键问题是您没有在媒体资源上提供set实现,请将YuklenecekDosya类修改为:

public class YuklenecekDosya
{
    public IFormFile File { get; set; }
    public int ID { get; set; }
    public string TableAdi { get; set; }
}

然后修改您的JavaScript代码,例如:

let f = new FormData();
f.append('File', $('input').files[0]);
f.append('ID', 2);
f.append('TableAdi', 'Table1');

$.ajax({
    method: 'Post',
    url: '../api/Values/Upload',
    data: f,
    processData: false,
    contentType: false,

}).then(model => {
    console.log(model);
});

此外,如果您的标记类似于:

<input type="file" name="files"  id="files" >

在javascript中,您可以使用:

let f = new FormData();
f.append('File', $('#files').get(0).files[0]);