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

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

□ 前台视图部分

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

□ 控制器部分

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

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

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

□ 思路

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

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

□ 需要引用的js文件

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

□ View Model

属性类型为HttpPostedFileBase。

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

□ HomeController

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

□ Home/Index.cshtml

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

相应界面:

□ FileController

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

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

  <system.web>
    <!--10240 Kb = 10 MB-->
    <httpRuntime targetFramework="4.5" maxRequestLength= "10240" />
    ...
  </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. win7下weblogic安装与部署项目调试记录

    下载 weblogic12c, 官网下载通用版本 安装 略 下载jdk   jdk所有版本连接 http://www.oracle.com/technetwork/java/archive-13921 ...

  2. MySQL学习笔记:exists和in的区别

    一.exists函数 表示存在,常常与子查询配合使用. 用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False. 当子查询返回为真时,则外层查询语句将进行 ...

  3. java遍历ftp文件夹下所有文件(或指定文件下的文件)

    import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import org.apach ...

  4. Apache Kylin安装部署

    0x01 Kylin安装环境 Kylin依赖于hadoop大数据平台,安装部署之前确认,大数据平台已经安装Hadoop, HBase, Hive. 1.1 了解kylin的两种二进制包 预打包的二进制 ...

  5. 开源框架:SDWebImage

    http://blog.csdn.net/uxyheaven/article/details/7909373 SDWebImage是我搞iOS以来少数佩服的框架,膜拜一下作者.真的写的非常棒! 这套开 ...

  6. 【LOJ】#2052. 「HNOI2016」矿区

    题解 之前尝试HNOI2016的时候弃坑的一道,然后给补回来 (为啥我一些计算几何就写得好长,不过我写啥都长orz) 我们尝试给这个平面图分域,好把这个平面图转成对偶图 怎么分呢,我今天也是第一次会 ...

  7. 【AtCoder】ARC095 C-F题解

    我居然每道题都能想出来 虽然不是每道题都能写对,debug了很久/facepalm C - Many Medians 排序后前N/2个数的中位数时排序后第N/2 + 1的数 其余的中位数都是排序后第N ...

  8. Java访问者模式

    结构对象会遍历它自己所保存的聚集中的所有节点,在本系统中就是节点NodeA和NodeB.首先NodeA会被访问到,这个访问是由以下的操作组成的: (1)NodeA对象的接受方法accept()被调用, ...

  9. wampserver的安装和使用

    首先想说一下通常搭建WAMP平台的时候主要分为散装包搭建和集成包搭建过程. 散装包搭建就是把PHP,Apache,MySQL等下载下来,一个个的安装,其过程灰常的复杂,而且需要配置的系统变量和修改的文 ...

  10. linux kernel.shmall shemax shemin解释

        Linux X86-64操作系统,Oracle 10g数据库,由8G加到16G,把kernel.shmmax参数改到17179869184(16G)后,发现只要修改sga_max_size和s ...