C#上传图片和生成缩略图以及图片预览
因工作需要,上传图片要增加MIME类型验证和生成较小尺寸的图片用于浏览。根据网上代码加以修改做出如下效果图:

前台代码如下:
1 <html xmlns="http://www.w3.org/1999/xhtml">
2 <head runat="server">
3 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
4 <title>上传图片和生成缩略图以及图片预览</title>
5 <link rel="stylesheet" type="text/css" href="http://www.jeasyui.com/easyui/themes/default/easyui.css">
6 <script type="text/javascript" src="http://code.jquery.com/jquery-1.6.min.js"></script>
7 <script type="text/javascript" src="http://www.jeasyui.com/easyui/jquery.easyui.min.js"></script>
8 </head>
9 <body>
10 <form id="form1" runat="server">
11 <table>
12 <tr>
13 <td>图片上传:
14 </td>
15 <td>
16 <input type="text" id="txtImgPath" class="easyui-textbox" runat="server" style="width: 235px;" />
17 <input type="button" id="btnPCImg" value="浏览..." onclick="showFileUp('FileUpload1')"
18 class="easyui-linkbutton btn" style="width: 106px;" />
19 <asp:FileUpload class="easyui-linkbutton btn" Style="display: none" ID="FileUpload1"
20 runat="server" onchange="apendtoText('txtImgPath',this)" />
21 <asp:Button class="easyui-linkbutton btn" ID="btnUpFile" runat="server" Text="上传图片"
22 OnClick="btnUpFile_OnClick" Width="106px" />
23 </td>
24 </tr>
25 <tr>
26 <td>图片预览:
27 </td>
28 <td>
29 <asp:Image ID="Image1" runat="server" />
30 <asp:TextBox ID="txtimg" Style="display: none;" runat="server" Height="20px"></asp:TextBox>
31 <asp:TextBox ID="oldimgpath" Style="display: none;" runat="server" Height="20px"></asp:TextBox>
32 </td>
33 </tr>
34 </table>
35 </form>
36 </body>
37 <script type="text/javascript">
38 /*
39 * 显示文件选择框
40 * id {String} 要显示的FileUp
41 */
42 function showFileUp(id) {
43 $('#' + id).click();
44 }
45 /*
46 * FileUp控件值改变后将该控件的值赋给其他控件
47 * id {String} 接收值的控件ID
48 * obj {Object} FileUp控件
49 */
50 function apendtoText(id, obj) {
51 $('#' + id).textbox('setText', $(obj).val());
52 }
53 </script>
54 </html>
后台代码如下:
1 /// <summary>
2 /// 上传图片
3 /// </summary>
4 /// <param name="sender"></param>
5 /// <param name="e"></param>
6 protected void btnUpFile_OnClick(object sender, EventArgs e)
7 {
8 if (FileUpload1.PostedFile.FileName != "")
9 {
10 if (FileUpload1.PostedFile.ContentLength <= 2048000)//只能上传小于或等于2MB的图片
11 {
12 FileExtension[] fe = { FileExtension.Gif, FileExtension.Jpg, FileExtension.Png };//允许的图片格式
13 if (FileValidation.IsAllowedExtension(FileUpload1, fe))
14 {
15 //}
16 //if (newFileExtensions == ".jpg" || newFileExtensions == ".gif" || newFileExtensions == ".bmp" || newFileExtensions == ".png")//直接使用文件后缀检查是否为允许类型
17 //{
18 string sfilename = FileUpload1.PostedFile.FileName;
19 int sfilenamehz = sfilename.LastIndexOf(".", StringComparison.Ordinal);
20 string newFileExtensions = sfilename.Substring(sfilenamehz).ToLower();
21 string pa = "uploadfiles/" + DateTime.Now.Year + "-" + DateTime.Now.Month + "/";//获取当前年份和月份作为文件夹名
22 if (!Directory.Exists("~/" + pa))//如不存在则创建文件夹
23 {
24 Directory.CreateDirectory(Server.MapPath("~/" + pa));
25 }
26 string newFileName = DateTime.Now.ToString("yyyyMMddHHmmss");
27 string uppath = "~/" + pa + newFileName + newFileExtensions;
28
29 Stream oStream = FileUpload1.PostedFile.InputStream;
30 System.Drawing.Image oImage = System.Drawing.Image.FromStream(oStream);
31
32 int oWidth = oImage.Width; //原图宽度
33 int oHeight = oImage.Height; //原图高度
34 int tWidth = 200; //设置缩略图初始宽度
35 int tHeight = 200; //设置缩略图初始高度
36
37 //按比例计算出缩略图的宽度和高度
38 if (oWidth >= oHeight)
39 {
40 tHeight = (int)Math.Floor(Convert.ToDouble(oHeight) * (Convert.ToDouble(tWidth) / Convert.ToDouble(oWidth)));
41 }
42 else
43 {
44 tWidth = (int)Math.Floor(Convert.ToDouble(oWidth) * (Convert.ToDouble(tHeight) / Convert.ToDouble(oHeight)));
45 }
46
47 //生成缩略原图
48 Bitmap tImage = new Bitmap(tWidth, tHeight);
49 Graphics g = Graphics.FromImage(tImage);
50 g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High; //设置高质量插值法
51 g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;//设置高质量,低速度呈现平滑程度
52 g.Clear(Color.Transparent); //清空画布并以透明背景色填充
53 g.DrawImage(oImage, new Rectangle(0, 0, tWidth, tHeight), new Rectangle(0, 0, oWidth, oHeight), GraphicsUnit.Pixel);
54
55 string upfilepath2 = "~/" + pa + newFileName + "_m" + newFileExtensions; //缩略图为原图后缀增加_m用于区分
56 string oFullName = Server.MapPath(uppath);
57 string tFullName = Server.MapPath(upfilepath2);
58
59 try
60 {
61 //保存图片
62 oImage.Save(oFullName);
63 tImage.Save(tFullName);
64 Image1.ImageUrl = upfilepath2;//将缩略图显示到前台Img控件
65 txtimg.Text = pa + newFileName + "_m" + newFileExtensions;//将文件地址赋予控件用于保存
66 }
67 catch (Exception ex)
68 {
69 throw new Exception("发生错误,保存失败!", ex);
70 }
71 finally
72 {
73 //释放资源
74 oImage.Dispose();
75 g.Dispose();
76 tImage.Dispose();
77 }
78 }
79 else
80 {
81 string fileType = string.Empty;
82 foreach (var fileExtension in fe)
83 {
84 if (!string.IsNullOrEmpty(fileType))
85 {
86 fileType += ",";
87 }
88 fileType += fileExtension;
89 }
90 Response.Write("<script>alert('文件格式被禁止,只支持" + fileType + "格式的图片')</script>");
91 }
92 }
93 else
94 {
95 Response.Write("<script>alert('文件大了,请修改大小,勿超过2MB')</script>");
96 }
97 }
98 }
99 enum FileExtension
100 {
101 Jpg = 255216,
102 Gif = 7173,
103 Png = 13780
104 }
105 /// <summary>
106 /// 判断上传的文件的真实格式
107 /// </summary>
108 private class FileValidation
109 {
110 /// <summary>
111 /// 检查是否为允许的图片格式
112 /// </summary>
113 /// <param name="fu">上传控件</param>
114 /// <param name="fileEx">文件扩展名</param>
115 /// <returns></returns>
116 public static bool IsAllowedExtension(FileUpload fu, FileExtension[] fileEx)
117 {
118 int fileLen = fu.PostedFile.ContentLength;
119 byte[] imgArray = new byte[fileLen];
120 fu.PostedFile.InputStream.Read(imgArray, 0, fileLen);
121 MemoryStream ms = new MemoryStream(imgArray);
122 BinaryReader br = new BinaryReader(ms);
123 string fileclass = string.Empty;
124 try
125 {
126 byte buffer = br.ReadByte();
127 fileclass = buffer.ToString();
128 buffer = br.ReadByte();
129 fileclass += buffer.ToString();
130 }
131 catch //(Exception ex)
132 {
133 // ignored
134 }
135 br.Close();
136 ms.Close();
137 int num = 0;
138 int.TryParse(fileclass, out num);
139 foreach (FileExtension fe in fileEx)
140 {
141 if (num == (int)fe)
142 return true;
143 }
144 return false;
145 }
146 }

浙公网安备 33010602011771号