入门实战-上传文件,几行代码就可以搞定

Asp.Net Core上传文件微软官方给的代码还是很简单的,但是我的开发环境在调试上传时,用谷歌浏览器,微软IE11,以及微软的Edge浏览器都可以正常运行,但是唯独360浏览器的极速和兼容模式,都没有成功。网友提供的一种解决法方案,在保存文件的Action参数中,指定名称,例如:public IActionResult FileUploadSave([FromForm(Name ="upfiles")] IFormFile files),也就是显示声明控件的名称,无奈360浏览器就是不行。

1.第一种实现文件上传方式

(1).创建一个Upfile.cshtml视图

asp.net上传图片代码到数据库 asp.net core 上传文件_文件上传

asp.net上传图片代码到数据库 asp.net core 上传文件_上传_02

(2).创建一个FileUpController,创建2个UpFile Action,然后要建立构造函数,在构造函数中注入IHostEnvironment,可以使用其访问到根目录等属性。HttpPost类型的UpFile方法,注意参数的使用,其他关键行的代码看注释。这种写法的本质是从form表单集合中获取文件元素,然后进行处理。

private readonly IHostEnvironment _hostEnvironment;
public FileUpController(IHostEnvironment hostEnvironment)
{
    _hostEnvironment = hostEnvironment;
}

[HttpGet]
public IActionResult UpFile()
{
   return View();
}

[HttpPost]
public IActionResult UpFile([FromForm] IFormCollection fromData)
{
IFormFileCollection files = fromData.Files;
foreach (var formFile in files)
{
  //通过_hostEnvironment.ContentRootPath来获取根目录
  string webContentPath = _hostEnvironment.ContentRootPath;//获取项目根目录
  var fileExt = formFile.FileName.Substring(formFile.FileName.LastIndexOf('.'));//获取文件扩展名
  var fileNew = DateTime.Now.ToString("yyyyMMddHHmmss") + fileExt; //给文件重新命名
  string upLoadPath = webContentPath + $@"\UpFiles";
  var fileUrl = upLoadPath + $@"\{fileNew}"; //文件重命名防止重复
  if (formFile.Length > 0)
  {
    using (var stream = new FileStream(fileUrl, FileMode.Create))
   {
     formFile.CopyToAsync(stream);
    }
  }
  var ImageUrl = "../UpFiles/" + fileNew;//设定一个文件新路径 可存入数据库
}
 return View();
}

 

2.第二种写法实现文件上传方式

(1).视图文件的html代码与第一种一样,保持不变。主要区别在UpFile这个Action上,本质上是通过HttpContext.Request.Form.Files[0],来获取文件;

,

asp.net上传图片代码到数据库 asp.net core 上传文件_文件上传_03

3.第三种写法实现文件上传

如果用了multiple属性,这样 在选择文件是,选择多个文件进行上传;

asp.net上传图片代码到数据库 asp.net core 上传文件_上传_04

asp.net上传图片代码到数据库 asp.net core 上传文件_asp.net上传图片代码到数据库_05

asp.net上传图片代码到数据库 asp.net core 上传文件_asp.net上传图片代码到数据库_06

通过IFormFile实现文件上传的特点(来自网络和官网):

IFormFile的缺点主要是客户端上传过来的文件首先会缓存在服务器内存中,任何超过 64KB 的单个缓冲文件会从 RAM 移动到服务器磁盘上的临时文件中。 文件上传所用的资源(磁盘、RAM)取决于并发文件上传的数量和大小。 流式处理与性能没有太大的关系,而是与规模有关。 如果尝试缓冲过多上传,站点就会在内存或磁盘空间不足时崩溃。

也就是说如果同时有很多客户端上传文件时,如果采用IFormFile的方式来上传的话,上传的文件首先会在你的服务器内存中进行缓存,还有可能从内存中导入到你的磁盘临时文件中,那么必然会有两个问题,一个是内存占用过高,另一个问题就是磁盘空间不足。

针对以上的问题,采用“流式”上传可以解决,但是“流式”上传需要比IFormFile复杂的多的配置,IFormFile上传是在服务器进行模型绑定的操作,而“流式”上传是要读取Request的流并对boundary的内容进行判断来获取文件流的方式来处理的。

当然还可以采用插件来实现文件上传,例如百度的WebUploader,element-UI上传插件,Stream,uploadify等。

文件上传入门,本章就讲这么多,关于大文件上传,后期会涉及。