本篇体验MVC上传文件,从表单上传过渡到jquery异步上传。

MVC最基本的上传文件是通过form表单提交方式

□ 前台视图部分

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

□ 控制器部分

  1. [HttpMethod.Post]
  1. public ActionResult FileUpload(HttpPostedFileBase uploadFile)
  1. {
  1. if(uploadFile.ContenctLength > 0)
  1. {
  1. //获得保存路径
  1. string filePath = Path.Combine(HttpContext.Server.MapPath("../Uploads"),
  1. Path.GetFileName(uploadFile.FileName));
  1. uploadFile.SaveAs(filePath);
  1. }
  1. return View();
  1. }

但整个页面会刷新,面对比较单一、简单的需求的时候,有其价值。但在实际项目中,当然是希望通过异步方式来实现。

使用jQuery文件上传插件实现异步上传

□ 思路

1、使用jQuery文件上传插件的fileupload()方法,为type="file"的input设置url,dataType等,并把数据交给一个全局变量var jqXHRData。
2、点击上传按钮,提交数据 jqXHRData.submit()

3、控制器方法负责把文件上传到指定文件夹

□ 需要引用的js文件

  1. <script src="~/Scripts/jquery-1.9.1.min.js"></script>
  1. <script src="~/Scripts/jquery-ui-1.9.2.min.js"></script>
  1. <script src="~/Scripts/jquery.fileupload.js"></script>
  1. <script src="~/Scripts/jquery.fileupload-ui.js"></script>
  1. <script src="~/Scripts/jquery.iframe-transport.js"></script>

□ View Model

属性类型为HttpPostedFileBase。

  1. using System.Web;
  1.  
  1. namespace MvcApplication1.Models
  1. {
  1. public class MyModel
  1. {
  1. public HttpPostedFileBase MyFile { get; set; }
  1. }
  1. }
  1.  

□ HomeController

  1. using System.Web.Mvc;
  1.  
  1. namespace MvcApplication1.Controllers
  1. {
  1. public class HomeController : Controller
  1. {
  1. public ActionResult Index()
  1. {
  1. return View();
  1. }
  1. }
  1. }

□ Home/Index.cshtml

  1. @model MvcApplication1.Models.MyModel
  1.  
  1. @{
  1. ViewBag.Title = "Index";
  1. Layout = "~/Views/Shared/_Layout.cshtml";
  1. }
  1.  
  1. <h5>简单上传</h5>
  1.  
  1. <div>
  1. @Html.TextBoxFor(m => m.MyFile, new {id="simple",type="file"} ) <br/>
  1. <a href="#" id="simpleupload">开始简单上传</a>
  1. </div>
  1.  
  1. <h5>检查文件类型和尺寸</h5>
  1. <div>
  1. <input type="file" name="myFile" id="check" /> <br/>
  1. <a href="#" id="checkupload">开始检查并上传</a>
  1. </div>
  1.  
  1. @section scripts
  1. {
  1. <script src="~/Scripts/jquery-1.9.1.min.js"></script>
  1. <script src="~/Scripts/jquery-ui-1.9.2.min.js"></script>
  1. <script src="~/Scripts/jquery.fileupload.js"></script>
  1. <script src="~/Scripts/jquery.fileupload-ui.js"></script>
  1. <script src="~/Scripts/jquery.iframe-transport.js"></script>
  1. <script type="text/javascript">
  1. var jqXHRData;
  1.  
  1. $(function() {
  1. initSimpleFileUpload();
  1. initFileUploadWithCheck();
  1.  
  1. //简单上传
  1. $('#simpleupload').on('click', function() {
  1. if (jqXHRData) {
  1. jqXHRData.submit();
  1. }
  1. return false;
  1. });
  1.  
  1. //检查图片文件类型和大小
  1. $('#checkupload').on('click', function() {
  1. if (jqXHRData) {
  1. var isStartUpload = true;
  1. var uploadFile = jqXHRData.files[0];
  1.  
  1. if (!(/\.(gif|jpg|jpeg|tiff|png)$/i).test(uploadFile.name)) {
  1. alert('允许图片格式gif|jpg|jpeg|tiff|png');
  1. isStartUpload = false;
  1. } else if (uploadFile.size > 4000000) { // 4mb
  1. alert('图片尺寸不能大于4 MB');
  1. isStartUpload = false;
  1. }
  1. if (isStartUpload) {
  1. jqXHRData.submit();
  1. }
  1. }
  1. return false;
  1. });
  1. });
  1.  
  1. //简单上传
  1. function initSimpleFileUpload() {
  1. $('#simple').fileupload({
  1. url: '@Url.Action("UploadFile","File")',
  1. dataType: 'json',
  1. add: function(e, data) {
  1. jqXHRData = data;
  1. },
  1. done: function(event, data) {
  1. if (data.result.isUploaded) {
  1. alert(data.result.message);
  1. } else {
  1. alert(data.result.message);
  1. }
  1. },
  1. fail: function(event, data) {
  1. if (data.files[0].error) {
  1. alert(data.files[0].error);
  1. }
  1. }
  1. });
  1. }
  1.  
  1. //检查图片文件类型和大小
  1. function initFileUploadWithCheck() {
  1. $('#check').fileupload({
  1. url: '@Url.Action("UploadFile","File")',
  1. dataType: 'json',
  1. add: function (e, data) {
  1. jqXHRData = data;
  1. },
  1. done: function (event, data) {
  1. if (data.result.isUploaded) {
  1. alert(data.result.message);
  1. } else {
  1. alert(data.result.message);
  1. }
  1. },
  1. fail: function (event, data) {
  1. if (data.files[0].error) {
  1. alert(data.files[0].error);
  1. }
  1. }
  1. });
  1. }
  1.  
  1. </script>
  1. }
  1.  

相应界面:

□ FileController

  1. using System.IO;
  1. using System.Linq;
  1. using System.Web;
  1. using System.Web.Mvc;
  1.  
  1. namespace MvcApplication1.Controllers
  1. {
  1. public class FileController : Controller
  1. {
  1. public ActionResult Index()
  1. {
  1. return View();
  1. }
  1.  
  1. [HttpPost]
  1. public ActionResult UploadFile()
  1. {
  1. HttpPostedFileBase myFile = Request.Files["MyFile"];
  1. bool isUploaded = false;
  1. string message = "上传失败";
  1.  
  1. if (myFile != null && myFile.ContentLength != 0)
  1. {
  1. string pathForSaving = Server.MapPath("~/Uploads");
  1. if (this.CreateFolderIfNeeded(pathForSaving))
  1. {
  1. try
  1. {
  1. myFile.SaveAs(Path.Combine(pathForSaving, myFile.FileName));
  1. isUploaded = true;
  1. message = "上传成功";
  1. }
  1. catch (Exception ex)
  1. {
  1. message = string.Format("上传文件失败:{0}", ex.Message);
  1. }
  1. }
  1. }
  1. return Json(new { isUploaded = isUploaded, message = message });
  1. }
  1.  
  1. /// <summary>
  1. /// 检查是否要创建上传文件夹
  1. /// </summary>
  1. /// <param name="path">路径</param>
  1. /// <returns></returns>
  1. private bool CreateFolderIfNeeded(string path)
  1. {
  1. bool result = true;
  1. if (!Directory.Exists(path))
  1. {
  1. try
  1. {
  1. Directory.CreateDirectory(path);
  1. }
  1. catch (Exception)
  1. {
  1. //TODO:处理异常
  1. result = false;
  1. }
  1. }
  1. return result;
  1. }
  1. }
  1. }
  1.  

□ 另外,配置文件中需要设置允许的最大文件尺寸

  1. <system.web>
  1. <!--10240 Kb = 10 MB-->
  1. <httpRuntime targetFramework="4.5" maxRequestLength= "10240" />
  1. ...
  1. </system.web>

□ 结果

上传成功后,多了Uploads文件夹:

上传PDF格式,出现报错:

□ 参考资料

ASP.NET MVC: Simple example of ajax file upload

MVC文件上传01-使用jquery异步上传并客户端验证类型和大小的更多相关文章

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

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

  2. Jquery异步上传文件

    我想通过jQuery异步上传文件,这是我的HTML: 1 2 3 <span>File</span> <input type="file" id=&q ...

  3. MVC 5.0(or5.0↓) Ajax.BeginForm 异步上传附件问题,答案是不能的!

    MVC 5.0(or5.0↓)  Ajax.BeginForm 异步上传附件问题,答案是不能的! (请注意我这里说的异步!) 来看一下下面这段一步提交file的代码 //前台 .cshtml 文件 & ...

  4. 【转】jQuery异步上传文件

    用了 jQuery Form插件来解决这个问题:http://malsup.com/jquery/form/#code-samples 有没有不用该插件来实现呢? 解决方法: 可以采用HTML5,用j ...

  5. jQuery 异步上传插件 Uploadify302 使用 (JavaEE Spring MVC)

    Uploadify是JQuery的一个上传插件,实现的效果非常不错,带进度显示.而且是Ajax的,省去了自己写Ajax上传功能的麻烦.不过官方提供的实例时php版本的,本文将详细介绍Uploadify ...

  6. jquery异步上传文件,支持IE8

    http://code.taobao.org/p/upload2/src/ 已经托管至淘宝code 源码:http://code.taobao.org/p/upload2/src/jquery.upl ...

  7. MVC文件上传04-使用客户端jQuery-File-Upload插件和服务端Backload组件实现多文件异步上传

    本篇使用客户端jQuery-File-Upload插件和服务端Badkload组件实现多文件异步上传.MVC文件上传相关兄弟篇: MVC文件上传01-使用jquery异步上传并客户端验证类型和大小  ...

  8. MVC文件上传09-使用客户端jQuery-File-Upload插件和服务端Backload组件让每个用户有专属文件夹,并在其中创建分类子文件夹

    为用户创建专属上传文件夹后,如果想在其中再创建分类子文件夹,该怎么做?可以在提交文件的视图中再添加一个隐藏域,并设置 name="uploadContext". 相关兄弟篇: MV ...

  9. MVC文件上传08-使用客户端jQuery-File-Upload插件和服务端Backload组件让每个用户有专属文件夹

    当需要为每个用户建立一个专属上传文件夹的时候,可以在提交文件的视图中添加一个隐藏域,并设置name="objectContext". 相关兄弟篇: MVC文件上传01-使用jque ...

随机推荐

  1. (一)SpringMVC

    第一章 问候SpringMVC 第一节 SpringMVC简介 SpringMVC是一套功能强大,性能强悍,使用方便的优秀的MVC框架 下载和安装Spring框架: 登录http://repo.spr ...

  2. ***四种参数传递的形式——URL,超链接,js,form表单

    什么时候用GET,  查,删 什么时候用POST,增,改  (特列:登陆用Post,因为不能让用户名和密码显示在URL上) 4种get传参方式 <html xmlns="http:// ...

  3. InterSystems Ensemble学习笔记(一) Ensemble介绍及安装

    系列目录 InterSystems Ensemble学习笔记(一) Ensemble介绍及安装InterSystems Ensemble学习笔记(二) Ensemble创建镜像, 实现自动故障转移 一 ...

  4. snmp常见操作

    常用snmp OID说明下面这些值可以手动连接进行获取数据: 用zabbix监控交换机和路由器需要一款能够获取网络设备OID的工具,可用getif来获得OID 也可以使用snmpwalk 配置交换机的 ...

  5. 【LOJ】 #2025. 「JLOI / SHOI2016」方

    题解 有什么LNOI啊,最后都是JLOI罢了 一道非常--懵逼的统计题 当然是容斥,所有的方案 - 至少有一个点坏掉的正方形 + 至少有两个点坏掉的正方形 - 至少有三个点坏掉的正方形 + 至少有四个 ...

  6. openfire 部署后报错: java.lang.IllegalArgumentException: interface xx is not visible from class loader

    该异常是创建代理时加载接口的类加载器与创建时传入的不一致. 在本地eclipse做openfire二次开发,本地运行没错,部署到服务器上后报异常:  java.lang.IllegalArgument ...

  7. thinkphp中常用的模板变量

    在thinkphp中的模板要加载静态文件如css,js等文件时要经常用到模板常量. 假如项目放在/web/shop中,则如下所示对应常量的输出值: 1 2 3 4 5 6 7 8 9 // 不含域名 ...

  8. 基于Laravel开发博客应用系列 —— 使用Bower+Gulp集成前端资源

    本节我们将讨论如何将前端资源集成到项目中,包括前端资源的发布和引入.本项目将使用 Bower 和 Gulp 下载和集成jQuery.Bootstrap.Font Awesome 以及 DataTabl ...

  9. Oracle数据库的基本查询

    本文用的是Oracle 10g数据库,利用PL/SQL Developer的集成开发环境(安装可以自行百度) Oracle数据库  ---> 数据库实例  --->  表空间(逻辑单位)( ...

  10. github安装k8s

    转:https://mritd.me/2016/10/29/set-up-kubernetes-cluster-by-kubeadm/#23镜像版本怎么整 一.环境准备 首先环境还是三台虚拟机,虚拟机 ...