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提交表单来把大数据传到后台的。