使用 AsyncFileUpload 控件,仿照 Gmail附件上傳功能

最近要做個檔案上傳的功能,想要達成類似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