Oreilly COS + JSP 实现文件上传和显示
【IT168 技术文档】
很多Web应用中都会涉及到文件上传以及显示的问题,而这往往也让初学者颇感头疼。因为他们无法理清思路,这篇拙作算是抛砖引玉,给初学者一些帮助。如有错误,欢迎指正。
操作系统:Windows XP + SP2
开发环境::JDK 1.5.0.06 + Eclipse SDK 3.1.0
JDK载地址: http://java.sun.com/j2se/1.5.0/download.jsp
Eclipse下载地址:http://download.eclipse.org/eclipse/downloads/index.php
Web容器:Tomcat 5.0.28解压版
下载地址:http://mirror.vmmatrix.net/apache/tomcat/tomcat-5/v5.0.28/bin/jakarta-tomcat-5.0.28-deployer.zip
数据库:MySQL 4.1.12以及JDBC驱动
MySQL下载地址:http://dev.mysql.com/downloads/mysql/4.1.html
JDBC驱动下载地址:http://dev.mysql.com/downloads/connector/j/3.1.html
连接池:Poolman
联结池下载地址:http://cosoft.org.cn/html/osl/download.php?file_id=6177&f=poolman-2.0.4.tar.gz&g_u_n=poolman
上传组件:Oreilly Cos组件
上传组件下载地址:http://www.servlets.com/cos/index.html
这里需要强调的是,上传组件有很多,比如Apache基金的Jakarta的Commons包里提供的FileUpload组件(http://jakarta.apache.org/commons/fileupload/)。
实现原理大同小异,从应用的角度我们只需要知道如何使用其中的方法即可,而想深入了解其实现原理的朋友可以下载它们的源代码进行研究,也是一个提高自己编程水平的良方。因为我刚刚提到的上传组件是开源项目,因此在遵循开源协议的条件下可以免费使用,修改和发布。
因为本文实现的图片文件上传和显示仅仅是Web应用中一个很小的功能,所以上述软件的安装和配置不再赘述,如果安装和配置不甚了解,网络资源可以助你一臂之力。
一切就绪,开始我们的实践之旅。
假定你的MySQL 已经安装完毕,创建了数据库 myweb ,然后在mysql里运行myweb.sql脚本创建表 fileinfo,字段如下:
|
字段名
|
类型
|
是否空
|
主键PK/外键FK
|
说明
|
|
id
|
Bigint
|
Not null
|
PK
|
自增长
|
|
note
|
Varchar(200)
|
null
|
|
文件说明
|
|
filepath
|
Varchar(200)
|
Not null
|
|
文件保存路径
|
利用Eclipse创建一个Web Project,可能需要安装支持Web应用的插件Lomboz或者MyEclipse,本文使用的是MyEclipse。
Step 1:创建建一个J2EE Web Project,如下图所示:

Step 2:创建一个Project,如下图所示:

点击Finish按钮,Project创建完毕。接下来我们可以在新建一个lib文件夹,选中myweb,单击右键,选择new-->Folder,键入lib,确定后即可看到新建文件夹lib出现在Package Explorer中,这里存放我们将会应用到的包文件,包括上传组件cos.jar,poolman连接池以及mysql的JDBC驱动mysql-connector-java-3.1.12-bin.jar。
在MyEclipse里看到的Package Explorer如下图所示:

我们需要把加入的包引入Project,右键单击myweb,选择properties,将需要的包添加进来,如下图所示:

点击OK确定后,我们的Project建好了,创建完毕后的Package Explorer如下图所示:

这时候我们可以开始编写jsp,servlet以及javabean了。
现在重点讲解下cos上传组件的保存文件方法saveFile,该片断出自FileUpload.java:
FileUpload.java
/**
* file upload
*
* @param request
* @param folder
* @return
*/
public synchronized Hashtable saveFile(HttpServletRequest request, String folder) {
Hashtable nh = new Hashtable();
int maxPostSize = 2 * 1024 * 1024; // file size
MultipartParser mrequest = null;
try {
mrequest = new MultipartParser(request, maxPostSize);
} catch (IOException e) {
//e.printStackTrace();
}
mrequest.setEncoding("utf-8"); //charset config
Part part;
FilePart fp;
ParamPart pp;
File nf = null;
String filenm = null;
String fileExt = null;
String new_file_save_nm = null;
// upload one file
try {
while ((part = mrequest.readNextPart()) != null) {
if (part.isFile()) {
fp = (FilePart) part;
filenm = fp.getFileName();
if (filenm != null && filenm.length() != 0) {
fileExt = filenm.substring(filenm.lastIndexOf(".") + 1);
fileExt = fileExt.toLowerCase();//conver file suffix to lowercase
if (part.getName().equals("filepath")) {// jsp form
// elementes
// file name
new_file_save_nm = FileUpload.getImageFilename()
+ "." + fileExt;
nf = new File(folder + "/" + new_file_save_nm);
}
fp.writeTo(nf);
}
} else {
pp = (ParamPart) part;
nh.put(part.getName(), pp.getStringValue()); // save form data in Hashmap
}
}
} catch (UnsupportedEncodingException uee) {
uee.printStackTrace();
} catch (IOException ioe) {
ioe.printStackTrace();
}
if (new_file_save_nm != null) { //file save name
nh.put("new_file_save_nm", new_file_save_nm);
}
return nh;
}
这个保存文件的方法返回一个Hashtable对象。参数folder即为你想保存的文件夹目录,假定保存在file文件夹下,在上传文件的同时,将jsp页面的表单数据保存到Hashtable里方便以后数据的调用,大家看是不是十分简单,需要强调的是大家看到filepath字段即是表单里上传文件的file元素的名字,数据库里保存的也仅仅是文件的名称并且文件件的保存名是取当前系统时间进行重命名,大家如果想保留文件原名,可以重新命名下即可。
了解了cos组件的保存文件方法实现,我们只需在servlet里调用方法saveFile,如下代码片断,注意这里的filepath对应的表单元素是重新命名的new_file_save_nm:
Hashtable hashTable = new Hashtable();
if (action == null) {
hashTable = fileUpload.saveFile(request, fileUpload.getSuperPath()
+ request.getContextPath() + "/" + folder);// save file to
// the point
// folder
action = (String) hashTable.get("action");// get jsp form elements
note = (String) hashTable.get("note");
filepath = (String) hashTable.get("new_file_save_nm");
}
即可完成文件的上传和表单数据的提取工作,相信大家通过这个比较完整的小例子可以对利用cos组件上传文件有一个比较清晰的了解。由于时间参促,代码编写不甚规范,希望大家谅解!如有不对,欢迎指正批评,谢谢。