第一部分:上傳
現在比較常用的上傳組件有commons-fileupload, jspSmartUpload, COS;自己寫(xiě)上傳組件的比較少了。我使用的是fileupload,用后推薦也大家使用,開(kāi)源免費可靠,很多框架spring, struts提供支持。
如果上傳文件要保存在服務(wù)器上,這個(gè)比較簡(jiǎn)單,form中加上enctype="multipart/form-data"
<form action="yourservlet" name="fileupload" method="post" enctype="multipart/form-data">
<input name="photofile" type="file" size="35">
</form>
在servlet中使用commons-fileupload的ServletFileUpload取得(parseRequest)上傳文件(一個(gè)或多個(gè)),寫(xiě)到(write)磁盤(pán)。
如果要把文件轉為二進(jìn)制保存到數據庫中,spring有相當好的封裝,可以自動(dòng)把文件轉換成二進(jìn)制流后用Hibernate存入數據庫。

第二部分 打包
當用戶(hù)下載時(shí),可能想一次下載多個(gè)文件,而不是不停的點(diǎn)擊左鍵或者右鍵另存為,這個(gè)時(shí)候將這些文件打包就方便不少。
打包可以使用sun的zip包,也可以用ant的zip包,傳說(shuō)中前者不支持中文,最好還是ant了。目前只做過(guò)一級的,還沒(méi)有做過(guò)多級(指多層文件目錄)打包。下面的代碼中,fileURLList是一個(gè)文件地址列表。
























第三部分 下載
處理下載碰到的問(wèn)題是最多的,我使用的框架是Turbine,這可能導致了更多的問(wèn)題。
第一類(lèi), 文件刪除
即使調用了delete(),文件還是在那里。這是怎么回事?排除權限文件只讀問(wèn)題,那就是還有進(jìn)程在使用文件,所以要想刪除文件,必須保證它沒(méi)有被使用。上面的打包壓縮程序后來(lái)就沒(méi)有釋放掉資源,如果要刪除文件,就會(huì )刪除不了(沒(méi)有異常)。不過(guò)還可以在JVM退出時(shí)刪除。
1




第二類(lèi),發(fā)生異常但不影響使用,過(guò)多的出錯信息可能讓tomcat掛掉。
1. getOutputStream() has already been called for this response異常。(Volecity)
很明顯,這個(gè)異常是因為getOutputStream被調用過(guò)。原來(lái)在Volecity模板中,已經(jīng)調用過(guò).所以就改變了一下模板,設為DirectResponseLayout,同時(shí)把doBuild方法置空。
其實(shí)這個(gè)問(wèn)題在jsp中也存在,比較少,解決辦法也是去掉調用過(guò)的getOutputStream() 。
2. ClientAbortException: java.net.SocketException: Connection reset by peer: socket write error異常
這個(gè)異常通常是因為客戶(hù)端取消了下載,導致一些操作無(wú)法完成。比如說(shuō)outputstream.close().這時(shí)要釋放資源使用outputstream=null就可以了。不要顯式去close。
聯(lián)系客服