本篇体验上传多个文件。兄弟篇为:

MVC文件上传01-使用jquery异步上传并客户端验证类型和大小

       

  MVC最基本上传文件方式中的一个遗漏点

□ 前台视图部分

  1. 1: <% using(Html.BeginForm("FileUpload", "FileUpload", FormMethod.Post, new {enctype = "multipart/form-data"}) {)%>
  1. 2: <input name ="uploadFile" type="file" />
  1. 3: <input type="submit" value="Upload File" />
  1. 4: <%}%>

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

 

□ 控制器部分

  1. 1: [HttpMethod.Post]
  1. 2: public ActionResult FileUpload(HttpPostedFileBase uploadFile)
  1. 3: {
  1. 4: if(uploadFile.ContenctLength > 0)
  1. 5: {
  1. 6: //获得保存路径
  1. 7: string filePath = Path.Combine(HttpContext.Server.MapPath("../Uploads"),
  1. 8: Path.GetFileName(uploadFile.FileName));
  1. 9: uploadFile.SaveAs(filePath);
  1. 10: }
  1. 11: return View();
  1. 12: }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

 

以上的问题是:当没有文件上传的时候,会报错。需要判断HttpPostedFileBase实例是否为null

  1. 1: [HttpMethod.Post]
  1. 2: public ActionResult FileUpload(HttpPostedFileBase uploadFile)
  1. 3: {
  1. 4: if(uploadFile != null)
  1. 5: {
  1. 6: if(uploadFile.ContenctLength > 0)
  1. 7: {
  1. 8: //获得保存路径
  1. 9: string filePath = Path.Combine(HttpContext.Server.MapPath("../Uploads"),
  1. 10: Path.GetFileName(uploadFile.FileName));
  1. 11: uploadFile.SaveAs(filePath);
  1. 12: }
  1. 13: }
  1. 14: return View();
  1. 15: }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

 

  上传多个文件

□ 控制器

● 由于接收多个文件,所以控制器方法的参数变成了IEnumerable<HttpPostedFileBase> files

● 变量files与前台视图的name属性值对应

● 如果没有指定的文件夹,就创建一个文件夹

 

  1. 1: using System;
  1. 2: using System.Collections.Generic;
  1. 3: using System.IO;
  1. 4: using System.Linq;
  1. 5: using System.Web;
  1. 6: using System.Web.Mvc;
  1. 7:  
  1. 8: namespace MvcApplication2.Controllers
  1. 9: {
  1. 10: public class HomeController : Controller
  1. 11: {
  1. 12: public ActionResult Index()
  1. 13: {
  1. 14: return View();
  1. 15: }
  1. 16:  
  1. 17: public ActionResult MultiUpload(IEnumerable<HttpPostedFileBase> files)
  1. 18: {
  1. 19: string pathForSaving = Server.MapPath("~/Uploads");
  1. 20: if (this.CreateFolderIfNeeded(pathForSaving))
  1. 21: {
  1. 22: foreach (var file in files)
  1. 23: {
  1. 24: if (file != null && file.ContentLength > 0)
  1. 25: {
  1. 26: var path = Path.Combine(pathForSaving, file.FileName);
  1. 27: file.SaveAs(path);
  1. 28: }
  1. 29: }
  1. 30: }
  1. 31:
  1. 32: return RedirectToAction("Index");
  1. 33: }
  1. 34:  
  1. 35: // 检查是否要创建上传文件夹
  1. 36: private bool CreateFolderIfNeeded(string path)
  1. 37: {
  1. 38: bool result = true;
  1. 39: if (!Directory.Exists(path))
  1. 40: {
  1. 41: try
  1. 42: {
  1. 43: Directory.CreateDirectory(path);
  1. 44: }
  1. 45: catch (Exception)
  1. 46: {
  1. 47: //TODO:处理异常
  1. 48: result = false;
  1. 49: }
  1. 50: }
  1. 51: return result;
  1. 52: }
  1. 53: }
  1. 54: }
  1. 55:  

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

□ Home/Index.cshtml视图

  1. 1: @{
  1. 2: ViewBag.Title = "Index";
  1. 3: Layout = "~/Views/Shared/_Layout.cshtml";
  1. 4: }
  1. 5:  
  1. 6: @using (Html.BeginForm("MultiUpload", "Home", FormMethod.Post, new {enctype = "multipart/form-data"}))
  1. 7: {
  1. 8: <input type="file" name="files" id="file1" /><br/>
  1. 9: <input type="file" name="files" id="file2" /><br/>
  1. 10: <input type="file" name="files" id="file3" /><br/>
  1. 11: <input type="submit" value="同时上传多个文件" />
  1. 12: }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

 

注意:name属性值与控制器方法参数对应。

□ 结果

选择上传2个文件:

上传成功后,自动创建了文件夹Uploads:

Uploads中只有2个文件:

□ 为什么使用HttpPostedFileBase而不是FormCollection来接收文件

  1. public sealed class FormCollection : NameValueCollection, IValueProvider

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

可见,FormCollection是键值集合,键是string类型,值是string类型,而上传的文件类型不是string,所以不能用FormCollection作为参数来接收文件。

 

参考资料

ASP.NET MVC文件上传的基本操作

MVC文件上传02-使用HttpPostedFileBase上传多个文件的更多相关文章

  1. MVC文件上传 - 使用jquery异步上传并客户端验证类型和大小

    本篇体验MVC上传文件,从表单上传过渡到jquery异步上传. MVC最基本的上传文件是通过form表单提交方式 □ 前台视图部分 <% using(Html.BeginForm("F ...

  2. MVC文件图片ajax上传轻量级解决方案,使用客户端JSAjaxFileUploader插件01-单文件上传

    前段时间做了几个关于图片.文件上传的Demo,使用客户端Query-File-Upload插件和服务端Badkload组件实现多文件异步上传,比如"MVC文件上传04-使用客户端jQuery ...

  3. ASP.NET MVC 网站开发总结(二)——一个或多个文件的异步或同步上传

    简而言之,直接用代码展示如何实现文件的上传,这里需要使用到一个bootstrap的文件上传插件File Input(请自行下载). 前台页面: <!----> <!DOCTYPE h ...

  4. MVC文件上传-使用jQuery.FileUpload和Backload组件实现文件上传

    本篇使用客户端jQuery-File-Upload插件和服务端Badkload组件实现多文件异步上传.MVC文件上传相关兄弟篇: 处理文件上传的服务端组件Backload 用于处理文件上传的服务端组件 ...

  5. mvc文件上传支持批量上传,拖拽以及预览,文件内容校验等

    使用bootstrap-fileinput 使用方式: 1.nuget:Install-Package bootstrap-fileinput 2.语言本地化{下载fileinput_locale_z ...

  6. 30分钟玩转Net MVC 基于WebUploader的大文件分片上传、断网续传、秒传(文末附带demo下载)

    现在的项目开发基本上都用到了上传文件功能,或图片,或文档,或视频.我们常用的常规上传已经能够满足当前要求了, 然而有时会出现如下问题: 文件过大(比如1G以上),超出服务端的请求大小限制: 请求时间过 ...

  7. 在MVC应用程序中,怎样删除上传的文件

    在ASP.NET MVC应用程序中,怎样删除上传的文件. 由于上传时,真正文件是存储在应用程序某一目录,在数据库表中,只是存储其基本信息.在删除时,需要注意一下,由于没有事务可操作.Insus.NET ...

  8. mvc file控件无刷新异步上传操作

    前言 上传文件应该是很常见必不可少的一个操作,网上也有很多提供的上传控件.今天遇到一个问题:input控件file无法进行异步无刷新上传.真真的感到别扭.所以就尝试这去处理了一下.主要分三个部分:上传 ...

  9. ASP.NET Core文件上传与下载(多种上传方式)

    前言 前段时间项目上线,实在太忙,最近终于开始可以研究研究ASP.NET Core了. 打算写个系列,但是还没想好目录,今天先来一篇,后面在整理吧. ASP.NET Core 2.0 发展到现在,已经 ...

随机推荐

  1. java -D 参数功能解析

    我们都知道在启动tomcat或直接执行java命令的时候可以通过参数-XX等来配置虚拟机的大小,同样,也应该留意到java -Dkey=value的参数.那么这个参数是什么作用呢? 使用案例 其实,在 ...

  2. MySQL学习笔记:limit

    MySQL支持用limit语句来设置查询的行数范围,同Hive. LIMIT a, b; a:从a+1开始: b:取b行数据: 1.取出第一行记录: ,; 2.取出第二行记录: ,; 3.取出从11开 ...

  3. ld 脚本浅析-LD手册粗糙翻译

    本文乃转载, 我在其基础上做了少量修改. 原作者的E-mail是zhanglei@sict.ac.cn. 完成于2005.11.5-2005.11.8 0. Contents 1. 概论2. 基本概念 ...

  4. java8 - 4

    import java.io.PrintStream; import java.util.Comparator; import java.util.function.BiFunction; impor ...

  5. 非ROOT用户不能识别声卡问题

    将非ROOT用户加入到audio组中即可 sudo usermod -a -G audio usrname

  6. ASP.NET:Forms身份验证和基于Role的权限验证

    从Membership到SimpleMembership再到ASP.NET Identity,ASP.NET每一次更换身份验证的组件,都让我更失望.Membership的唯一作用就是你可以参考它的实现 ...

  7. MyEclipse 10、9、8 添加jadClipse反编译插件

    jad是一个使用比较广泛的Java反编译软件,jadClipse是jad在eclipse下的插件,如何将jadclipse加入到MyEclipse10.X,9.X,8.X当中: http://nchc ...

  8. [js]DOM 篇

    DOM 是 JavaScript 操作网页的接口,全称为“文档对象模型”(Document Object Model).它的作用是将网页转为一个 JavaScript 对象,从而可以用脚本进行各种操作 ...

  9. 五、django rest_framework源码之版本控制剖析

    1 绪论 Djangorest_framework的版本控制允许用户更改不同客户端之间的行为,且提供了许多不同的版本控制方案.版本控制由传入的客户端请求确定,可以基于请求URL,也可以基于请求标头. ...

  10. 支撑大规模公有云的Kubernetes改进与优化 (3)

    这一篇我们来讲网易为支撑大规模公有云对于Kubernetes的定制化. 一.总体架构 网易的Kubernetes集群是基于网易云IaaS平台OpenStack上面进行部署的,在外面封装了一个容器平台的 ...