我正在尝试使用从1.5x角度到.net核心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
&#13;
现在当它发布到控制器时,模型不包含属性值。如果我看Request.Form.Files,我会在控制器中上传文件。将模型发送到上面的post方法的最佳方法是什么。任何指针?谢谢
答案 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方法中的第一个参数。