MVC3 + Ajax 图片上传总结

方法一:uploadify插件

1.Ajax 往后台Post 的数据有两种,一种是文本类型,一种是大数据文件图片等。而Ajax不能直接传大数据文件,只能借助插件实现该功能。

@{

    ViewBag.Title = "Index";

}



<h2>Index</h2>



   <script src="http://www.cnblogs.com/Scripts/swfobject.js" type="text/javascript"></script>



    <script src="http://www.cnblogs.com/Scripts/jquery.uploadify.v2.1.0.min.js" type="text/javascript"></script>



    <link href="http://www.cnblogs.com/Content/uploadify.css" rel="stylesheet" type="text/css" />



    <style type="text/css">

        .textstyle1

        {

            color: Red;

            font-weight: bold;

        }

        .textstyle2

        {

            color: Green;

            font-weight: bold;

        }

    </style>



    <script type="text/javascript">

        $(function () {

            //上传

            $('#fileInput1').uploadify({

                'uploader': '/Content/uploadify.swf',

                'script': '/Upload/AddPic',

                'folder': '/Upload',

                'cancelImg': '/Content/cancel.png',

                'fileExt': '*.xls',

                'fileDesc': '*.xls',

                'sizeLimit': 1024 * 1024 * 4, //4M

                'multi': false,

                'onComplete': fun

            });



        });

        function fun(event, queueID, fileObj, response, data) {

            if (response != "") {

                showInfo("成功上传" + response, true); //showInfo方法设置上传结果     

            }

            else {

                showInfo("文件上传出错!", false);

            }

        }

        //显示提示信息,textstyle2为绿色,即正确信息;textstyl1为红色,即错误信息

        function showInfo(msg, type) {

            var msgClass = type == true ? "textstyle2" : "textstyle1";

            $("#result").removeClass();

            $("#result").addClass(msgClass);

            $("#result").html(msg);

        }

        //如果点击‘导入文件’时选择文件为空,则提示

        function checkImport() {

            if ($.trim($('#fileInput1Queue').html()) == "") {

                alert('请先选择要导入的文件!');

                return false;

            }

            return true;

        } 

    </script>





<div>

    <input type="text" id="test" />

    <p><input id="fileInput1" name="fileInput1" type="file"/></p>

    <p style="margin-top:5px;font-size:14px;font-weight:bold;">

    <a href="javascript:if(checkImport()){$('#fileInput1').uploadifySettings('scriptData',{'name':$('#test').val()});$('#fileInput1').uploadifyUpload();}">导入文件</a></p>

    <p style="margin-top:5px;font-size:14px;font-weight:bold;"><span id="result"></span></p>

</div> 

  后台代码:

namespace qdxy.Controllers

{

    public class UploadController : Controller

    {

        //

        // GET: /Upload/



        public ActionResult Index()

        {

            return View();

        }



        [HttpPost]

        public JsonResult AddPic2(HttpPostedFileBase context)

        {

            int s = Request.ContentLength;

            //string fileName = Path.GetFileName(upImg.FileName);

            //string filePhysicalPath = Server.MapPath("~/Upload/"+fileName);





            //string name = "", message = "";

            //byte[] bytes  = new byte[]{};

            //try

            //{

            //    upImg.SaveAs(filePhysicalPath);

            //    name = Path.GetFileName(fileName);



            //    bytes = Encoding.Unicode.GetBytes("图片添加成功");

            //    for (int i = 0; i < bytes.Length; i+=2)

            //    {

            //        message += "\\u" + bytes[i+1].ToString("x").PadLeft(2,'0')+bytes[i].ToString("x").PadRight(2,'0');

            //    }



            //}

            //catch (Exception ex)

            //{

            //    message = ex.Message;

            //}



            return Json(new

            {

                //picpath = "/Upload/" + fileName,

                //message = message

            });

        }



        [HttpPost]

        public JsonResult AddPic(HttpPostedFileBase FileData, string folder, string name)

        {

            string title = string.Empty;

            string message = string.Empty;



            //将传过来的图片映射到物理硬盘的路径上

            string storeFilePath = Server.MapPath("~/Upload/"+FileData.FileName);



            try

            {

                //保存图片的方法

                FileData.SaveAs(storeFilePath);

                title = Path.GetFileName(folder);



                byte[] bytes = Encoding.Unicode.GetBytes("图片上传成功");

                //将图片转换成Unicode编码方便传输

                /*

                 * Unicode和汉字编码小知识 将汉字进行UNICODE编码,

                 * 如:“王”编码后就成了“\u738b”,UNICODE字符以\u开始,后面有4个数字或者字母

                 * ,所有字符都是16进制的数字,每两位表示的256以内的一个数字。

                 * 而一个汉字是由两个字符组成,于是就很容易理解了,

                 * “738b”是两个字符,分别是“73”“8b”。

                 * 但是在将 UNICODE字符编码的内容转换为汉字的时候,

                 * 字符是从后面向前处理的,所以,需要把字符按照顺序“8b”“73”

                 * 进行组合得到汉字

                 * */

                for (int i = 0; i < bytes.Length; i+=2)

                {

                    message += "\\u" + bytes[i + 1].ToString("x").PadLeft(2, '0') + bytes[i].ToString("x").PadRight(2,'0');

                }



            }

            catch (Exception ex)

            {

                message = ex.Message;

            }



            return Json(new {                    

                title = title,

                message = message

            });

        }



    }

}

  原本是想用Json来返回上传的结果的,但似乎客户端的uploadify插件的方法不支持json格式的数据,有待进一步研究。

方法二:利用 JQueryForm插件 详见:http://www.cnblogs.com/kfx2007/archive/2012/08/27/2658325.html

  这种方法是利用Form提交表单来把大数据传到后台的。

 

 

你可能感兴趣的:(Ajax)