MVC文件上传02-使用HttpPostedFileBase上传多个文件
本篇体验上传多个文件。兄弟篇为:
MVC文件上传01-使用jquery异步上传并客户端验证类型和大小
MVC最基本上传文件方式中的一个遗漏点
□ 前台视图部分
   1:  <% using(Html.BeginForm("FileUpload", "FileUpload", FormMethod.Post, new {enctype = "multipart/form-data"}) {)%>
2: <input name ="uploadFile" type="file" />
3: <input type="submit" value="Upload File" />
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: [HttpMethod.Post]
2: public ActionResult FileUpload(HttpPostedFileBase uploadFile)
   3:  {
4: if(uploadFile.ContenctLength > 0)
   5:      {
6: //获得保存路径
   7:          string filePath = Path.Combine(HttpContext.Server.MapPath("../Uploads"), 
8: Path.GetFileName(uploadFile.FileName));
9: uploadFile.SaveAs(filePath);
10: }
11: return View();
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: [HttpMethod.Post]
2: public ActionResult FileUpload(HttpPostedFileBase uploadFile)
   3:  {
4: if(uploadFile != null)
   5:    {
6: if(uploadFile.ContenctLength > 0)
   7:      {
8: //获得保存路径
   9:          string filePath = Path.Combine(HttpContext.Server.MapPath("../Uploads"), 
10: Path.GetFileName(uploadFile.FileName));
11: uploadFile.SaveAs(filePath);
12: }
13: }
14: return View();
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: using System;
2: using System.Collections.Generic;
3: using System.IO;
4: using System.Linq;
5: using System.Web;
6: using System.Web.Mvc;
7:
8: namespace MvcApplication2.Controllers
   9:  {
10: public class HomeController : Controller
  11:      {
12: public ActionResult Index()
  13:          {
14: return View();
15: }
16:
17: public ActionResult MultiUpload(IEnumerable<HttpPostedFileBase> files)
  18:          {
  19:              string pathForSaving = Server.MapPath("~/Uploads");
20: if (this.CreateFolderIfNeeded(pathForSaving))
  21:              {
22: foreach (var file in files)
  23:                  {
24: if (file != null && file.ContentLength > 0)
  25:                      {
26: var path = Path.Combine(pathForSaving, file.FileName);
27: file.SaveAs(path);
28: }
29: }
30: }
31:
  32:              return RedirectToAction("Index");
33: }
34:
35: // 检查是否要创建上传文件夹
36: private bool CreateFolderIfNeeded(string path)
  37:          {
38: bool result = true;
39: if (!Directory.Exists(path))
  40:              {
41: try
  42:                  {
43: Directory.CreateDirectory(path);
44: }
45: catch (Exception)
  46:                  {
47: //TODO:处理异常
48: result = false;
49: }
50: }
51: return result;
52: }
53: }
54: }
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:  @{
2: ViewBag.Title = "Index";
3: Layout = "~/Views/Shared/_Layout.cshtml";
4: }
5:
   6:  @using (Html.BeginForm("MultiUpload", "Home", FormMethod.Post, new {enctype = "multipart/form-data"}))
   7:  {
8: <input type="file" name="files" id="file1" /><br/>
9: <input type="file" name="files" id="file2" /><br/>
10: <input type="file" name="files" id="file3" /><br/>
11: <input type="submit" value="同时上传多个文件" />
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来接收文件
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作为参数来接收文件。
参考资料
MVC文件上传02-使用HttpPostedFileBase上传多个文件的更多相关文章
- MVC文件上传 - 使用jquery异步上传并客户端验证类型和大小
		
本篇体验MVC上传文件,从表单上传过渡到jquery异步上传. MVC最基本的上传文件是通过form表单提交方式 □ 前台视图部分 <% using(Html.BeginForm("F ...
 - MVC文件图片ajax上传轻量级解决方案,使用客户端JSAjaxFileUploader插件01-单文件上传
		
前段时间做了几个关于图片.文件上传的Demo,使用客户端Query-File-Upload插件和服务端Badkload组件实现多文件异步上传,比如"MVC文件上传04-使用客户端jQuery ...
 - ASP.NET MVC 网站开发总结(二)——一个或多个文件的异步或同步上传
		
简而言之,直接用代码展示如何实现文件的上传,这里需要使用到一个bootstrap的文件上传插件File Input(请自行下载). 前台页面: <!----> <!DOCTYPE h ...
 - MVC文件上传-使用jQuery.FileUpload和Backload组件实现文件上传
		
本篇使用客户端jQuery-File-Upload插件和服务端Badkload组件实现多文件异步上传.MVC文件上传相关兄弟篇: 处理文件上传的服务端组件Backload 用于处理文件上传的服务端组件 ...
 - mvc文件上传支持批量上传,拖拽以及预览,文件内容校验等
		
使用bootstrap-fileinput 使用方式: 1.nuget:Install-Package bootstrap-fileinput 2.语言本地化{下载fileinput_locale_z ...
 - 30分钟玩转Net MVC 基于WebUploader的大文件分片上传、断网续传、秒传(文末附带demo下载)
		
现在的项目开发基本上都用到了上传文件功能,或图片,或文档,或视频.我们常用的常规上传已经能够满足当前要求了, 然而有时会出现如下问题: 文件过大(比如1G以上),超出服务端的请求大小限制: 请求时间过 ...
 - 在MVC应用程序中,怎样删除上传的文件
		
在ASP.NET MVC应用程序中,怎样删除上传的文件. 由于上传时,真正文件是存储在应用程序某一目录,在数据库表中,只是存储其基本信息.在删除时,需要注意一下,由于没有事务可操作.Insus.NET ...
 - mvc file控件无刷新异步上传操作
		
前言 上传文件应该是很常见必不可少的一个操作,网上也有很多提供的上传控件.今天遇到一个问题:input控件file无法进行异步无刷新上传.真真的感到别扭.所以就尝试这去处理了一下.主要分三个部分:上传 ...
 - ASP.NET Core文件上传与下载(多种上传方式)
		
前言 前段时间项目上线,实在太忙,最近终于开始可以研究研究ASP.NET Core了. 打算写个系列,但是还没想好目录,今天先来一篇,后面在整理吧. ASP.NET Core 2.0 发展到现在,已经 ...
 
随机推荐
- 【TensorFlow】一文弄懂CNN中的padding参数
			
在深度学习的图像识别领域中,我们经常使用卷积神经网络CNN来对图像进行特征提取,当我们使用TensorFlow搭建自己的CNN时,一般会使用TensorFlow中的卷积函数和池化函数来对图像进行卷积和 ...
 - return to dl_resolve无需leak内存实现利用
			
之前在drop看过一篇文章,是西电的Bigtang师傅写的,这里来学习一下姿势做一些笔记. 0x01 基础知识 Linux ELF文件存在两个很重要的表,一个是got表(.got.plt)一个是plt ...
 - GrideVlew提供点击按钮添加新数据,单击项目修改,长按删除功能
			
package com.example.wang.myapplication; import android.app.AlertDialog; import android.content.Dialo ...
 - HBase应用之微博案例
			
一. 需求分析 1) 微博内容的浏览,数据库表设计 2) 用户社交体现:关注用户,取关用户 3) 拉取关注的人的微博内容 二. 代码实现 代码设计总览: 1.创建命名空间以及表名的定义 //获取配置 ...
 - Jquery~跨域异步上传文件
			
先说明白 这个跨域异步上传功能我们借助了Jquery.form插件,它在异步表单方面很有成效,而跨域我们会在HTTP响应头上添加access-control-allow-method,当然这个头标记只 ...
 - 常用网络命令(windows)
			
Ping命令的常用参数选项 ·ping IP –t 连续对IP地址执行Ping命令,直到被用户以Ctrl+C中断. ·ping IP -l 3000 指定Ping命令中的数据长度为3000字节,而 ...
 - CentOS源码安装搭建LNMP全过程(包括nginx,mysql,php,svn)
			
服务器环境为:CentOS6.5 64位 目标:搭建LNMP(Linux + Nginx + MySQL + PHP +SVN),其中svn是用来代替ftp,方便开发中调试同步代码 相关目录:所有软件 ...
 - 洛谷——P1345 [USACO5.4]奶牛的电信Telecowmunication
			
P1345 [USACO5.4]奶牛的电信Telecowmunication 题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮 ...
 - JDK源码分析(三)——HashMap 上(基于JDK7)
			
目录 HashMap概述 内部字段及构造方法 存储元素 扩容 取出元素 删除元素 判断 总结 HashMap概述 前面我们分析了基于数组实现的ArrayList和基于双向链表实现的LinkedLi ...
 - tkinter-clock实例
			
模仿着前辈的脚步,画了个临时的时钟显示: 代码如下: # coding:utf-8 from tkinter import * import math,time global List global ...