在ASP.NET MVC下实现单个图片上传, 客户端服务端双重限制图片大小和格式, 服务端裁剪图片
在"MVC文件图片ajax上传轻量级解决方案,使用客户端JSAjaxFileUploader插件01-单文件上传"一文中,使用JSAjaxFileUploader这款插件实现了单文件上传,在chrome, firefox下运行良好,但在某些版本的IE浏览器(比如IE8,IE9)下却无法正常运行,这可能是因为JSAjaxFileUploader插件在编写时没有考虑到某些低版本IE浏览器导致的。本篇,就在ASP.NET MVC4下实现单个图片上传,具体功能包括:
1、在客户端选择图片,并限制图片的大小和格式
2、在客户端上传图片,并显示预览图
3、在服务端限制图片的大小和格式
4、在服务端保存图片时,把图片裁剪成某个固定尺寸
本篇源码在:https://github.com/darrenji/FileUploadInMVC

实现的大致思路是:
○ 客户端限制图片大小和格式,通过写一个jQuery插件来实现
○ 服务端实现图片裁剪,通过使用ImageSize组件来实现
首先是一个用来承载上传信息的类:
public class UploadFileResult{//带后缀的名称,比如xxx.jpgpublic string FileName { get; set; }//图片的字节数public int Length { get; set; }//图片的类型:image/jpegpublic string Type { get; set; }public bool IsValid { get; set; }public string Message { get; set; }//图片的完整路径:~/AjaxUpload/20141112_large.jpgpublic string FilePath { get; set; }}
在HomeController中,需要提供一个接收前端上传文件并返回json格式的Action方法,还需要提供一个根据文件名删除图片的Action方法。
using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Web;using System.Web.Mvc;using ImageResizer;using MvcApplication10.Models;namespace MvcApplication10.Controllers{public class HomeController : Controller{public ActionResult Index(){return View();}//接收上传图片[HttpPost]public ActionResult UploadFile(){//允许的图片格式var allowedExtensions = new[] { ".png", ".gif", ".jpg", ".jpeg" };//返回给前台的结果,最终以json返回List<UploadFileResult> results = new List<UploadFileResult>();//遍历从前台传递而来的文件foreach (string file in Request.Files){//把每个文件转换成HttpPostedFileBaseHttpPostedFileBase hpf = Request.Files[file] as HttpPostedFileBase;//如果前台传来的文件为null,继续遍历其它文件if (hpf.ContentLength == 0 || hpf == null){continue;}else{if (hpf.ContentLength > 1024*1024) //如果大于规定最大尺寸{results.Add(new UploadFileResult(){FileName = "",FilePath = "",IsValid = false,Length = hpf.ContentLength,Message = "图片尺寸不能超过1024KB",Type = hpf.ContentType});}else{var extension = Path.GetExtension(hpf.FileName);if (!allowedExtensions.Contains(extension))//如果文件的后缀名不包含在规定的后缀数组中{results.Add(new UploadFileResult(){FileName = "",FilePath = "",IsValid = false,Length = hpf.ContentLength,Message = "图片格式必须是png、gif、jpg或jpeg",Type = hpf.ContentType});}else{//给上传文件改名string date = DateTime.Now.ToString("yyyyMMddhhmmss");//目标文件夹的相对路径 ImageSize需要的格式string pathForSaving = Server.MapPath("~/AjaxUpload/");//目标文件夹的相对路径 统计文件夹大小需要的格式string pathForSaving1 = Server.MapPath("~/AjaxUpload");//在根目录下创建目标文件夹AjaxUploadif (this.CreateFolderIfNeeded(pathForSaving)){//保存小图var versions = new Dictionary<string, string>();versions.Add("_small", "maxwidth=400&maxheight=250&format=jpg");//versions.Add("_medium", "maxwidth=200&maxheight=200&format=jpg");//versions.Add("_large", "maxwidth=600&maxheight=600&format=jpg");//保存各个版本的缩略图foreach (var key in versions.Keys){hpf.InputStream.Seek(0, SeekOrigin.Begin);ImageBuilder.Current.Build(new ImageJob(hpf.InputStream,pathForSaving + date + key, //不带后缀名的图片名称new Instructions(versions[key]),false,//是否保留原图true));//是否增加后缀}results.Add(new UploadFileResult(){FileName = date + "_small" + ".jpg",FilePath = Url.Content(String.Format("~/AjaxUpload/{0}", date + "_small" + ".jpg")),IsValid = true,Length = hpf.ContentLength,Message = "上传成功",Type = hpf.ContentType});}}}}}return Json(new{filename = results[0].FileName,filepath=results[0].FilePath,isvalid=results[0].IsValid,length=results[0].Length,message=results[0].Message,type=results[0].Type});}//根据文件名删除文件[HttpPost]public ActionResult DeleteFileByName(string smallname){string pathForSaving = Server.MapPath("~/AjaxUpload");System.IO.File.Delete(Path.Combine(pathForSaving, smallname));return Json(new{msg = true});}//根据相对路径在项目根路径下创建文件夹private bool CreateFolderIfNeeded(string path){bool result = true;if (!Directory.Exists(path)){try{Directory.CreateDirectory(path);}catch (Exception){result = false;}}return result;}}}
在Home/Index.cshtml中,使用checkFileTypeAndSize.js插件(在"写一个限制上传文件大小和格式的jQuery插件"中所写的插件)来限制上传图片的大小和格式,使用FormData对象来接收图片文件并传递给服务端,客户端接收到服务端json数据动态创建表格行把预览图显示出来。
@{ViewBag.Title = "Index";Layout = "~/Views/Shared/_Layout.cshtml";}<style type="text/css">#msg {color: red;}</style><form id="file_upload_form" method="post" enctype="multipart/form-data" action=""><input name="file" id="file" size="27" type="file" /><img src="~/images/ajax-loader.gif" id="indicator" style="display: none;" /><br /><div id="imgArea"><table id="tbl"><tbody></tbody></table></div><div><span id="msg"></span></div></form>@section scripts{<script src="~/Scripts/checkFileTypeAndSize.js"></script><script type="text/javascript">$(function() {$("#file").checkFileTypeAndSize({allowedExtensions: ['jpg','jpeg','gif','png'],maxSize: 1024, //最大允许1024KB,即1MBsuccess: function () {//显示进度提示$('#indicator').css("display", "block");//清空提示内容$('#msg').text('');if ($('#fn').text().length > 0) {//删除图片deleteImg();}//上传文件数据准备var fd = new FormData();fd.append('image', $('#file')[0].files[0]);$.ajax({url: '@Url.Action("UploadFile","Home")',type: "POST",data: fd,contentType: false,cache: false,processData: false,dataType: 'json',success: function (data) {//隐藏进度提示$('#indicator').css("display", "none");if (data.isvalid) {//$('#fileTemplate').tmpl(data).appendTo('#imgArea');createTableTr();$('#thumb').attr('src', data.filepath);$('#fn').text(data.filename);} else {$('#msg').text(data.message);}}});},extensionerror: function () {//alert('允许的格式为:jpg,jpeg,gif,png');$('#msg').text('允许的格式为:jpg,jpeg,gif,png');return;},sizeerror: function () {//alert('最大尺寸1024KB,即1MB');$('#msg').text('最大尺寸1024KB,即1MB');return;}});});//删除图片function deleteImg() {$.ajax({cache: false,url: '@Url.Action("DeleteFileByName", "Home")',type: "POST",data: { smallname: $('#fn').text() },success: function (data) {if (data.msg) {$('#fn').parent().parent().remove();}},error: function (jqXhr, textStatus, errorThrown) {alert("出错了 '" + jqXhr.status + "' (状态: '" + textStatus + "', 错误为: '" + errorThrown + "')");}});}//创建表格function createTableTr() {var table = $('#tbl');table.append("<tr><td><img id='thumb' /></td><td colspan='2'><span id='fn'></span></td></tr>");}</script>}
在ASP.NET MVC下实现单个图片上传, 客户端服务端双重限制图片大小和格式, 服务端裁剪图片的更多相关文章
- 【NopCommerce 3.1】asp.net mvc 利用jQuery from.js上传用户头像
纯代码不解释. 在CusotmerControllers中添加上传方法 /// <summary> /// ajax上传用户头像 /// </summary> /// < ...
- ASP.NET MVC 5 with EF 6 上传文件
参考 ASP.NET MVC 5 with EF 6 - Working With Files Rename, Resize, Upload Image (ASP.NET MVC) ASP ...
- ASP.NET MVC使用jQuery无刷新上传
昨晚网友有下载了一个jQuery无刷新上传的小功能,他尝试搬至ASP.NET MVC应用程序中去,在上传死活无效果.Insus.NET使用Teamviewer远程桌面,操作一下,果真是有问题.网友是说 ...
- ASP.NET MVC实现Excel文件的上传下载
在应用系统开发当中,文件的上传和下载是非常普遍的需求.在基于.NET的C/S架构的项目开发当中,有多种方案可以实现文件的上传和下载(httpwebrequest.webclient等),而且多采用异步 ...
- C#工具:ASP.NET MVC单例模式(懒汉)实现文件上传
1.SingletonConfigRead帮助类 using System; using System.Collections.Generic; using System.IO; using Syst ...
- asp.net mvc 使用uploadfiles 实现异步上传数据
lesg.cn 文章发布在: http://www.lesg.cn/netdaima/net/2017-990.html 在实际开发过程中, 为了提高用户的体验,在上传文件的时候通常会使用异步上传文 ...
- ASP.NET MVC WebAPI实现文件批量上传
工作中学习,学习中记录~~~~~~ 最下面附上demo 任务需求:需要做一个apI接口让C#的程序调用实现批量文件的上传. 难度: 没有做过通过API上传文件的...之前做过网站前后台上传. 首先当然 ...
- asp.net mvc+webuploader大文件分片上传
首先是前端: var GUID = WebUploader.Base.guid();//一个GUID uploadereditsVideo = WebUploader.create({ // swf文 ...
- 在ASP.NET MVC下有关上传图片脏数据的解决方案
在"在ASP.NET MVC下实现单个图片上传, 客户端服务端双重限制图片大小和格式, 服务端裁剪图片"中,已经实现了在客户端和服务端限制图片大小和格式,以及在服务端裁剪图片.但还 ...
随机推荐
- Windows修改默认远程端口号3389
1.打开注册表:运行-regedit: 2.HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server\Wds\Repwd\ ...
- Visual Studio 2012“完美的拥抱”Visual Studio Online
看了Visual Studio 2012完美的拥抱GitHub 写的不错,不过,配置起来太麻烦.既然是使用VS编码,微软的东西嘛,当然还有更简单的,那就是Visual Studio Online.不用 ...
- ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) 的解决办法
更换mysql数据目录后出现ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql ...
- 浅谈js设计模式 — 命令模式
命令模式最常见的应用场景是:有时候需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是什么.此时希望用一种松耦合的方式来设计程序,使得请求发送者和请求接收者能够消除彼此之间的耦 ...
- activiti helloworld
activiti helloworld activiti的入门实践文章,重点在于动手做,要解决的是怎么做的问题.只有知道了怎么做后,才具有实际动手能力,才算对这门技术有一个初步掌握:至于更深入细化的知 ...
- Java 接口关键字 interface
interface这个关键字产生一个完全抽象的类,它根本就没有提供任何具体的实现,它允许创建者确定方法名.参数列表和返回类型,但没有任何方法体,接口只提供了形式,而未提供任何具体实现 一个接口表示:& ...
- Zookeeper命令行zkCli.sh&zkServer.sh的使用(四)
上篇博文,我们成功的安装和启动了zookeeper服务器,zookeeper还提供了很多方便的功能,方便我们查看服务器的状态,增加,修改,删除数据(入口是zkServer.sh和zkCli.sh).还 ...
- HTML5+ App开发入门
HTML5 Plus应用概述 HTML5 Plus移动App,简称5+App,是一种基于HTML.JS.CSS编写的运行于手机端的App,这种App可以通过扩展的JS API任意调用手机的原生能力,实 ...
- **linux实用命令之如何移动文件夹及文件下所有文件
http://www.linuxde.net/2013/02/12448.html 格式: mv [选项(option)] 源文件或目录 目标文件或目录 使用命令: mv webdata /bin/u ...
- python的mock功能,感觉入门了~~~
主要实现语法有patch, patch.object, Mock(). 下面的测试太赤裸裸了,只是为了熟悉语法. import unittest from unittest.mock import p ...