之前寫過一個jsp的檔案上傳,把檔案上傳的動作製成一個class。而現在要提供的這個範例就比較亂一點了,重點會在增加監控的ProgressListener及Ajax取得上傳進度之資料。
程式需要一個bean放入session裡,專門來存放目前上傳的bytes數及其它資訊,選擇好檔案按下上傳時,會開始上傳動作(使用iframe),並啟動Ajax與Server要求目前上傳進度狀況,把資訊顯示在browser上。
在上一篇[ExtJS]WYSIWYG所視即所得網頁編輯器外掛 with CKEditor有提到如何在ExtJS裡使用WYSIWYG所視即所得的網頁編輯器,不過並沒有上傳檔案或圖片的功能,要開啟上傳的功能只需要在CKConfig增加三個參數設定指定要做上傳動作的url就可以啟動了,在這篇並附上Servlet實作傳檔的功能。
filebrowserUploadUrl : 'ckeditor/uploader?Type=File',//檔案上傳的url filebrowserImageUploadUrl : 'ckeditor/uploader?Type=Image',//圖檔上傳的url filebrowserFlashUploadUrl : 'ckeditor/uploader?Type=Flash',//flash上傳的url
加上以上參數後會在以下三個動作加上一個上傳的tab,可上傳檔案至Server端存放
這是一個簡單的fileupload程式,把整個upload動作都包裝在UploadTool這個class裡,而在jsp裡再call此class來做檢查及上傳等動作。jar檔需放置WEB-INF/lib/裡,而程式complier後放置WEB-INF/classes/toolkie/裡。
首先需要二個第三方的jar檔 Apache Filupload及Apache common io 都下載Binary的jar檔就可以了
檔案的配制結構如下圖:
再來利用下面的程式來進行上傳作業
Read More大部份在寫網頁要上傳檔案時都需要使用到iframe做一個中繼,可是如果上傳POST時有錯訊息時,前一個iframe資料就會變成記錄history,而此時如果使用者重新整理時,就會遇到暫存資料的問題,iframe裡的內容會再被執行一次。
以下有一個JavaScript方法,可以在檢查完所有form條件時才自動建立iframe內容createiFrame做post動作,而重新整理時(或第一次進入此畫面時)又不會真實存在,來解決暫存的問題。
當呼叫createIFrame時,會在body這一個tab建立一個iframe元素,並把需求屬性設定好,像是frameborder=0、width=0、height=0等。
function createIFrame() { if (!document.getElementById("_hiddenframe")) { var frame = document.createElement("iframe"); frame.setAttribute("name", "_hiddenframe1"); frame.setAttribute("src", "about:blank"); frame.setAttribute("frameborder", "0"); frame.setAttribute("height", "0"); frame.setAttribute("width", "0"); frame.setAttribute("id", "_hiddenframe"); frame.name = "_hiddenframe"; document.body.appendChild(frame); window.frames._hiddenframe.name = "_hiddenframe"; document.getElementsByTagName("body")[0].appendChild(frame); } }