本篇体验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格式,出现报错: 

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

  1. MVC文件上传01-使用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. 利用struts2进行单个文件,批量文件上传,ajax异步上传以及下载

    利用struts2进行单个文件,批量文件上传,ajax异步上传以及下载 1.页面显示代码 <%@ page language="java" import="java ...

  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. ASP.NET MVC中,怎么使用jquery/ajaxForm上传文件

    ajaxForm插件最好选择:jquery forms plugin. 以下为示例: Ajax.BeginForm @using (Ajax.BeginForm("YourAction&qu ...

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

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

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

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

随机推荐

  1. 从零开始学android开发-IDE空间不够报错

    E:\ProSoft\adt-bundle-windows-x86-20140321\eclipse目录下 右键eclipse用记事本打开 可以设置运行的最大的运行空间

  2. CMake 命令行设定编译环境

    笔者电脑安装了两个版本的VS(VS2012  和 VS2010),在使用CMake编译的时候,如果只在对应目录的命令行输入 "cmake .." 则系统会自动选择使用新版本(VS2 ...

  3. [Effective C++ --009]确定对象被使用前已先被初始化

    在确保对象在使用前已先被初始化这一条款的编码实践中,作者为我们总结了三条经验,它们分别是: ------------------------------------------------------ ...

  4. LLBLGen代码生成工具

    LLBLGen代码生成工具 下载地址:http://www.llblgen.com/ 最新版本4.2 概述 LLBLGen是一个数据访问的解决方案; 你使用LLBLGen创建实体/域模型,定义了映射和 ...

  5. 浅谈iOS中的视图优化

    引言: 让我们来思考几个问题,你开发过的产品,它还有可以优化的地方吗?能增加它的帧率吗?能减少多余的CPU计算吗?是不是存在多余的GPU渲染?业务这点工作量对于越来越强大的设备面前显得微不足道,但作为 ...

  6. Android4.4 + WebAPI 实现拍照上传

    网上有很多关于拍照上传的实现方法,如果用新版本android去运行有可能会发现根本实现不了.主要原因是android从4.4版本开始通过intent.ACTION_GET_CONTENT打开选择器后, ...

  7. c/c++编译原理

    转载自:http://blog.csdn.net/chengocean/article/details/6250779C源程序-->预编译处理(.c)-->编译.优化程序(.s..asm) ...

  8. 定位CoreLocation

    一.定位 iOS三种定位方式: CoreLocation 按定位的准确性: GPS(Global Positioning System全球定位系统); 蜂窝式基站; wifi; 定位顺序:1. 首选G ...

  9. GitHub帮助文档翻译2——contribution

    工欲善其事必先利其器 ,都不知道 GitHub到底是什么,还怎么玩?因为总是会读了第一句就忘了下一句,形成不了感觉,所以希望把读GitHub的帮助文档都翻译出来,总是看大段大段的东西,谁都会懵圈的.希 ...

  10. android之模拟器更新底层

    Android源码修改,编译后得到system.img 替换\AndroidSDK\system-images\android-21\android-tv\armeabi-v7a\目录中的system ...