文件上传在web应用中非常普遍,要在jsp环境中实现文件上传功能是非常容易的,因为网上有许多用java开发的文件上传组件,下面我介绍几种有关文件上传组件。
一. 基于org.apache.struts.upload.FormFile的文件上传。
这种方法相对比较简单。原理是在Actionform中定义一个FormFile类型的属性file,这个类型是struts所提供的包中的对象——“org.apache.struts.upload.FormFile”,并在jsp中加入html:file标签,当提交表单后,该标签会把用户所选择上传的文件的放入file中。
在action中加入如下语句进行上传:
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response){
FileUploadActionForm upload=( FileUploadActionForm)form;
FormFile ff= upload.getFile();//取得上传的文件
String filesize=Integer.toString(ff.getFileSize())+"bytes";//获取文件大小
String dir=request.getRealPath("/upload");//上传到指定的upload包中
InputStream in=ff.getInputStream();//把文件读入
OutputStream out=new FileOutputStream(dir+"/"+ ff.getFileName()); //建立一个上传文件的输出流
out.write(); //将文件写入服务器
out.close();
in.close();
return mapping.findForward(SUCCESS);
}
剩下的就是配置struts-config.xml中的ActionForm与Action对应了,在这里我就不详说了。但是这种方法只限于在struts环境中使用,因此它的通用性并不强。
二. 基于commons-fileupload的文件上传
common-fileupload组件是apache的一个开源项目之一,可以从http://jakarta.apache.org/commons/fileupload/下载。用该组件可实现一次上传一个或多个文件,并可限制文件大小。
下面举一个例子:
新建一个servlet: upload.java用于文件上传:
public class upload extends httpservlet {
private string uploadpath = "c:\\upload\\"; / 上传文件的目录
private string temppath = "c:\\upload\\tmp\\"; / 临时文件目录
public void dopost(httpservletrequest request,
httpservletresponse response)
throws ioexception, servletexception
{
}
}
在dopost()方法中,当servlet收到浏览器发出的post请求后,实现文件上传。以下是示例代码:
public void dopost(httpservletrequest request,
httpservletresponse response)
throws ioexception, servletexception
{
try {
diskfileupload fu = new diskfileupload();
/ /设置最大文件尺寸,这里是4mb
fu.setsizemax(4194304);
// 设置缓冲区大小,这里是4kb
fu.setsizethreshold(4096);
/ /设置临时目录:
fu.setrepositorypath(temppath);
/ /得到所有的文件:
list fileitems = fu.parserequest(request);
iterator i = fileitems.iterator();
// 依次处理每一个文件:
while(i.hasnext()) {
fileitem fi = (fileitem)i.next();
/ /获得文件名,这个文件名包括路径:
string filename = fi.getname();
// 在这里可以记录用户和文件信息
/ /...
/ /写入文件,暂定文件名为a.txt,可以从filename中提取文件名:
fi.write(new file(uploadpath + "a.txt"));
}
}
catch(exception e) {
/ /可以跳转出错页面
}
}
如果要在配置文件中读取指定的上传文件夹,可以在init()方法中执行:
public void init() throws servletexception {
uploadpath = ....
temppath = ....
/ /文件夹不存在就自动创建:
if(!new file(uploadpath).isdirectory())
new file(uploadpath).mkdirs();
if(!new file(temppath).isdirectory())
new file(temppath).mkdirs();
编译该servlet,注意要指定classpath,确保包含commons-upload-1.0.jar和tomcat\common\lib\servlet-api.jar。
配置servlet,用记事本打开tomcat\webapps\你的webapp\web-inf\web.xml,没有的话新建一个。
典型配置如下:
<@xml version="1.0" encoding="iso-8859-1"@>
<!doctype web-app
public "-/sun microsystems, inc./dtd web application 2.3/en"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<servlet>
<servlet-name>upload</servlet-name>
<servlet-class>upload</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>upload</servlet-name>
<url-pattern>/fileupload</url-pattern>
</servlet-mapping>
</web-app>
配置好servlet后,启动tomcat,写一个简单的html测试:
<form action="fileupload" method="post"
enctype="multipart/form-data" name="form1">
<input type="file" name="file">
<input type="submit" name="submit" value="upload">
</form>
注意action="fileupload"其中fileupload是配置servlet时指定的url-pattern。
这种方法的通用性相对比较好,可应用于包括struts在内的各种编程技术。
三. 基于jspSmartUpload的文件上传.
jspSmartUpload是由www.jspsmart.com网站开发的一个可免费使用的全功能的文件上传下载组件,适于嵌入执行上传下载操作的JSP文件中。
利用jspSmartUpload组件提供的对象及其操作方法,可以获得全部上传文件的信息(包括文件名,大小,类型,扩展名,文件数据等),
方便存取。能对上传的文件在大小、类型等方面做出限制。如此可以滤掉不符合要求的文件。
下载灵活。仅写两行代码,就能把Web服务器变成文件服务器。不管文件在Web服务器的目录下或在其它任何目录下,都可以利用jspSmartUpload进行下载。
能将文件上传到数据库中,也能将数据库中的数据下载下来。这种功能针对的是MYSQL数据库.
对于上传文件的FORM表单,有两个要求:
1、METHOD应用POST,即METHOD="POST"。
2、增加属性:ENCTYPE="multipart/form-data"
下面是一个用于上传文件的FORM表单的例子:
<FORM METHOD="POST" ENCTYPE="multipart/form-data"
ACTION="/jspSmartUpload/upload.jsp">
<INPUT TYPE="FILE" NAME="MYFILE">
<INPUT TYPE="SUBMIT">
</FORM>
执行文件上传操作
<%
// 新建一个SmartUpload对象
SmartUpload su = new SmartUpload();
// 上传初始化
su.initialize(pageContext);
// 设定上传限制
// 1.限制每个上传文件的最大长度。
// su.setMaxFileSize(10000);
// 2.限制总上传数据的长度。
// su.setTotalMaxFileSize(20000);
// 3.设定允许上传的文件(通过扩展名限制),仅允许doc,txt文件。
// su.setAllowedFilesList("doc,txt");
// 4.设定禁止上传的文件(通过扩展名限制),禁止上传带有exe,bat,
jsp,htm,html扩展名的文件和没有扩展名的文件。
// su.setDeniedFilesList("exe,bat,jsp,htm,html,,");
// 上传文件
su.upload();
// 将上传文件全部保存到指定目录
int count = su.save("/upload");
out.println(count+"个文件上传成功!<br>");
// 利用Request对象获取参数之值
out.println("TEST="+su.getRequest().getParameter("TEST")
+"<BR><BR>");
// 逐一提取上传文件信息,同时可保存文件。
for (int i=0;i<su.getFiles().getCount();i++)
{
com.jspsmart.upload.File file = su.getFiles().getFile(i);
// 若文件不存在则继续
if (file.isMissing()) continue;
// 显示当前文件信息
out.println("<TABLE BORDER=1>");
out.println("<TR><TD>表单项名(FieldName)</TD><TD>"
+ file.getFieldName() + "</TD></TR>");
out.println("<TR><TD>文件长度(Size)</TD><TD>" +
file.getSize() + "</TD></TR>");
out.println("<TR><TD>文件名(FileName)</TD><TD>"
+ file.getFileName() + "</TD></TR>");
out.println("<TR><TD>文件扩展名(FileExt)</TD><TD>"
+ file.getFileExt() + "</TD></TR>");
out.println("<TR><TD>文件全名(FilePathName)</TD><TD>"
+ file.getFilePathName() + "</TD></TR>");
out.println("</TABLE><BR>");
// 将文件另存
// file.saveAs("/upload/" + myFile.getFileName());
// 另存到以WEB应用程序的根目录为文件根目录的目录下
// file.saveAs("/upload/" + myFile.getFileName(),su.SAVE_VIRTUAL);
// 另存到操作系统的根目录为文件根目录的目录下
// file.saveAs("c:\\temp\\" + myFile.getFileName(),su.SAVE_PHYSICAL);
}
%>
用这种方法并不用配置任何文件。只需在html/jsp文件中加入如下类似代码即可执行,
<FORM METHOD="POST"ACTION="jsp/do_upload.jsp"ENCTYPE="multipart/form-data">
<input type="FILE" name="FILE1" size="30">
<input type="submit" name="Submit" value="上传它!">
</FORM>
总之这三种方法各有千秋,用时可按实际情况进行选择。