WEB文件上傳可能是網(wǎng)站建設中最常用的功能之一,我在項目開發(fā)中幾乎都需要實現(xiàn)文件上傳功能.前段時間自己搜集了一些上傳組件.這篇文章中將介紹這些組件的使用方法,并且比較各自的優(yōu)劣.
一,smartupload組件.
我想只要做個文件上傳的朋友都知道這個組件,我認識的人中使用最多的也是它!我剛到公司的時候,公司也使用的smartupload,這個組件上傳相對較小的文件時是個不錯的選擇.下面給出個使用的例子:
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.sql.*"%>
<%@ page import="com.jspsmart.upload.*" %>
<%
?? //實例化上載bean
??? SmartUpload mySmartUpload=new SmartUpload();
??? //初始化
??? mySmartUpload.initialize(pageContext);
??? //設置上載的最大值,注意:如果這里設置過大會出現(xiàn)問題!
??? mySmartUpload.setMaxFileSize(500 * 1024*1024);
??? //上載文件
??? mySmartUpload.upload();
?? //循環(huán)取得所有上載的文件
?? for (int i=0;i<mySmartUpload.getFiles().getCount();i++){
?? //取得上載的文件
?? com.jspsmart.upload.File myFile = mySmartUpload.getFiles().getFile(i);
?? if (!myFile.isMissing())
??? {
?? //取得上載的文件的文件名
??? String myFileName=myFile.getFileName();
??? //取得不帶后綴的文件名
??? String? suffix=myFileName.substring(0,myFileName.lastIndexOf('.'));
??? //取得后綴名
??? String? ext= mySmartUpload.getFiles().getFile(0).getFileExt();?
??? //取得文件的大小?
??? int fileSize=myFile.getSize();
??? //保存路徑
??? String aa=getServletContext().getRealPath("/")+"jsp\\";
??? String trace=aa+myFileName;
??? //取得別的參數(shù)
??? String explain=(String)mySmartUpload.getRequest().getParameter("text");
??? String send=(String)mySmartUpload.getRequest().getParameter("send");
??? //將文件保存在服務器端
??? myFile.saveAs(trace,mySmartUpload.SAVE_PHYSICAL);
??? %>
但是使用smartupload上傳過大文件,或者多文件的時候可能出現(xiàn)CPU或內(nèi)存占用過高的問題.并且:只有重新啟動容器才能恢復正常!這正是我最后我放棄了使用smartupload的原因.
二,commons-fileupload組件
這個組件是我現(xiàn)在使用的組件,下載地址:http://jakarta.apache.org/site/downloads/downloads_commons-fileupload.cgi,包內(nèi)包含了API文檔.
使用該組件的例子:
<%@ page language=“java”contentType=“text/html;charset=GBK”%>
<%@ page import=“java.util.*”%>
<%@ page import=“org.apache.commons.fileupload.*”%>
<html>
<head>
<title>文件上傳</title>
</head>
<%
?DiskFileUpload fu = new DiskFileUpload();
?// 設置允許用戶上傳文件大小,單位:字節(jié)
?fu.setSizeMax(10000000);
?// 設置最多只允許在內(nèi)存中存儲的數(shù)據(jù),單位:字節(jié)
?fu.setSizeThreshold(4096);
?// 設置一旦文件大小超過getSizeThreshold()的值時數(shù)據(jù)存放在硬盤的目錄
?fu.setRepositoryPath(“D:\\Tomcat5\\TEMP”);
?//開始讀取上傳信息
?List fileItems = fu.parseRequest(request);
?// 依次處理每個上傳的文件
?Iterator iter = fileItems.iterator();
?while (iter.hasNext()) {
? FileItem item = (FileItem) iter.next();
? //忽略其他不是文件域的所有表單信息
? if (!item.isFormField()) {
?? String name = item.getName();
?? item.write(“D:\\UploadTest\\”+ name);
?}
}
%>
從上面的程序可以看出,該組件上傳時候可以用了一個地方來存儲臨時文件,呆上傳完成后直接把文件寫過去.這樣就不會占用過多的內(nèi)存!而且該組件上傳大文件的時候效率也不低哦!
在這兩個的對比選擇中,我選擇了后者,因為我做的項目中經(jīng)常上傳大于10M的文件,用前者的時候服務器幾乎被整崩潰.
不過,現(xiàn)在我已經(jīng)不用這兩種組件了,因為http方式傳文件效率始終很低,我們現(xiàn)在使用的是web方式實現(xiàn)的ftp文件上傳,我將在下篇文章中寫我在項目中是如何實現(xiàn)的.