1. 程式人生 > >.net利用ajax技術實現圖片上傳並回顯到介面

.net利用ajax技術實現圖片上傳並回顯到介面

最近在開發過程中遇到了一個非常鬱悶的問題,就是圖片傳到fileUpload中時想要實現回顯到image控制元件中。

在前臺,fileUpload.change()事件中判斷fileUpload.val()不為空,把改路徑值賦給image.attr("src",$('#fileUpload的ID').val()),

IE和火狐都無法實現,反而2345王牌瀏覽器可以實現讀取本地路徑的功能,

再用ajax非同步呼叫函式,獲取本地路徑後再返回本地路徑,同樣無法實現,估計是跟瀏覽器的許可權有關。

那麼重點開始了,現在採用其他思路試試吧。

先來給fileUpload的change事件繫結一個upload的javascript函式,

//上傳照片
        function upload() {
            var u = "";
            var options = {
                url: "../services/upload.ashx",//處理程式路徑
                type: "post",
                success: function (msg) {//回撥函式--請求成功
                    if (msg.toString().substring(0, 3) == "ERR") {//
                        alert(msg.substring(3, msg.length));
                    }
                    else {
                        $("#img_tx").attr("src", msg);//回顯圖片
                    }
                },
                error:function(err){
                    alert("123");
            }
            };
            //將options傳給ajaxForm
            $('#form1').ajaxSubmit(options);
        }

在這個函式中,我們呼叫了upload.ashx處理程式,該程式實現程式碼如下:

因為這裡採用Session傳遞檔名,所以一定要引用IRequiresSessionState介面

同時新增下面三個引用

using System.Drawing;

using System.Web.SessionState;

using System.Web.Services;

public class upload : IHttpHandler,IRequiresSessionState
    {

       
        /// <summary>
        /// 上傳照片
        /// </summary>
        /// <param name="context"></param>
        public void ProcessRequest(HttpContext context)
        {
            HttpFileCollection files = context.Request.Files;
            string path = "";//照片路徑
            bool errorflag = true;
            string tishi = "";
            if (files.Count > 0)//Form中獲取檔案物件
            {
                HttpPostedFile file = files[0];
                if (file.ContentLength > 0)//檔案大小大於零
                {
                    string fileName = file.FileName;//檔名
                    int fileSize = file.ContentLength;//檔案大小
                    if (fileName.Substring(fileName.Length - 4, 4).ToLower() == ".jpg")//只支援.jpg檔案上傳
                    {
                        try
                        {
                            Bitmap bitmap = new Bitmap(file.InputStream);//獲取圖片檔案
                            if (bitmap.Width > 480 || bitmap.Height > 640)
                            {
                                errorflag = false;
                                tishi = "照片太大,請將照片調整為320*240畫素尺寸!";
                            }
                            if (bitmap.Width < 120 || bitmap.Height < 160)
                            {
                                errorflag = false;
                                tishi = "照片太小,請將照片調整為320*240畫素尺寸!";
                            }
                            if (bitmap.Width > bitmap.Height)
                            {
                                errorflag = false;
                                tishi = "照片的寬度比不符合要求,請將高度比調整為4:3!";
                            }
                            if (fileSize > 100 * 1024)
                            {
                                errorflag = false;
                                tishi = "照片的大小不符合要求,請將照片調整為100kb以內!";
                            }
                        }
                        catch
                        {
                            errorflag = false;
                            tishi = "照片錯誤,上傳檔案非影象檔案!";
                        }
                    }
                    else
                    {
                        errorflag = false;
                        tishi = "照片格式錯誤,請上傳JPG格式照片檔案!";
                    }
                }
            }
            else
            {
                errorflag = false;
                tishi = "照片錯誤,上傳照片檔案為0位元組!";
            }
            if (errorflag)
            {
                string extension = ".jpg";
                context.Session["zpname"] = Guid.NewGuid().ToString();//建立唯一檔名
                path = "../zhaopian/" + context.Session["zpname"].ToString() + extension;//指定儲存路徑以及檔名,也就是完整相對路徑
                files[0].SaveAs(System.Web.HttpContext.Current.Server.MapPath(path));//儲存檔案(將相對路徑轉化為絕對路徑)
                context.Response.Write(path);//相應給客戶端該照片的相對路徑

            }
            else
            {
                context.Response.Write("ERR" + tishi);
            }

        }
<span style="font-size:24px;background-color: rgb(255, 102, 102);"><strong>到這裡,我們已經能夠實現當用戶選擇路徑之後回顯到介面的功能了。</strong></span>
下面附加一個功能模組,將照片以及使用者修改的資訊新增到資料庫中。
首先,看一下前臺是如何使用ajax呼叫後臺函式的:
<pre class="html" name="code">//Document.ready()
        $(function () {
             //儲存使用者修改資訊
            $('#b_xgxx').click(function () {
                var upzp = false;//預設不上傳照片
                if ($('#fu_tx').val() != "") {//如果fileUpload有路徑,就指定上傳照片
                    upzp = true;
                }
                $.ajax({
                    url: "../services/WebService.asmx/modify_ZJXX",
                    type: "post",
                    contentType: "application/json;charset=utf-8",
                    dataType: 'json',
                    async: false,
                    data: "{xm:'"+$('#t_xm').val()+"',sclydm:'"+$('#t_sclydm').val()+"',zhwt:'"+$('#t_zhwt').val()+"',zjjs:'"+$('#t_zjjs').val()+"',upzp:"+upzp+"}",
                    success: function (response) {
                        if (response.d != "") {
                            alert(response.d);
                        }
                    },
                    error:function(err){
                        alert(err);
                }
                })

            });
在提交按鈕按下事件中,首先判斷fu_tx是否有值,如果有就上傳照片,如果沒有,就不用上傳照片,只上傳其他資訊
然後,看一下後臺modefy_ZJXX函式的寫法:
<p>[WebMethod(EnableSession = true)]
        public string modify_ZJXX(string xm, string sclydm, string zhwt, string zjjs,bool upzp)
        {
            Model.T_ZHUANJIA model = (Model.T_ZHUANJIA)Session["ZJXX"];
            string tishi = "";
            if (upzp == true)
            {
                //獲取圖片資訊
                if (Session["zpname"].ToString().Trim() == "")
                {
                    tishi = "請選擇需要上傳的照片";
                }
                else
                {
                    //獲取絕對路徑
                    string path = Server.MapPath("~/web/zhaopian/" + Session["zpname"].ToString() + ".jpg");
                    //讀取照片檔案
                    FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);
                    Byte[] bytes=new byte[fs.Length];
                    fs.Read(bytes, 0, (int)fs.Length);
                    fs.Dispose();//釋放資源
                    fs.Close();//關閉檔案流
                    model.ZJTX = bytes;//給專家頭像變數賦值
                    File.Delete(path);//刪除伺服器中的圖片檔案</p><p>                }
            }
            //獲取修改的其他資訊,並寫入資料庫
            model.XM = xm;
            model.SCLYDM = sclydm;
            model.ZHWT = zhwt;
            model.ZJJS = zjjs;
            BLL.B_ZHUANJIA.UpdateZhuanJia(model, out tishi);//插入資料庫中
            return tishi;
            
        }</p><p>其中有部分變數未說明,這裡只做主要思路的介紹,一些無關的變數可以不用考慮。</p>