【问题标题】:File Upload with Form data in asp.net core在 asp.net 核心中使用表单数据上传文件
【发布时间】:2017-04-20 21:42:31
【问题描述】:

我正在尝试将带有表单数据的文件从 angular 1.5x 上传到 .net core web api 控制器。 我的控制器是这样的

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

我的发帖方式是

 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 

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

【问题讨论】:

标签: javascript angularjs asp.net-core


【解决方案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

【讨论】:

  • 我想传递的视图模型怎么样?无法理解它。我已经使用参数成功传递了文件和表单数据,但我想用文件发送 json 对象。谢谢
  • 我创建了这两个模型
  • public class Tutor{ public int ID {get;set;} public string Name {get;set;} } public class VM{ public VM(){ tutor = new Tutor(); } public List&lt;IFormFile&gt; files {get;set;} public Tutor tutor{get;set;} } for (var i=0;i&lt;vm.files.length;i++) { data.append("files",vm.files[i].file); } var t={ ID :1,Name:"foo" }; data.append("tutor.ID", t.ID); data.append("tutor.Name", t.Name); $http.post("/api/FileUpload/",data,{ withCredentials:false, headers:{'Content-Type':undefined }, transformRequest:angular.identity, responseType:"arryabuffer" }) 映射正确。
【解决方案2】:

上传 Tutor 的一种方法是像这样使用 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

【讨论】:

    【解决方案3】:

    你可以尝试像这样使用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 是键值集合,您可以使用名称获取任何附加内容。 Name 是 FormData 的 append 方法中的第一个参数。

    【讨论】:

      猜你喜欢
      • 2017-09-26
      • 1970-01-01
      • 2021-09-19
      • 2019-11-29
      • 2022-01-09
      • 2021-03-31
      • 1970-01-01
      • 1970-01-01
      • 2016-12-06
      相关资源
      最近更新 更多