在Servlet中,upload上传是我们常用的操作之一。然而在Javax.servlet包中,javax.servlet.http.HttpServletRequest对于form中的enctype ="multipart/form-data"的内容的处理支持却极有限,我们不得不手工编写读取和分离Stream中的内容的代码。这使我们对封装完好的MultipartFormDataRequest提供支持的包布满了期待。其实常用的javaZoom的uploadBean中,就已经提供了这个良好的工具。另外,uploadBean还包括了上传后的存储机制,如保存到数据库、文件、zip文件等。假如你不需要做定制的话,尽管可以使用他们。当然定制上传后的处理很简单也很实用。 javaZoom的包中共包含了7个class文件: UploadBean.class UploadParameters.class UploadListener.class UploadFile.class UploadException.class Archiver.class MultipartFormDataRequest.class 其中,我们最感爱好的是MultipartFormDataRequest.class。正如其名,它使我们可以象处理一般的form那样处理enctype="multipart/form-data"的form的内容。 在MutipartFormDataRequest中,共有5种public方法: getParameterNames(name:String):Enumeration getParameterValue(name:String):String getParameterValues(name:String):String[] getFiles():Hashtable isMultipartFormData(req:HttpServletRequest):boolean 和2种public构造函数: MultipartFormDataRequest(req:HttpServletRequest,maxcontentlength:int) MultipartFormDataRequest(req:HttpServletRequest) 所有的对Mutipart的内容的分析,在构造函数中由 com.oreilly.servlet.multipart包中的分析器完成。我们无需关心原先最头疼的对Stream内容的分析的工作,只需要象下面的代码那样: if (MultipartFormDataRequest.isMultipartFormData(request)){//假如是multipart类型的request MultipartFormDataRequest mrequest = new MultipartFormDataRequest(request); } 就得到了MutipartFormDataRequest的实例。 假如想得到上传的内容: Hashtable files = mrequest.getFiles();//得到所有的上传的文件 if(files!=null && !files.isEmpty()){ UploadFile file=(UploadFile)files.get(name);// name:String 文件输入框的名称 // file:UploadFile 文件 } 在这里,UploadFile file中包含了我们感爱好的上传的文件的所有的信息: getData():byte[] 文件的内容 getFileSize():long 文件的长度 getContentType():String 文件的编码 getFileName():String 文件的名称 这些信息足够我们进行一般所想要的操作了。 正如uploadBean的名称所言,uploadBean提供对某些常用上传操作的封装。 在uploadBean中,setStoreModel(storeModel:int)提供了对上传文件以下几种形式的保存 0 保存在内存中 1 保存在指定目录中 2 保存在数据库中 3 保存在zip文件中 4 保存在Tagzip文件中 5 序列化形式保存 6 XML形式保存 不过以上每一种形式的保存,都需要符合uploadBean中所指的一些规则。如保存在数据库中,uploadBean是把数据库纯粹作为一种存储手段,要害字都是用TimeStamp生成的;保存在目录中,不能指定3层以上目录。 如我们需要把上传文件用自己的方式保存,可以采用重新编写保存或者直接重载uploadBean实现。 从byte[]data=file.getData();中,我们得到文件的字节数组;很轻易通过构造新的流,进行文件的输入输出,存储到数据库,保存在各种形式的载体中。 实例1:上传文件并且存放到数据库中 数据库表格:TestTable lsh char(10) pk, nr clob(1000000) //数据库基本操作 package upload.example1; import java.sql.*; import javax.sq1.*; import javax.naming.*; 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){this.env=env;} public DataSource getDataSource(){//取得数据源(连结池) try{ Context ictx=new InitalContext(); ds=(DataSource)ictx.lookup(env); }catch(Exception ignore){ //some debug codes } return ds; } public Connection getConnection(){//取得数据库连结 if(ds==null)ds=getDataSource(); try{ if(conn==null)conn=ds.getConnection(); }catch(Exception ignore){ //some debug codes } return conn; } } //存储 package upload.example1; import java.sql.*; 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=conn.prepareStatement(ISFILEEXIST); pst.setString(1,lsh); ResultSet rs=pst.executeQuery(); int count; for(count=0;rs.next();count=rs.getInt(1)); pst.close(); 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这两个包。假如是在WebShpere 4上,请把他们拷贝到项目的webApplication\WEB-INF\lib下。假如是Resin上,把他们拷贝到项目的WEB-INF\lib下。
|