您的位置:首页 > Web前端 > JQuery

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

2016-03-17 15:42 543 查看
起因:公司最近有些项目用到了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', data: formData, async: false, cache: false, contentType: false, processData: false,// dataType: "jsonp",//问题就在这里,如果用了jsonp,那么后台就接收不到文件流,无法获得文件流,就没办法把文件写入服务器。如果不指定,就是注释掉,虽然ajax提交之后,还是跑到error那里去,但是文件已经是成功写入服务器的了。 jsonp: "jsoncallback", success: function(returndata) { var vData = JSON.stringify(returndata); alert(vData); }, error: function(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控件来实现,这样访问速度肯定慢了,我把上述心得发出来,希望大家共同进步,如果已经解决这个问题的,请赐教,谢谢。
贴出上述方法的原文链接:/article/3761470.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: