之前上传图片基本都是用的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,") + 7));//切除前面那段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 = 1;
result.ErrorMessage = "图片超过限制大小";
}
if (result.ErrorCode != 0)// 如果有出错,返回路径变成空
{
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 = 1; 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 = 1; 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 = 1; result.ErrorMessage = "上传的图片超过限制大小"; } if (result.ErrorCode != 0)// 如果有出错,返回路径变成空 { result.ReturnPath = ""; } return result; }
如果上面所讲有错或者不足的地方还请各位朋友指出,感激不尽