参考链接:
遇到的问题:
- 按 参考1 中测试,下载文件文件名总是变成方法名(DownloadFile),并且没有文件扩展名,保存后改扩展名可正常查看。
- 参考 链接3 测试无效,未解决下载问题。
- 参考 链接2,问题解决。
代码实现如下:
文件上传
[HttpPost]
public async Task<ActionResult> UploadFile()
{
_folder = $@"{env.WebRootPath}\Upload";//env 可通过Controller的参数传入,并取得:IHostingEnvironment _env
string controller = RouteData.Values["controller"].ToString();
var dirPath = _folder + $"/Template/{controller}";
if (!Directory.Exists(dirPath))
{
Directory.CreateDirectory(dirPath);
}
var size = Request.Form.Files.Sum(f => f.Length);
IFormFile file = Request.Form.Files.FirstOrDefault();
if (file.Length > 0)
{
var filePath = $@"{dirPath}\{file.FileName}";
using (var stream = new FileStream(filePath, FileMode.Create))
{
await file.CopyToAsync(stream);//写入到服务器。
}
}
_controllername = RouteData.Values["controller"].ToString();
string Id = Request.Form["Id"].First();
var path = $"/api/{_controllername}/Detail/{Id}";
var data = _excelTemplateDocService.Get(path).Result.FirstOrDefault();
if(data!=null)
{
data.ExcelPath = file.FileName;
path = $"/api/{_controllername}";
await _excelTemplateDocService.Post(path, data);
}
else
{
return BadRequest("ExcelPath未更新!");
}
return Ok(new { code = 200, message = "success" });
}
文件下载
[HttpGet]
public async Task<IActionResult> DownloadFile(string fileName)
{
if (string.IsNullOrEmpty(fileName))
{
return NotFound();
}
string controller = RouteData.Values["controller"].ToString();
var path = _folder + $"/Template/{controller}/{fileName}";
var memoryStream = new MemoryStream();
using (var stream = new FileStream(path, FileMode.Open))
{
await stream.CopyToAsync(memoryStream);
}
memoryStream.Seek(0, SeekOrigin.Begin);
//文件名必须编码,否则会有特殊字符(如中文)无法在此下载。
string encodeFilename = msSystem.Web.HttpUtility.UrlEncode(fileName, msSystem.Text.Encoding.GetEncoding("UTF-8"));
Response.Headers.Add("Content-Disposition", "attachment; filename=" + encodeFilename);
return new FileStreamResult(memoryStream, "application/octet-stream");//文件流方式,指定文件流对应的ContenType。
}