分享
 
 
 

用javaZoom的uploadBean扩展request的功能

王朝java/jsp·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

在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

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有