1. 程式人生 > >檔案上傳元件的比較

檔案上傳元件的比較

  在上傳量較小(容量<2M,這是最常出現的情況)時,Cos比FileUpload效能並沒有好很多,但SmartUpload就已經開始顯出弱勢。
   隨著容量的增大,FileUpload和SmartUpload的效能下降非常快,直到200M容量時,SmartUpload已經不堪重負崩潰了,而Cos此時的花費時間比FileUpload少了20多秒,不能不說在本次的評測中,Cos的效能位居第一。

   通過對三種流行的上傳元件進行對比,我認為選用Cos是比較好的。在實際的專案中,可以把上傳的檔案放到資料夾,檔案路徑存於資料庫中以便於管理。
   如果需要把檔案上傳到資料庫也很簡單,從Cos中已經得到了上傳檔案(java.io.File),其後的操作很平常所做的一樣:  通過File得到inputStream,存到資料庫的blob或Clob欄位即可。

   對於使用Struts的專案,我覺得還是使用FileUpload比較好,因為Struts天生集成了FileUpload的功能,使用FileUpload會帶來很多的便利。而如果想要開發獨立的上傳元件,則用Cos是最好的選擇,可以在Cos的基礎上封裝一層,暴露給業務程式設計師的只是一些簡單易用的API,而且可以給這些API加上自定義的javaDoc,這對於實際的開發和將來的擴充套件都是非常方便的。

以下使用cos元件簡單的實現檔案上傳功能:
1. 將下載的cos.jar檔案所在目錄加入到環境變數classpath中
2. 編寫一個html檔案uploadExample.htm:
1. <!DOCTYPE HTML PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN
2. http://www.w3.org/TR/html4/loose.dtd>
3. <html>
4. <head>
5. <meta http-equiv=Content-Type content=text/html; charset=gb2312>
6. <title>實現檔案上傳的一個例子程式</title>
7. </head>
8. <body>
9. <div align="center">
10. <!-- enctype引數很重要,當向伺服器傳送如片或檔案這樣包含非ASCII字元或二進位制數的資料時,跟據RFC1867規定必須使用"mutiplepart/form-data"內容型別-->
11. </div>
12. <form name=form1  method=post enctype=multipart/form-data action=upload.jsp>
13. <div align="center">
14. <table width="255" border="1" >
15. <tr>
16. <td><input name=file12 type=file></td>
17. </tr>
18. <tr>
19. <td><input name=file2 type=file></td>
20. </tr>
21. <tr>
22. <td><input name=file3 type=file></td>
23. </tr>
24. <tr>
25. <td align="center"><input type=submit name=Submit value=提交></td>
26. </tr>
27. </table>
28. </div>
29. </form >
30. </body>
31. </html>
3. 實現上傳檔案功能可以寫一個Servlet, 這裡簡單起見,寫成一個upload.jsp檔案:
1. <%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>
2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3. <html xmlns="http://www.w3.org/1999/xhtml">
4. <head>
5. <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
6. <title>實現檔案上傳功能 </title>
7. </head><%@page import="com.oreilly.servlet.MultipartRequest" %>
8. <%@page contentType="text/html; charset=gb2312" %>
9. <%
10. //檔案上傳後,儲存在"f:/uploadfiles"
11. String saveDirectory = "f:/uploadfiles";
12. //每個檔案最大5m,最多3個檔案,所以...
13. int maxPostSize = 3 * 5 * 1024 * 1024 ;
14. //response的編碼為gb2312,同時採用預設的檔名衝突解決策略,實現上傳
15. MultipartRequest multi = new MultipartRequest(request, saveDirectory, maxPostSize, "gb2312");
16. %>
4. 將以上兩個檔案放到tomcat安裝目錄\webapps目錄下的一個資料夾如uploadExample下即可
附:(http://blog.csdn.net/hdhero/archive/2005/03/22/326405.aspx)
一.SmartUpload元件例子程式碼:
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.sql.*"%>
<%@ page import="com.jspsmart.upload.*" %>
<%
   //例項化上載bean
    SmartUpload mySmartUpload=new SmartUpload();
    //初始化
    mySmartUpload.initialize(pageContext);
    //設定上載的最大值,注意:如果這裡設定過大會出現問題!
    mySmartUpload.setMaxFileSize(500 * 1024*1024);
    //上載檔案
    mySmartUpload.upload();
   //迴圈取得所有上載的檔案
   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;
    //取得別的引數
    String explain=(String)mySmartUpload.getRequest().getParameter("text");
    String send=(String)mySmartUpload.getRequest().getParameter("send");
    //將檔案儲存在伺服器端
    myFile.saveAs(trace,mySmartUpload.SAVE_PHYSICAL);
    %>
注意使用smartupload上傳過大檔案,或者多檔案的時候可能出現CPU或記憶體佔用過高的問題.只有重新啟動容器才能恢復正常!
二.commons-fileupload元件
<%@ 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();
 // 設定允許使用者上傳檔案大小,單位:位元組
 fu.setSizeMax(10000000);
 // 設定最多隻允許在記憶體中儲存的資料,單位:位元組
 fu.setSizeThreshold(4096);
 // 設定一旦檔案大小超過getSizeThreshold()的值時資料存放在硬碟的目錄
 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);
 }
}
%>