今天在MVC模式下做图片上传的时候,执行调试后上传图片,缩略图显示正常,可是选了另外一张图片上传时,缩略图显示为空白,首先将前台代码放上:
1 <h2>上传图片</h2> 2 @using (Html.BeginForm("Upload", "Product", FormMethod.Post, new { enctype = "multipart/form-data" })) 3 { 4 <table class="list"> 5 <tr> 6 <th>请选择要上传的图片</th> 7 <td> 8 <input type="file" name="imgfile" /> 9 </td> 10 </tr> 11 <tr> 12 <th></th> 13 <td> 14 <input type="submit" value="上传" /> 15 </td> 16 </tr> 17 </table> 18 }
后台的上传方法如下:
1 // <summary> 2 /// 保存图片 3 /// </summary> 4 /// <param name="id"></param> 5 /// <returns></returns> 6 [HttpPost] 7 public ActionResult Upload(int id,FormCollection form) 8 { 9 //1.0通过缩略图的虚拟路径获取物理路径 10 string thumPath = Server.MapPath("/upload/thum/"); 11 //2.0原图像的物理存放路径 12 string imgPath = Server.MapPath("/upload/img/"); 13 //2.0接收图片(因为只有一张,所有可以通过索引获取) 14 var file=Request.Files[0]; 15 if (file != null) 16 { 17 //获得图片的名称 18 string filename = file.FileName; 19 //从文件名中获取图片的拓展名 20 string extension = System.IO.Path.GetExtension(filename); 21 22 //利用GUID拼接新的图片文件名 23 string newFileName = Guid.NewGuid() + extension; 24 25 //3.0实现图片的缩略图 26 using (Image oldImg = Image.FromStream(file.InputStream)) 27 { 28 29 Image thumImg = oldImg.GetThumbnailImage(120, 120, () => false, IntPtr.Zero); 30 31 //将缩略图保存到物理路径中 32 thumImg.Save(thumPath + newFileName); 33 34 //将原始图片保存到物理起来 35 oldImg.Save(imgPath + newFileName); 36 37 //4.0将图片保存到数据库中 38 var entity = productBLL.Where(c => c.p_id == id).FirstOrDefault(); 39 entity.img_url = newFileName; 40 productBLL.SaveChanges(); 41 } 42 } 43 return Redirect("/Admin/Product/List"); 44 }
发现问题后,于是通过查看图片的属性中的详细信息来比较两张图片的区别,结果发现上传后缩略图为空白的图片存在像素单位为2,而上传后缩略图正常的图片没有像素单位,个人觉得应该是像素单位导致的问题,此后我上传其它没有像素单位的图片,缩略图都显示正常,为了解决此问题,个人使用了自定义的图片压缩方法,修改代码如下:
1 // <summary> 2 2 /// 保存图片 3 3 /// </summary> 4 4 /// <param name="id"></param> 5 5 /// <returns></returns> 6 6 [HttpPost] 7 7 public ActionResult Upload(int id,FormCollection form) 8 8 { 9 9 //1.0通过缩略图的虚拟路径获取物理路径 10 10 string thumPath = Server.MapPath("/upload/thum/"); 11 11 //2.0原图像的物理存放路径 12 12 string imgPath = Server.MapPath("/upload/img/"); 13 13 //2.0接收图片(因为只有一张,所有可以通过索引获取) 14 14 var file=Request.Files[0]; 15 15 if (file != null) 16 16 { 17 17 //获得图片的名称 18 18 string filename = file.FileName; 19 19 //从文件名中获取图片的拓展名 20 20 string extension = System.IO.Path.GetExtension(filename); 21 21 22 22 //利用GUID拼接新的图片文件名 23 23 string newFileName = Guid.NewGuid() + extension; 24 24 25 25 //3.0实现图片的缩略图 26 26 using (Image oldImg = Image.FromStream(file.InputStream)) 27 27 { 28 28 //初始化一个位图 29 29 using (Image thumImg = new Bitmap(120, 120)) 30 { 31 //初始化画家 32 using (Graphics g = Graphics.FromImage(thumImg)) 33 { 34 //压缩上传的图片,保存到位图中 35 g.DrawImage(oldImg, new Rectangle(0, 0, thumImg.Width, thumImg.Height), new Rectangle(0, 0, oldImg.Width, oldImg.Height), GraphicsUnit.Pixel); 36 37 } 38 //将缩略图保存到路径中 39 thumImg.Save(thumPath + newFileName); 40 } 41 33 42 34 //将原始图片保存到物理起来 43 35 oldImg.Save(imgPath + newFileName); 44 36 45 37 //4.0将图片保存到数据库中 46 38 var entity = productBLL.Where(c => c.p_id == id).FirstOrDefault(); 47 39 entity.img_url = newFileName; 48 40 productBLL.SaveChanges(); 49 41 } 50 42 } 51 43 return Redirect("/Admin/Product/List"); 52 44 }