[ASP.NET]使用uploadify上傳圖片,並在uploadify按鈕上生成預覽圖


目錄

需求

主要代碼

總結

需求

項目中有用到uploadify上傳插件,給的原型就是上傳成功后替換原來的圖片。沒辦法需求在那兒,也不能修改需求吧,只能想辦法解決問題了。

主要代碼

修改uploadify樣式:

 1 /*
 2 Uploadify
 3 Copyright (c) 2012 Reactive Apps, Ronnie Garcia
 4 Released under the MIT License <http://www.opensource.org/licenses/mit-license.php> 
 5 */
 6 
 7 .uploadify {
 8     position: relative;
 9     margin-bottom: 1em;
10     color:blue;
11 }
12 
13 /*.uploadify-button {
14     background-color: #505050;
15     background-image: linear-gradient(bottom, #505050 0%, #707070 100%);
16     background-image: -o-linear-gradient(bottom, #505050 0%, #707070 100%);
17     background-image: -moz-linear-gradient(bottom, #505050 0%, #707070 100%);
18     background-image: -webkit-linear-gradient(bottom, #505050 0%, #707070 100%);
19     background-image: -ms-linear-gradient(bottom, #505050 0%, #707070 100%);
20     background-image: -webkit-gradient(
21         linear,
22         left bottom,
23         left top,
24         color-stop(0, #505050),
25         color-stop(1, #707070)
26     );
27     background-position: center top;
28     background-repeat: no-repeat;
29     -webkit-border-radius: 30px;
30     -moz-border-radius: 30px;
31     border-radius: 30px;
32     border: 2px solid #808080;
33     color: #FFF;
34     font: bold 12px Arial, Helvetica, sans-serif;
35     text-align: center;
36     text-shadow: 0 -1px 0 rgba(0,0,0,0.25);
37     width: 100%;
38 }
39 .uploadify:hover .uploadify-button {
40     background-color: #606060;
41     background-image: linear-gradient(top, #606060 0%, #808080 100%);
42     background-image: -o-linear-gradient(top, #606060 0%, #808080 100%);
43     background-image: -moz-linear-gradient(top, #606060 0%, #808080 100%);
44     background-image: -webkit-linear-gradient(top, #606060 0%, #808080 100%);
45     background-image: -ms-linear-gradient(top, #606060 0%, #808080 100%);
46     background-image: -webkit-gradient(
47         linear,
48         left bottom,
49         left top,
50         color-stop(0, #606060),
51         color-stop(1, #808080)
52     );
53     background-position: center bottom;
54 }*/
55 .uploadify-button.disabled {
56     background-color: #D0D0D0;
57     color: #808080;
58 }
59 .uploadify-queue {
60     margin-bottom: 1em;
61 }
62 .uploadify-queue-item {
63     background-color: #F5F5F5;
64     -webkit-border-radius: 3px;
65     -moz-border-radius: 3px;
66     border-radius: 3px;
67     font: 11px Verdana, Geneva, sans-serif;
68     margin-top: 5px;
69     max-width: 350px;
70     padding: 10px;
71 }
72 .uploadify-error {
73     background-color: #FDE5DD !important;
74 }
75 .uploadify-queue-item .cancel a {
76     background: url('../img/uploadify-cancel.png') 0 0 no-repeat;
77     float: right;
78     height:    16px;
79     text-indent: -9999px;
80     width: 16px;
81 }
82 .uploadify-queue-item.completed {
83     background-color: #E5E5E5;
84 }
85 .uploadify-progress {
86     background-color: #E5E5E5;
87     margin-top: 10px;
88     width: 100%;
89 }
90 .uploadify-progress-bar {
91     background-color: #0099FF;
92     height: 3px;
93     width: 1px;
94 }

將uploadify默認樣式注釋。
上傳按鈕代碼:

1  <input type="hidden" id="hdId" name="name" value="1" />
2             <img src="../images/logo/logo.png" alt="圖標" id="imgUpload" />

uploadify是基於flash的上傳插件,在客戶端生成的是object對象。

通過上圖可知,設置的img上傳按鈕在客戶端由div代替,id變為imgUpload-button。知道id了就好辦了。

js代碼:

 1     <link href="JS/uploadify/css/uploadify.css" rel="stylesheet" />
 2     <script type="text/javascript" src="JS/jquery-1.8.0.min.js"></script>
 3     <script type="text/javascript" src="JS/uploadify/js/uploadify3.2.1/jquery.uploadify.js"></script>
 4     <script type="text/javascript">
 5         $(function () {
 6             //初始化上傳插件
 7             InitUploadify("imgUpload");
 8         });
 9         function InitUploadify(id) {
10 
11             //上傳插件初始化方法
12             $('#' + id).uploadify({
13                 //選擇文件后是否自動上傳,默認為true
14                 'auto': true,
15                 //單個文件大小,0為無限制,可接受KB,MB,GB等單位的字符串值 上傳大文件 可參考使用手冊說明               
16                 'fileSizeLimit': '2MB',
17                 'width': 40,
18                 'height': 40,
19                 //文件描述
20                 'fileTypeDesc': 'Files',
21                 //允許上傳的文件類型 以分號分割
22                 'fileTypeExts': '*.gif; *.jpg; *.png;',
23                 //請求方式"get"或者"post",默認為"post"   
24                 'method': 'post',
25                 //是否允許同時選擇多個文件,默認為true
26                 'multi': false,
27                 'buttonImage': '../images/logo/logo.png',
28                 //隊列的ID,一個存放上傳文件div的ID
29                 'queueID': 'fileQueue',
30                 //FLash文件路徑
31                 'swf': '/JS/uploadify/js/uploadify3.2.1/uploadify.swf',
32                 'onUploadStart': function (file) {
33                     //傳遞參數
34                     $("#" + id).uploadify("settings", "formData", { 'strId': $("#hdId").val() });
35                 },
36                 //上傳文件處理后台頁面
37                 'uploader': 'UploadImgHandler.ashx',
38                 //重寫錯誤事件,否則在關閉自定義錯誤提示框后,扔彈出默認的英文信息
39                 'overrideEvents': ['onSelectError', 'onDialogClose'],
40                 //返回一個錯誤,選擇文件的時候觸發 
41                 'onSelectError': function (file, errorCode, errorMsg) {
42                     switch (errorCode) {
43                         case -100:
44                             alert("上傳的文件數量已經超出系統限制的" + $("#" + id).uploadify('settings', 'queueSizeLimit') + "個文件!");
45                             break;
46                         case -110:
47                             alert("文件 [" + file.name + "] 大小超出系統限制的" + $("#" + id).uploadify('settings', 'fileSizeLimit') + "大小!");
48                             break;
49                         case -120:
50                             alert("文件 [" + file.name + "] 大小異常!");
51                             break;
52                         case -130:
53                             alert("文件 [" + file.name + "] 類型不正確!");
54                             break;
55                     }
56                 },
57                 //檢測FLASH失敗調用 
58                 'onFallback': function () {
59                     alert("您未安裝FLASH控件,無法上傳圖片!請安裝FLASH控件后再試。");
60                 },
61                 //上傳成功后觸發,每個文件都觸發
62                 'onUploadSuccess': function (file, data, response) {
63                     var result = eval('(' + data + ')');
64                     if (result.imgSrc != "0") {
65                         //置換按鈕的背景圖,uploadify在客戶端生成的id為imgUpload-button
66                         $("#imgUpload-button").css("background-image", "url('" + result.imgSrc + "')").attr({ "src": result.imgSrc });
67                     } else {
68                         alert("上傳失敗");
69                     }
70                 }
71 
72             });
73         }
74     </script>

需要注意,上面采用了自定義錯誤提示,需要

1  //重寫錯誤事件,否則在關閉自定義錯誤提示框后,扔彈出默認的英文信息
2                 'overrideEvents': ['onSelectError', 'onDialogClose'],

不然在彈出自定義的錯誤信息后,關閉錯誤信息仍會出現英文錯誤信息。
將該句注釋后,測試結果:

單擊確定后

所以在自定義錯誤提示信息時需要重寫事件。

 ['onSelectError', 'onDialogClose']

接收上傳圖片的一般處理程序代碼:

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Drawing;
  4 using System.IO;
  5 using System.Linq;
  6 using System.Web;
  7 
  8 namespace Wolfy.UploadifyImageDemo
  9 {
 10     /// <summary>
 11     /// UploadImgHandler 的摘要說明
 12     /// </summary>
 13     public class UploadImgHandler : IHttpHandler
 14     {
 15 
 16         public void ProcessRequest(HttpContext context)
 17         {
 18             context.Response.ContentType = "text/plain";
 19             //獲取上傳的文件
 20             HttpPostedFile httpPostedFile = context.Request.Files["Filedata"];
 21 
 22             //如果接收到文件則httpPostedFile不為null,則對上傳的文件進行處理,否則向客戶端返回0
 23             if (httpPostedFile != null)
 24             {
 25                 //獲取文件名
 26                 string strfileName = httpPostedFile.FileName;
 27 
 28                 //獲取擴展名
 29                 string strExt = Path.GetExtension(strfileName);
 30 
 31                 //允許上傳的文件類型
 32                 string[] strExts = { ".jpg", ".png", ".gif" };
 33 
 34                 //如果上傳的文件類型,在被允許的類型中,則保存,否則向客戶端輸出“不允許上傳”的信息提示。
 35                 if (strExts.Contains(strExt))
 36                 {
 37                     string strSaveName = string.Empty;
 38                     string strSavePath = ConvertImageByWH(context, httpPostedFile.InputStream, 50, 50, strExt, out strSaveName);
 39 
 40                     string strJson = " { 'imgSrc': '" + strSavePath + "'} ";
 41                     //將文件的保存的相對路徑輸出到客戶端
 42                     context.Response.Write(strJson);
 43 
 44                 }
 45                 else
 46                 {
 47                     context.Response.Write("{'imgSrc':'0'}");
 48                 }
 49             }
 50         }
 51         /// <summary>
 52         /// 按照給定的寬高對圖片進行壓縮
 53         /// </summary>
 54         /// <param name="byteImg">圖片字節流</param>
 55         /// <param name="intImgCompressWidth">壓縮后的圖片寬度</param>
 56         /// <param name="intImgCompressHeight">壓縮后的圖片高度</param>
 57         /// <param name="strExt">擴展名</param>
 58         /// <param name="strSaveName">保存后的名字</param>
 59         /// <returns>壓縮后的圖片相對路徑</returns>
 60         private string ConvertImageByWH(HttpContext context, Stream stream, int intImgCompressWidth, int intImgCompressHeight, string strExt, out string strSaveName)
 61         {
 62             //從輸入流中獲取上傳的image對象
 63             using (System.Drawing.Image img = System.Drawing.Image.FromStream(stream))
 64             {
 65                 //根據壓縮比例求出圖片的寬度
 66                 int intWidth = intImgCompressWidth / intImgCompressHeight * img.Height;
 67                 int intHeight = img.Width * intImgCompressHeight / intImgCompressWidth;
 68                 //畫布
 69                 using (System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(img, new Size(intImgCompressWidth, intImgCompressHeight)))
 70                 {
 71                     //在畫布上創建畫筆對象
 72                     using (System.Drawing.Graphics graphics = System.Drawing.Graphics.FromImage(bitmap))
 73                     {
 74                         //將圖片使用壓縮后的寬高,從0,0位置畫在畫布上
 75                         graphics.DrawImage(img, 0, 0, intImgCompressWidth, intImgCompressHeight);
 76                         //創建保存路徑
 77                         string strSavePath = "/images/logo/";
 78 
 79                         //如果保存目錄不存在,則創建
 80                         if (!Directory.Exists(context.Server.MapPath(strSavePath)))
 81                         {
 82                             Directory.CreateDirectory(context.Server.MapPath(strSavePath));
 83                         }
 84                         //定義新的文件名
 85                         string strfileNameNoExt = string.Empty;
 86                         //接收參數
 87                         string strId = context.Request.Params["strId"];
 88                         if (!string.IsNullOrEmpty(strId))
 89                         {
 90                             if (strId == "1")
 91                             {
 92                                 //定義新的文件名
 93                                 strfileNameNoExt = Guid.NewGuid().ToString();
 94                             }
 95                         }
 96 
 97                         strSaveName = strfileNameNoExt + strExt;
 98                         //添加時如果圖片已經存在則刪除
 99                         if (File.Exists(context.Server.MapPath(strSavePath) + strSaveName))
100                         {
101                             File.Delete(context.Server.MapPath(strSavePath) + strSaveName);
102                         }
103                         //保存文件
104                         bitmap.Save(context.Server.MapPath(strSavePath) + strSaveName);
105                         return strSavePath + strSaveName;
106                     }
107                 }
108             }
109         }
110         public bool IsReusable
111         {
112             get
113             {
114                 return false;
115             }
116         }
117     }
118 }
View Code

測試結果:
默認:

上傳成功后:

總結

在項目中多少會用到一些插件,但是又不能完全適應需求,這時就需要對其進行定制的修改,這時候F12還是很管用的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM