前段時間在解決ajax上傳文件時折騰了好一陣。直接用$.post上傳文字訊息肯定是沒有問題的。但$.post直接上傳圖片是不可行的。
後來看到網路上的一些解決方案,有現成的ajax上傳檔案的封裝的方法也有利用flash的。 flash確實是個好方法 但是不是每個人都會flash的而且下載下來現成的方法要做修改也不是件易事,且文件相對較大。最後只好模擬iframe來實現。發現相當的簡單。
html:
<iframe name="ajaxUpload" style="display:none"></iframe> <form name="from1" id="from1" method="post" action="url" enctype="multipart/form-data"target="ajaxUpload"> <table> <tr> <td>附件:</td> <td><input type="file" id="document" name="document"/></td> </tr> </table> </form>
這裡是重點。要上傳檔案enctype這個屬性不可少,target的值改為iframe的name的值。
下面寫一下js程式碼,我是用的jQuery所以在用的時候載入jquery的函式庫是不可或缺的。
$(function(){ if($.browser.msie){ window.form1.submit();}else{ $("#form1").submit();} });
這裡是做了一個瀏覽器版本的判斷,因為IE是不太符合規範的一個瀏覽器,尤其是IE6。 IE6是不直接支援$("#idName").submit();這種方式的。
服務端如下,還得回傳一個值,直接submit是無法回傳值的
public void Upload() { HttpPostedBase ff=Request.Files["document"];//这里是获取上传的文件流,也可以用索引值来表示如果是多个文件的话 string fileName=System.DateTime.Now+ff.FileName.ToString(); //这里取出来的文件名是没有后缀的,所以要保存的话还需要取出文件拓展名。这里就不写过细,只是为描述这样一个思路。 try { SaveAs(documentPath+fileName+extendtionName); Response.Write("<script type='text/javascript' type='language'>parent.window.callBackMethod('上传成功');</scrpt>"); } catch { Response.Write("<script type='text/javascript' type='language'>parent.window.callBackMethod('上传失败');</scrpt>"); //parent.window.methodName();这个是JS调用父页的方法。因为现在模拟一个iframe上传文件,这个iframe的作用就是一个中间站的作用。在父页点击上传后通过target会将页面文档流传入iframe中再上传服务端作处理。服务端有响应之后然后再在iframe里面显示出来,而不是直接在父页面显示出结果。这里可能就是一个alert()弹出一个对话框提示一下,如果是这样那么不调父页方法也行。如果想把这提示的内容丰富一点比如弹出个类似人人网的蓝色的对话框之类的。 } }
模擬iframe其實是頁面局部更新,但是頁面中的這個iframe沒有內容而且還是不顯示的,所以它還是不顯示的,所以它還是不顯示的刷新了完全不會影響整個頁面。