验证图片的真实类型
2010-08-26 13:41 音乐让我说 阅读(422) 评论(0) 编辑 收藏 举报代码如下:
/// <summary> /// 验证图片的真实类型,并尝试保存图片 /// </summary> /// <param name="imgStream">图片流</param> /// <param name="savedDirPathIsVirtual">图片被保存的目录是虚拟路径吗?true 表示是,false 表示是物理路径</param> /// <param name="savedDirPath">图片被保存的目录,如果不存在,则创建。如果是虚拟路径则参考的格式为“~/img/upload”。否则,参考的格式为“D:\img\upload”</param> /// <param name="fileNameWithoutPathAndExtension">保存的图片的文件名,不包含目录名和扩展名</param> /// <param name="allowFileEmpty">允许上传的文件为空吗</param> /// <param name="limitedImgSize_MB">限制文件的大小吗?为小于或等于零表示不限制。否则,如果限制,最大允许的大小为多少兆(M)</param> /// <param name="errorMessage">如果返回值为false,那么将返回的错误消息,否则,为 NULL</param> /// <param name="fileFullName">如果上传控件有图片,并且格式验证通过,保存成功后,输出被保存的路径。否则,为 NULL</param> /// <returns>验证结果,true表示成功,false表示失败</returns> public static bool ValidateImgExtensionAndSave(Stream imgStream, bool savedDirPathIsVirtual, string savedDirPath, string fileNameWithoutPathAndExtension, bool allowFileEmpty, double limitedImgSize_MB, out string errorMessage, out string fileFullName) { if (imgStream == null) { throw new ArgumentNullException("imgStream"); } string absolutePath; if (savedDirPathIsVirtual) { // 虚拟路径 absolutePath = HttpContext.Current.Server.MapPath(savedDirPath); } else { absolutePath = savedDirPath; } errorMessage = null; fileFullName = null; if (imgStream.Length == 0) { if (allowFileEmpty) { //允许上传的文件为空 return true; } else { //一定要有文件 errorMessage = "图片不存在,或者图片的大小为空!"; return false; } } BinaryReader r = new BinaryReader(imgStream); string fileclass = ""; byte buffer; try { buffer = r.ReadByte(); fileclass = buffer.ToString(); buffer = r.ReadByte(); fileclass += buffer.ToString(); //r.Close(); } catch (Exception) { r.Close(); imgStream.Close(); errorMessage = "读取图片流失败,请确定您图片的正确性!"; return false; } //说明255216是jpg;7173是gif;6677是BMP,13780是PNG;7790是exe,8297是rar if (fileclass == "255216" || fileclass == "7173" || fileclass == "6677" || fileclass == "13780") { //成功 if (limitedImgSize_MB > 0d) { //限制图片的大小 double imgSize = (double)imgStream.Length / (1024 * 1024); if (imgSize > limitedImgSize_MB) { errorMessage = "图片的大小最大不能超过 " + limitedImgSize_MB + " M(兆)"; imgStream.Close(); return false; } } string imgExtension = string.Empty; System.Drawing.Imaging.ImageFormat imgFormat; switch (fileclass) { case "255216": imgExtension = ".jpg"; imgFormat = System.Drawing.Imaging.ImageFormat.Jpeg; break; case "7173": imgExtension = ".gif"; imgFormat = System.Drawing.Imaging.ImageFormat.Gif; break; case "6677": imgExtension = ".bmp"; imgFormat = System.Drawing.Imaging.ImageFormat.Bmp; break; case "13780": imgExtension = ".png"; imgFormat = System.Drawing.Imaging.ImageFormat.Png; break; default: imgFormat = System.Drawing.Imaging.ImageFormat.Jpeg; break; } System.Drawing.Image img = System.Drawing.Image.FromStream(imgStream); if (!Directory.Exists(absolutePath)) { try { Directory.CreateDirectory(absolutePath); } catch (Exception e) { errorMessage = "创建用来保存图片的文件夹失败,请联系管理员!异常信息:" + e.Message; return false; } } string imgFullName = Path.Combine(absolutePath, fileNameWithoutPathAndExtension + imgExtension); img.Save(imgFullName, imgFormat); img.Dispose(); imgStream.Close(); fileFullName = Path.Combine(savedDirPath, fileNameWithoutPathAndExtension + imgExtension); return true; } else { errorMessage = "图片格式不正确!"; return false; } } /// <summary> /// 验证图片的真实类型,并尝试保存图片 /// </summary> /// <param name="postedFile">提交的文件信息</param> /// <param name="savedDirPathIsVirtual">图片被保存的目录是虚拟路径吗?true 表示是,false 表示是物理路径</param> /// <param name="savedDirPath">图片被保存的目录,如果不存在,则创建。如果是虚拟路径则参考的格式为“~/img/upload”。否则,参考的格式为“D:\img\upload”</param> /// <param name="fileNameWithoutPathAndExtension">保存的图片的文件名,不包含目录名和扩展名</param> /// <param name="allowFileEmpty">允许上传的文件为空吗</param> /// <param name="limitedImgSize_MB">限制文件的大小吗?为小于或等于零表示不限制。否则,如果限制,最大允许的大小为多少兆(M)</param> /// <param name="errorMessage">如果返回值为false,那么将返回的错误消息,否则,为 NULL</param> /// <param name="fileFullName">如果上传控件有图片,并且格式验证通过,保存成功后,输出被保存的路径。否则,为 NULL</param> /// <returns>验证结果,true表示成功,false表示失败</returns> public static bool ValidateImgExtensionAndSave(HttpPostedFileBase postedFile, bool savedDirPathIsVirtual, string savedDirPath, string fileNameWithoutPathAndExtension, bool allowFileEmpty, double limitedImgSize_MB, out string errorMessage, out string fileFullName) { if (postedFile == null) { throw new ArgumentNullException("postedFile"); } return ValidateImgExtensionAndSave(postedFile.InputStream, savedDirPathIsVirtual, savedDirPath, fileNameWithoutPathAndExtension, allowFileEmpty, limitedImgSize_MB, out errorMessage, out fileFullName); } /// <summary> /// 验证图片的真实类型,并尝试保存图片 /// </summary> /// <param name="imgContent">图片字节内容</param> /// <param name="savedDirPathIsVirtual">图片被保存的目录是虚拟路径吗?true 表示是,false 表示是物理路径</param> /// <param name="savedDirPath">图片被保存的目录,如果不存在,则创建。如果是虚拟路径则参考的格式为“~/img/upload”。否则,参考的格式为“D:\img\upload”</param> /// <param name="fileNameWithoutPathAndExtension">保存的图片的文件名,不包含目录名和扩展名</param> /// <param name="allowFileEmpty">允许上传的文件为空吗</param> /// <param name="limitedImgSize_MB">限制文件的大小吗?为小于或等于零表示不限制。否则,如果限制,最大允许的大小为多少兆(M)</param> /// <param name="errorMessage">如果返回值为false,那么将返回的错误消息,否则,为 NULL</param> /// <param name="fileFullName">如果上传控件有图片,并且格式验证通过,保存成功后,输出被保存的路径。否则,为 NULL</param> /// <returns>验证结果,true表示成功,false表示失败</returns> public static bool ValidateImgExtensionAndSave(byte[] imgContent, bool savedDirPathIsVirtual, string savedDirPath, string fileNameWithoutPathAndExtension, bool allowFileEmpty, double limitedImgSize_MB, out string errorMessage, out string fileFullName) { if (imgContent == null) { throw new ArgumentNullException("postedFile"); } return ValidateImgExtensionAndSave(new MemoryStream(imgContent), savedDirPathIsVirtual, savedDirPath, fileNameWithoutPathAndExtension, allowFileEmpty, limitedImgSize_MB, out errorMessage, out fileFullName); }
谢谢浏览!
作者:音乐让我说(音乐让我说 - 博客园)
出处:http://music.cnblogs.com/
文章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。