熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

用javaZoom的uploadBean擴展request的功能

2013-11-23 19:19:19  來源: Java核心技術 

  在Servlet中upload上傳是我們常用的操作之一然而在javaxservlet包中javaxservlethttpHttpServletRequest對於form中的enctype
  =multipart/formdata的內容的處理支持卻極有限我們不得不手工編寫讀取和分離Stream中的內容的代碼這使我們對封裝完好的MultipartFormDataRequest提供支持的包充滿了期待其實常用的javaZoom的uploadBean中就已經提供了這個良好的工具另外uploadBean還包括了上傳後的存儲機制如保存到數據庫文件zip文件等如果你不需要做定制的話盡管可以使用他們當然定制上傳後的處理很簡單也很實用
  javaZoom的包中共包含了個class文件:
  UploadBeanclass
  
  UploadParametersclass
  
  UploadListenerclass
  
  UploadFileclass
  
  UploadExceptionclass
  
  Archiverclass
  
  MultipartFormDataRequestclass
  
  其中我們最感興趣的是MultipartFormDataRequestclass正如其名它使我們可以象處理一般的form那樣處理enctype=multipart/formdata的form的內容
  
  在MutipartFormDataRequest中共有種public方法
  
  getParameterNames(name:String):Enumeration
  
  getParameterValue(name:String):String
  
  getParameterValues(name:String):String[]
  
  getFiles():Hashtable
  
  isMultipartFormData(req:HttpServletRequest):boolean
  
  和種public構造函數
  
  MultipartFormDataRequest(req:HttpServletRequestmaxcontentlength:int)
  
  MultipartFormDataRequest(req:HttpServletRequest)
  
  所有的對Mutipart的內容的分析在構造函數中由 comoreillyservletmultipart包中的分析器完成我們無需關心原先最頭疼的對Stream內容的分析的工作只需要象下面的代碼那樣
  
  if (MultipartFormDataRequestisMultipartFormData(request)){//如果是multipart類型的request
  
  MultipartFormDataRequest mrequest = new MultipartFormDataRequest(request);
  
  }
  
  就得到了MutipartFormDataRequest的實例
  
  如果想得到上傳的內容
  
  Hashtable files = mrequestgetFiles();//得到所有的上傳的文件
  
  if(files!=null && !filesisEmpty()){
  
  UploadFile file=(UploadFile)filesget(name);// name:String 文件輸入框的名稱
  
  // file:UploadFile 文件
  
  }
  
  在這裡UploadFile file中包含了我們感興趣的上傳的文件的所有的信息:
  
  getData():byte[] 文件的內容
  
  getFileSize():long 文件的長度
  
  getContentType():String 文件的編碼
  
  getFileName():String 文件的名稱
  
  
  這些信息足夠我們進行一般所想要的操作了
  
  正如uploadBean的名稱所言uploadBean提供對某些常用上傳操作的封裝
  
  在uploadBean中setStoreModel(storeModel:int)提供了對上傳文件以下幾種形式的保存
  
   保存在內存中
  
   保存在指定目錄中
  
   保存在數據庫中
  
   保存在zip文件中
  
   保存在Tagzip文件中
  
   序列化形式保存
  
   Xml形式保存
  
  不過以上每一種形式的保存都需要符合uploadBean中所指的一些規則如保存在數據庫中uploadBean是把數據庫純粹作為一種存儲手段關鍵字都是用TimeStamp生成的保存在目錄中不能指定層以上目錄
  
  如我們需要把上傳文件用自己的方式保存可以采用重新編寫保存或者直接重載uploadBean實現
  
  從byte[]data=filegetData();中我們得到文件的字節數組很容易通過構造新的流進行文件的輸入輸出存儲到數據庫保存在各種形式的載體中
  
  
  實例上傳文件並且存放到數據庫中
  
  數據庫表格TestTable
  
  lsh char() pk
  
  nr clob()
  
  
  //數據庫基本操作
  
  package uploadexample;
  
  import javasql*;
  
  import javaxsq*;
  
  import javaxnaming*;
  
  public class DbOps(){
  
  private DataSource ds;
  
  private Connection conn;
  
  private String env=java:comp/env/jdbc/TestDB;
  public String getEnv(){return env;}
  public void setEnv(String env){thisenv=env;}
  public DataSource getDataSource(){//取得數據源(連結池)
  try{
  
  Context ictx=new InitalContext();
  
  ds=(DataSource)ictxlookup(env);
  
  }catch(Exception ignore){
  
  //some debug codes
  
  }
  return ds;
  }
  public Connection getConnection(){//取得數據庫連結
  if(ds==null)ds=getDataSource();
  
  try{
  
  if(conn==null)conn=dsgetConnection();
  
  }catch(Exception ignore){
  
  //some debug codes
  
  }
  return conn;
  }
  }
  //存儲
  package uploadexample;
  
  import javasql*;
  
  public class DBStore(){
  
  public static String ISFILEEXIST=select count(*) from TestTable where lsh=?;
  
  public static String INSERTFILE=insert into TestTable (lsh)values(?);
  
  public static String UPDATEFILE=update TestTable set nr=? where lsh=?;
  
  Connection conn;
  
  DbOps dbops;
  
  protected boolean isFileExist(String lsh)throws SQLException{
  
  PreparedStatement pst=connprepareStatement(ISFILEEXIST);
  
  pstsetString(lsh);
  
  ResultSet rs=pstexecuteQuery();
  
  int count;
  
  for(count=;rsnext();count=rsgetInt());
  
  pstclose();
  
  if(count<=0)return false;
  
  else return true;
  
  }
  
  protected void insertFile(String lsh)throws SQLException{
  
  PreparedStatement pst=conn.prepareStatement(INSERTFILE);
  
  pst.setString(1,lsh);
  
  pst.executeUpdate();
  
  pst.close();
  
  }
  
  protected void updateFile(String lsh,byte[]data)throws SQLException{
  
  PreparedStatement pst=conn.prepareStatement(UPDATEFILE);
  
  pst.setBytes(1,data);
  
  pst.setString(2,lsh);
  
  pst.executeUpdate();
  
  pst.close();
  
  }
  
  public void saveFile(String lsh,byte[]data)throws SQLException{
  
  if(lsh==null || data==null ||lsh.trim().length()==0)return;
  
  
  if(dbops==null)dbops=new DbOps();
  
  if(conn==null)conn=dbops.getConnection();
  
  
  if(!isFileExist(lsh)){
  
  insertFile(lsh);
  
  }
  
  updateFile(lsh,data);
  
  
  conn.close();
  
  conn=null;
  
  }
  
  }
  
  //servlet 片斷(servlet 中應包含javazoom.upload.*;java.util.*;)
  
  DBStore dbs=new DBStore();
  
  if (MultipartFormDataRequest.isMultipartFormData(request))
  
  {
  
  MultipartFormDataRequest mrequest = new MultipartFormDataRequest(request);
  
  if(mrequest.getParameter("submit")!=null){
  
  String lsh=mrequest.getParameter("lsh");
  
  Hashtable files = mrequest.getFiles();
  
  UploadFile file = files.get("ufile");
  
  byte[]data=file.getData();
  
  try{
  
  dbs.saveFile(lsh,data);
  
  }catch(Exception e){
  
  //debugCodes
  
  }
  }
  }
  //Submit html 片斷
  

  

  

  

  

  實際運行以上代碼時,注意DbOps的env參數需要和實際的服務器配置的連結池參數一致,並且需要有upload.jar 和 cos.jar這兩個包。tW.WIngWIT.cOm如果是在WebShpere 4上,請把他們拷貝到項目的webApplication\WEB-INF\lib下。如果是Resin上,把他們拷貝到項目的WEB-INF\lib下。
  
  

From:http://tw.wingwit.com/Article/program/Java/hx/201311/26648.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.