在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下。