Ajax JQuery HTML 提交上傳文件File HTML+ Ajax+ASP.NET+ WebService


        起因:公司最近有些項目用到了HTML+WebService的組合,發現訪問速度等都快了許多,但是由於通過Ajax只能應付一些簡單的文字類的傳輸,上傳文件就捉襟見肘了,如果一直引用第三方的swf之類上傳也不是一個辦法,所以,一直在尋找解決文件上傳的方法。找了許多方法,后來知道需要指定格式才能上傳文件,就是要指定Form表單為: enctype = "multipart/form-data"  才可以上傳文件,然后這里面最后實現了上傳,但是新的問題又來了,這中方法,文件上傳之后,會跳轉到另外一個頁面,這樣交互性非常不友好,所以,又想改進為無刷新的,最后找到了一個下面的方法,但是 目前還是有Bug,所以,如果知道怎么解決的,麻煩告訴我一下。
         首先:引用JQuery,這個是必不可少的;
         JavaScript:
     <script type="text/javascript">
            function doUpload() {
                var formData = new FormData($("#uploadForm")[0]);
                $.ajax({
                    url'http://localhost:34181/HomeService.asmx/UploadFile?jsoncallback=?',
                    type'POST',
                    dataformData,
                    asyncfalse,
                    cachefalse,
                    contentTypefalse,
                    processDatafalse,
//                    dataType: "jsonp",//問題就在這里,如果用了jsonp,那么后台就接收不到文件流,無法獲得文件流,就沒辦法把文件寫入服務器。如果不指定,就是注釋掉,雖然ajax提交之后,還是跑到error那里去,但是文件已經是成功寫入服務器的了。
                    jsonp"jsoncallback",
                    successfunction(returndata) {
                        var vData JSON.stringify(returndata);
                        alert(vData);
                    },
                    errorfunction(returndata) {
                        var vData JSON.stringify(returndata);
                        alert(vData);
                    }
                });
            }
        </script>  

          HTML:

          < form id="uploadForm" >
            <p>指定文件名:
                <input type="text" name="filename" value="" />
            </p>
            <p>上傳文件:
                <input type="file" name="file" />
                </ p>
                <input type="button" value="上傳" onclick="doUpload()/>
     </form>


    后台(WebService):
     ///   <summary>
        /// 上傳文件
        /// </summary>
        /// <returns></returns>
        [WebMethod(EnableSession = true)]
        public void UploadFile()
        {
            HttpContext.Current.Response.ContentType = "application/json;charset=utf-8";
            string jsonCallBackFunName = HttpContext.Current.Request.Params["jsoncallback"].ToString(); //這里如果前台沒有用jsonp,那么獲取到的是一個?,所以處理完之后,前台是沒法獲取到服務器返回的內容的。
            //上面代碼必須,不能注釋
            //中間代碼執行自己的業務操作,可返回自己的任意信息(多數據類型)
            string strJson = "";
            HttpFileCollection files = HttpContext.Current.Request.Files;
            string strFileName = HttpContext.Current.Request["filename"];
            byte[] b = new byte[files[0].ContentLength];
            System.IO.Stream fs = (System.IO.Stream)files[0].InputStream;
            fs.Read(b, 0, files[0].ContentLength);
            ///定義並實例化一個內存流,以存放提交上來的字節數組。
            MemoryStream m = new MemoryStream(b);
            ///定義實際文件對象,保存上載的文件。
            FileStream f = new FileStream(Server.MapPath("\\UploadFile") + "\\"
             + files[0].FileName, FileMode.Create);
            ///把內內存里的數據寫入物理文件
            m.WriteTo(f);
            m.Close();
            f.Close();
            f = null;
            m = null;
            if (strJson == "")
            {
                strJson = "0";
            }
            //下面代碼必須,不能注釋
            HttpContext.Current.Response.Write(string.Format("{0}({1})", jsonCallBackFunName, strJson));
            HttpContext.Current.Response.End();
        }

     前面的Formdata提交,是我在別處看到的一個人分享的,也特別感謝他,雖然我目前還有bug,但至少已經實現了我上傳文件的目的,否則,還得把項目通過fileupload控件來實現,這樣訪問速度肯定慢了,我把上述心得發出來,希望大家共同進步,如果已經解決這個問題的,請賜教,謝謝。

    貼出上述方法的原文鏈接:http://yunzhu.iteye.com/blog/2177923





免責聲明!

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



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