使用asp.net核心中的表单数据上传文件

时间:2016-12-06 09:42:18

标签: javascript angularjs asp.net-core

我正在尝试使用从1.5x角度到.net核心web api控制器的表单数据上传文件。 我的控制器看起来像这样

    [HttpPost]public async Task<ObjectResult> Create(TutorModel model) 
    {
    }

我的帖子方法是

&#13;
&#13;
 return $http.post("/api/Tutor/createTutor/",
      data,
                {
                    withCredentials: false,
                    headers: { 'Content-Type': undefined },
                    transformRequest: angular.identity,
                    responseType: "arryabuffer"
                });


Where data is


for (var i = 0; i < vm.uploadedFiles.length ; i++) { //vm.upload contains list of file
                data.append(vm.uploadedFiles[i].name, vm.uploadedFiles[i]);
            }
            data.append("tutor", tutor); //tutor is json object 
&#13;
&#13;
&#13;

现在当它发布到控制器时,模型不包含属性值。如果我看Request.Form.Files,我会在控制器中上传文件。将模型发送到上面的post方法的最佳方法是什么。任何指针?谢谢

3 个答案:

答案 0 :(得分:1)

Asp.net核心文档简要介绍了这个主题。

您的控制器操作就是这样。

[HttpPost("UploadFiles")]
public async Task<IActionResult> Post(List<IFormFile> files)
{
   long size = files.Sum(f => f.Length);

   // full path to file in temp location
   var filePath = Path.GetTempFileName();

   foreach (var formFile in files)
   {
      if (formFile.Length > 0)
      {
         using (var stream = new FileStream(filePath, FileMode.Create))
         {
            await formFile.CopyToAsync(stream);
         }
      }
    }

     // process uploaded files

    return Ok(new { count = files.Count, size, filePath});
}

IFormFile具有这些属性

   public interface IFormFile
   {
     string ContentType { get; }
     string ContentDisposition { get; }
     IHeaderDictionary Headers { get; }
     long Length { get; }
     string Name { get; }
     string FileName { get; }
     Stream OpenReadStream();
     void CopyTo(Stream target);
     Task CopyToAsync(Stream target, CancellationToken cancellationToken = null);
   }

注意:在关系数据库中存储二进制数据时要小心,因为它会对性能产生负面影响。

在这里阅读详细文章 File Uploads

答案 1 :(得分:0)

上传老师的一种方法是使用JSON.stringify,如下所示:

data.append("tutor", JSON.stringify(tutor));

然后在您的操作中,解析JSON字符串:

[HttpPost]
public async Task<IActionResult> Create([FromForm] string tutor) 
{
    var tutorObj = JsonConvert.DeserializeObject<TutorModel>(tutor);
}

如果将js转换为以下格式,则可以在同一请求中上传文件:

 data.append("files", vm.uploadedFiles[i]);

然后将其添加到您的操作中:

[FromForm] IEnumerable<IFormFile> files

答案 2 :(得分:0)

您可以尝试像这样使用formdata

const data = new FormData();

然后附加文件和json对象

for (var i = 0; i < vm.uploadedFiles.length ; i++) { //vm.upload contains list of file
            data.append(vm.uploadedFiles[i].name, vm.uploadedFiles[i]);
        }
        data.append("tutor", tutor);

然后发布数据。

在服务器端,创建一个没有任何参数的方法,例如

public async Task<ActionResult> Create() {
 // You can access the posted form object from Request.Form
 var vm = Request.Form;
 // your files
 var files = Request.Form.Files;
}

Request.Form是键值集合,您可以使用该名称获取附加的任何内容。 名称是FormData的append方法中的第一个参数。