我是react.js和ASP.Net core 2.0的新手。现在,使用ASP.Net core 2.0作为后端API和react.js作为应用程序接口(前端)编写一个项目。我想知道如何上传文件。我尝试了如下操作,但是在后端,参数值(IFromFile文件)始终为null。似乎该文件未正确发布。这是我的代码:
.Net核心(API)
[HttpPost] [Route("upload")] public async Task Upload(IFormFile file) { if (file == null) throw new Exception("File is null"); if (file.Length == 0) throw new Exception("File is empty"); using (Stream stream = file.OpenReadStream()) { using (var binaryReader = new BinaryReader(stream)) { var fileContent = binaryReader.ReadBytes((int)file.Length); // await _uploadService.AddFile(fileContent, file.FileName, file.ContentType); } } }
React.js
handleClick(event){ event.preventDefault(); // console.log("handleClick",event); var self = this; var apiBaseUrl = axios.defaults.baseURL + "user/upload"; if(this.state.filesToBeSent.length>0){ var filesArray = this.state.filesToBeSent; const reader = new FileReader(); for(var i in filesArray){ //console.log("files",filesArray[i][0]); var file = filesArray[i][0]; axios.post(apiBaseUrl, {data: file}); } alert("File upload completed"); } else{ alert("Please select files first"); } }
请告知我该如何解决该问题。
我已经完成了以下工作:
在.Net Core 2.0 Web API
使用Microsoft.AspNetCore.Http;
我创建了一个模型课
namespace Marter_MRM.Models { public class FileUploadViewModel { public IFormFile File { get; set; } public string source { get; set; } public long Size { get; set; } public int Width { get; set; } public int Height { get; set; } public string Extension { get; set; } } }
然后,我创建了一个控制器类,并按如下所示编写了函数。
[HttpPost] [Route("upload")] public async Task<IActionResult> Upload(FileUploadViewModel model) { var file = model.File; if (file.Length > 0) { string path = Path.Combine(_env.WebRootPath, "uploadFiles"); using (var fs = new FileStream(Path.Combine(path, file.FileName), FileMode.Create)) { await file.CopyToAsync(fs); } model.source = $"/uploadFiles{file.FileName}"; model.Extension = Path.GetExtension(file.FileName).Substring(1); } return BadRequest(); }
并在react中编写api调用函数,如下所示:
handleUploadClick(event){ event.preventDefault(); var self = this; var apiBaseUrl = axios.defaults.baseURL + "user/upload"; if(this.state.filesToBeSent.length>0){ var filesArray = this.state.filesToBeSent; let f = new FormData(); for(var i in filesArray){ //console.log("files",filesArray[i][0]); f = new FormData(); f.append("File",filesArray[i][0] ) axios.post(apiBaseUrl, f, { headers: {'Content-Type': 'multipart/form-data'} }); } alert("File upload completed"); } else{ alert("Please select files first"); } }
完美的作品。谢谢!