最近要做個檔案上傳的功能,想要達成類似Gmail附件上傳的功能,也就是不要重整畫面就可以新增與刪除檔案,
因為有使用 Ajax toolkit,所以第一想到的就是 AsyncFileUpload啦!
最近要做個檔案上傳的功能,想要達成類似Gmail附件上傳的功能,也就是不要重整畫面就可以新增與刪除檔案,
因為有使用 Ajax toolkit,所以第一想到的就是 AsyncFileUpload啦!
不過剛使用,就遇到問題了,那就是檔案上傳後,卻無法更新頁面上的Label、Textbox…,也就是說沒法顯示我上傳了甚麼檔案…
那不就跟廢物一樣了嗎?orz…不死心的我無法相信開發者會推出一個無用的AsyncFileUpload控件,所以就開始Google文章囉,
果然討論很多,可是多數都無法解決…
後來終於了解,由於 AsyncFileUpload 是利用 iframe的機制來達成上傳的功能,所以在iframe內產生的所有動作都無法影響主頁,
這也就是為什麼主頁上的 Label死不動作的原因…
( 注意:因為iframe的關係,所以AsyncFileUpload控件與主頁間的傳值,用session是比較方便的,用viewstate是抓不到的唷!)
幸好 AsyncFileUpload有提供三個屬性,可以達到控制主頁的目的
OnClientUploadComplete - The name of a javascript function executed in the client-side after the file successfully uploaded
OnClientUploadError - The name of a javascript function executed in the client-side if the file uploading failed
OnClientUploadStarted - The name of a javascript function executed in the client-side on the file uploading started
拉出一個控制項AsyncFileUpload
<asp:AsyncFileUpload ID="AFU1" runat="server" OnClientUploadStarted="UploadStar" OnClientUploadComplete="UploadEnd"
onclientuploaderror="UploadErr" ToolTip="1233" Width="500px" />
拉出UpdatePanel控件,名叫UpdatePanel_AFU
<asp:UpdatePanel ID="UpdatePanel_AFU" runat="server">
<ContentTemplate>
<asp:Label ID="Lab_error" runat="server"
style="color: #FF0000; font-size: small;" Visible="False"></asp:Label>
<asp:CheckBoxList ID="CBL1" runat="server" AutoPostBack="True" CellPadding="0"
CellSpacing="0" style="font-size: small">
</asp:CheckBoxList>
</ContentTemplate>
</asp:UpdatePanel>
接著我們在AsyncFileUpload 的 OnClientUploadComplete 事件中,加入下列的語法,來驅使主頁的UpdatePanel做 Postback動作
<script type="text/javascript">
function UploadEnd() {
__doPostBack("<%=UpdatePanel_AFU.ClientID %>","");
</script>
這樣就可以在上傳成功的時候,讓UpdatePanel內的Lable更新文字囉!
另外,因為上傳的控件都要傳到Server後才能判斷檔案大小,不然就是要用javascript的 fso物件判斷,(但是會跳詢問視窗)
所以我也利用了OnClientUploadStarted屬性,至少在Client端先判斷一下上傳的檔案格式是不是允許的,至少減少些 Server的負擔…
這邊只是稍微介紹一下作法,詳細的程式內容就參考附件囉!
範例檔案:AsyncFileUpload.rar
end