之前上传图片基本都是用的HttpPostedFile方式获取图片,这次因为需求关系,要对准备上传的图片进行删除,最后提交的时候才去保存图片到服务器,

找了下资料,html5有个新的东西出来,js 里面的FileReader用法也写下,有了这个可以很快速的开发一个适配的图片上传插件出来

$('#img_upload').change(function () {// img_upload 为 input 标签的id
var maxsize = 2 * 1024 * 1024;//2M
var file = this.files[0];
var size = this.files[0].size;
var suffix = file.name.split('.')[1];
// 前端初步判断下后缀名是否为图片,更为精确的方式要在服务器端进行
if (suffix.toLowerCase() != "jpg" && suffix.toLowerCase() != "jpeg" && suffix.toLowerCase() != "gif" && suffix.toLowerCase() != "png") {
alert("请上传JPG、JPEG、GIF与PNG格式的图片");
return;
} if (size >= maxsize) {
alert("上传的文件必须小于2M!!!");
return;
} var r = new FileReader();
r.readAsDataURL(file);
$(r).load(function () {
document.getElementById("avatarimg").src = this.result;// this.result 就是 data:image/jpeg;base64,开头的base64格式图片
});
});

  服务器端处理如下

    /// <summary>
/// 将 html5 FileReader 读出来的base64格式图片转化成一定格式的图片存起来
/// </summary>
/// <param name="base64Str">开头为data:image/jpeg;base64, + base64图片字符串</param>
/// <param name="domain">引用程序域名</param>
/// <param name="savePath">根目录开始的保存路径: uploadfile\\201703 不存在该路径则会自动创建 </param>
/// <param name="saveName">2017030278787.jpg 中"." 前一段</param>
/// <param name="extension">.jpg</param>
/// <param name="limitSize">限制字节长度</param>
/// <returns>1:面向用户的错误信息 </returns>
public static SaveImageResult SaveBase64StrToImage(string base64Str, string domain, string savePath, string saveName, string extension, long limitSize)
{
SaveImageResult result = new SaveImageResult();
string imgFullName = saveName + extension; // 格式类似 20170903787878.jpg
try
{
result.ReturnPath = domain + "/" + savePath.Replace("\\", "/") + "/" + imgFullName;// 格式类似 http:axx.xxx.com/uploadfile/2017/03/201709044645545454.jpg
}
catch (Exception)
{
throw new Exception("参数savePath格式错误");
}
byte[] arr = null;
try
{
arr = Convert.FromBase64String(base64Str.Substring(base64Str.IndexOf("base64,") + ));//切除前面那段image标识
}
catch (Exception)
{
throw new Exception("参数base64Str格式错误");
} long size = arr.LongLength; if (size <= limitSize)// 判断文件大小是否超出限制
{
string path = System.Web.HttpRuntime.AppDomainAppPath + savePath;// 获取物理路径 if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
} using (MemoryStream ms = new MemoryStream(arr))
{
try
{
                    Bitmap bmp = new Bitmap(ms);// 此处如果传入的不是一张图片,这里会抛异常
                    bmp.Save(path + "\\" + imgFullName);
}
catch (Exception)
{
throw new Exception("图片保存失败,请检查传入参数");
}
}
}
else
{
result.ErrorCode = ;
result.ErrorMessage = "图片超过限制大小";
}
if (result.ErrorCode != )// 如果有出错,返回路径变成空
{
result.ReturnPath = "";
}
return result;
}
    /// <summary>
/// base64格式转图片存储结果
///
/// </summary>
public class SaveImageResult
{
/// <summary>
/// 0:无错误 1:面向用户的错误信息
/// </summary>
public int ErrorCode { get; set; } /// <summary>
/// 错误信息
/// </summary>
public string ErrorMessage { get; set; } /// <summary>
/// 返回用于存储的路径
/// </summary>
public string ReturnPath { get; set; } }

 
 

base64方式讲完,下面再附上一个普通的HttpPostedFile方式上传的方法

/// <summary>
/// 保存上传的图片,自带用Image对象的方式判断是否为图片,自动获取后缀名
/// </summary>
/// <param name="file">文件 ,该参数可由System.Web.Request.Files集合的索引来得到</param>
/// <param name="savePath">根目录开始的保存路径: uploadfile\\201703 不存在该路径则会自动创建 </param>
/// <param name="saveName">2017030278787.jpg 中"." 前一段</param>
/// <param name="limitSize">限制字节长度</param>
/// <returns></returns>
public static SaveImageResult SaveImage(System.Web.HttpPostedFile file, string domain, string savePath, string saveName, long limitSize)
{
SaveImageResult result = new SaveImageResult();
if (file == null)
{
result.ErrorCode = ;
result.ErrorMessage = "请上传图片";
}
string extension = System.IO.Path.GetExtension(file.FileName);// 获取后缀名
string imgFullName = saveName + extension; // 格式类似 20170903787878.jpg
try
{
result.ReturnPath = domain + "/" + savePath.Replace("\\", "/") + "/" + imgFullName;// 格式类似 http:app.darchin.com/uploadfile/2017/03/201709044645545454.jpg
}
catch (Exception)
{
throw new Exception("参数savePath格式错误");
}
if (file.ContentLength <= limitSize)// 判断文件大小是否超出限制
{
System.Drawing.Image img = null;
try
{
img = System.Drawing.Image.FromStream(file.InputStream);
}
catch (Exception)
{
result.ErrorCode = ;
result.ErrorMessage = "请上传正确格式的图片";
} string path = System.Web.HttpRuntime.AppDomainAppPath + savePath;// 获取物理路径 if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
try
{
img.Save(path + "\\" + imgFullName);
}
catch (Exception)
{
throw new Exception("图片保存失败,请检查传入参数");
} }
else
{
result.ErrorCode = ;
result.ErrorMessage = "上传的图片超过限制大小";
}
if (result.ErrorCode != )// 如果有出错,返回路径变成空
{
result.ReturnPath = "";
}
return result;
}

如果上面所讲有错或者不足的地方还请各位朋友指出,感激不尽

Asp.Net HttpPostedFile和base64两种上传图片(文件)方式的更多相关文章

  1. Git 的两种忽略文件方式 gitignore 和 exclude

    Git 的两种忽略文件方式 gitignore 和 exclude .gitignore 不用说了,大家都知道. 有一个 exclude 可能接触比较少. 知道这个功能后发现,用在服务器上非常方便,因 ...

  2. Asp.Net Core下的两种路由配置方式

    与Asp.Net Mvc创建区域的时候会自动为你创建区域路由方式不同的是,Asp.Net Core下需要自己手动做一些配置,但更灵活了. 我们先创建一个区域,如下图 然后我们启动访问/Manage/H ...

  3. ASP.NET MVC下的四种验证编程方式[续篇]

    在<ASP.NET MVC下的四种验证编程方式>一文中我们介绍了ASP.NET MVC支持的四种服务端验证的编程方式("手工验证"."标注Validation ...

  4. ASP.NET MVC下的四种验证编程方式

    ASP.NET MVC采用Model绑定为目标Action生成了相应的参数列表,但是在真正执行目标Action方法之前,还需要对绑定的参数实施验证以确保其有效性,我们将针对参数的验证成为Model绑定 ...

  5. Form表单中method=post/get两种数据传输的方式的区别

    Form提供了两种数据传输的方式——get和post.虽然它们都是数据的提交方式,但是在实际传输时确有很大的不同,并且可能会对数据产生严重的影响.虽然为了方便的得到变量值,Web容器已经屏蔽了二者的一 ...

  6. ASP.NET MVC下的四种验证编程方式[续篇]【转】

    在<ASP.NET MVC下的四种验证编程方式> 一文中我们介绍了ASP.NET MVC支持的四种服务端验证的编程方式(“手工验证”.“标注ValidationAttribute特性”.“ ...

  7. ASP.NET MVC下的四种验证编程方式【转】

    ASP.NET MVC采用Model绑定为目标Action生成了相应的参数列表,但是在真正执行目标Action方法之前,还需要对绑定的参数实施验证以确保其有效 性,我们将针对参数的验证成为Model绑 ...

  8. Windows Azure VM的两种shut down 方式

    今天在调查Azure的价格时,发现下面的语句,来自http://azure.microsoft.com/en-us/pricing/details/virtual-machines/ * If my ...

  9. 两种隐藏元素方式【display: none】和【visibility: hidden】的区别

    此随笔的灵感来源于上周的一个面试,在谈到隐藏元素的时候,面试官突然问我[display: none]和[visibility: hidden]的区别,我当时一愣,这俩有区别吗,好像有,但是忘记了啊,因 ...

随机推荐

  1. [转]Prometheus 与 Grafana 实现服务器运行状态监控

    http://flintx.me/2017/12/12/Prometheus%20+%20Grafana%20%E5%AE%9E%E7%8E%B0%E6%9C%8D%E5%8A%A1%E5%99%A8 ...

  2. spring security实现动态配置url权限的两种方法

    缘起 标准的RABC, 权限需要支持动态配置,spring security默认是在代码里约定好权限,真实的业务场景通常需要可以支持动态配置角色访问权限,即在运行时去配置url对应的访问角色. 基于s ...

  3. HttpWatch入门使用教程

    HttpWatch V10.0.20.0 官方免费版 HttpWatch是强大的网页数据分析工具.集成... HttpWatch Professional V10.0.20.0 官方下载 HttpWa ...

  4. vue 中如何对公共css、 js 方法进行单文件统一管理,全局调用

    1.前言 最近,为公司开发交付的一个后台管理系统项目,我使用了 Vue 框架进行开发实践. 模块化.组件化.工程化的开发体验非常好.良好的 api,优雅的设计,对于工程师非常友好. 但是由于模块比较多 ...

  5. Bootstrap 框架、插件

    Bootstrap,前端工程师比较常用的框架.插件,根据它的定义,我们不妨这样理解,Bootstrap就是用于前端开发的一个模板,就是别人做好了我们直接可以搬过来直接使用或者根据自己需要略加修改设计自 ...

  6. JavaScript 组数去重demo

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  7. 查找常用字符(给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表。例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 3 次。)

    给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表. 例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 ...

  8. 安卓开发中SpannableString之富文本显示效果

    SpannableString其实和String一样,都是一种字符串类型,SpannableString可以直接作为TextView的显示文本,不同的是SpannableString可以通过使用其方法 ...

  9. 正则表达式在python中的简单使用

    正则表达式独立与编程语言,基本上所有的编程语言都实现了正则表达式的相关操作.在Python中正则表达式的表现为re模块: import re 其操作有三个方法: my_string = "h ...

  10. P2415 集合求和

    P2415 集合求和显然,一共有2^n个子集,对于其中的一个确定的元素,它不在的集合有2^(n-1),相当于有n-1元素,那么它存在的集合有,2^n-2^(n-1)==2^(n-1),那么集合的和为s ...