jspSmartUpload上传下载全攻略
2012-10-14 16:12
246 查看
一、安装篇
jspSmartUpload是由www.jspsmart.com网站开发的一个可免费使用的全功能的文件上传下载组件,适于嵌入执行上传下载操作的JSP文件中。该组件有以下几个特点:
1、使用简单。在JSP文件中仅仅书写三五行java代码就可以搞定文件的上传或下载,方便。
2、能全程控制上传。利用jspSmartUpload组件提供的对象及其操作方法,可以获得全部上传文件的信息(包括文件名,大小,类型,扩展名,文件数据等),方便存取。
3、能对上传的文件在大小、类型等方面做出限制。如此可以滤掉不符合要求的文件。
4、下载灵活。仅写两行代码,就能把Web服务器变成文件服务器。不管文件在Web服务器的目录下或在其它任何目录下,都可以利用jspSmartUpload进行下载。
5、能将文件上传到数据库中,也能将数据库中的数据下载下来。这种功能针对的是MySQL数据库,因为不具有通用性,所以本文不准备举例介绍这种用法。
jspSmartUpload组件可以从www.jspsmart.com网站上自由下载,压缩包的名字是jspSmartUpload.zip。下载后,用WinZip或WinRAR将其解压到Tomcat的webapps目录下(本文以Tomcat服务器为例进行介绍)。解压后,将webapps/jspsmartupload目录下的子目录Web-inf名字改为全大写的WEB-INF,这样一改jspSmartUpload类才能使用。因为Tomcat对文件名大小写敏感,它要求Web应用程序相关的类所在目录为WEB-INF,且必须是大写。接着重新启动Tomcat,这样就可以在JSP文件中使用jspSmartUpload组件了。
注意,按上述方法安装后,只有webapps/jspsmartupload目录下的程序可以使用jspSmartUpload组件,如果想让Tomcat服务器的所有Web应用程序都能用它,必须做如下工作:
1.进入命令行状态,将目录切换到Tomcat的webapps/jspsmartupload/WEB-INF目录下。
2.运行JAR打包命令:jar cvf jspSmartUpload.jar com
(也可以打开资源管理器,切换到当前目录,用WinZip将com目录下的所有文件压缩成jspSmartUpload.zip,然后将jspSmartUpload.zip换名为jspSmartUpload.jar文件即可。)
3.将jspSmartUpload.jar拷贝到Tomcat的shared/lib目录下。
二、相关类说明篇
㈠ File类
该类不同于java.io.File类,在编写程序时应注意使用。File类用于保存单个上传文件的相关信息。如上传文件的文件名、文件大小、文件数据等,下表列出了File类中的常用方法。
File类中的常用方法
Files类中的saveAs()方法用于保存文件,在File类中提供了两种形式的saveAs()方法:
ll saveAs(String destFilePathName)方法。
ll saveAs(String destFilePathName, int optionSaveAs)方法。
这两个方法没有返回值,第一种形式与saveAs(destFilePathName, 0)执行效果相同。
参数说明
l destFilePathName:指定文件保存的路径,包括文件名。其值应以“/”开头。
l optionSaveAs:保存目标选项。该选项有3个值,分别是SAVEAS_AUTO、SAVEAS_ VIRTUAL和SAVEAS_PHYSICAL。它们是File类中的静态字段,分别表示整数0、1和2。将optionSaveAs参数设为SAVEAS_VIRTUAL选项值,则通知jspSmartUpload组件以Web应用的根目录为文件根目录,然后加上destFilePathName参数指定的路径来保存文件;设为SAVEAS_PHYSICAL值,则一种情况是通知jspSmartUpload组件将以Web服务器的安装路径中的磁盘根目录为文件根目录,然后加上destFilePathName参数指定的路径来保存文件,另一种情况则以destFilePathName参数指定的目录为最终目录来保存文件;设为SAVEAS_AUTO值,则首先以SAVEAS_VIRTUAL方式来保存文件,若Web应用下由destFilePathName参数指定的路径不存在,则以SAVEAS_PHYSICAL方式保存文件。
例如,若Web服务器(以Tomcat为例)的安装目录为“E:\Tomcat 5.5”,当前Web应用为“FileUpDown”,下面分别应用这3个选项保存文件。
(1)使用SAVEAS_VIRTUAL选项值。
saveAs("/file/myfile.txt",File.SAVEAS_VIRTUAL)或saveAs("/file/myfile.txt",1)
若FileUpDown应用下存在“file”子目录,则将上传的文件以“myfile.txt”为文件名进行保存,实际的保存路径如下:
E:\Tomcat 5.5\webapps\FileUpDown\file\myfile.txt
若不存在“file”子目录,则抛出下面的异常:
This path does not exist (1135)
(2)使用SAVEAS_PHYSICAL选项值。
saveAs("/file/myfile.txt",File.SAVEAS_PHYSICAL)或saveAs("/file/myfile.txt",2)
因为Tomcat 5.5安装在E盘,因此若E盘根目录下存在“file”子目录,则将上传的文件以“myfile.txt”为文件名进行保存,实际的保存路径如下:
E:\file\myfile.txt
若E盘根目录下不存在“file”子目录,而FileUpDown应用的根目录下存在“file”子目录,则抛出下面的异常:
The path is not a physical path
否则抛出下面的异常:
This path does not exist (1135)
使用SAVEAS_PHYSICAL选项值时,可以将上传的文件保存到由destFilePathName参数指定的一个具体的目录下,例如:
saveAs("D:/temp/myfile.txt",File.SAVEAS_PHYSICAL)
最终文件的实际保存路径如下:
D:\temp\myfile.txt
(3)使用SAVEAS_AUTO选项值。
saveAs("/file/myfile.txt",File.SAVEAS_AUTO)或saveAs("/file/myfile.txt",0)
若FileUpDown应用根目录下存在“file”子目录,则以SAVEAS_VIRTUAL方式保存文件,否则以SAVEAS_PHYSICAL方式保存文件。
通常情况下应使用SAVEAS_VIRTUAL方式保存文件,以便程序的移植。
㈡ Files类
该类存储了所有上传的文件,通过类中的方法可获得上传文件的数量和总长度等信息。下表列出了Files类中的常用方法。
Files类中的常用方法
Files类中的getCollection()方法和getEnumeration()方法将所有的File对象分别以Collection和Enumeartion形式返回。
(1)getCollection()方法将所有File对象以Collection的形式返回,以便其他应用程序引用,该方法的具体代码如下:
public Collection getCollection(){
return m_files.values();
}
其中,“m_files”为Files类中的属性,其类型为Hashtable,它存储了所有的File对象。
(2)getEnumeration()方法将所有File对象以Enumeration形式返回,以便其他应用程序引用,该方法的具体代码如下:
public Enumeration getEnumeration(){
return m_files.elements();
}
其中,“m_files”为Files类中的属性,其类型为Hashtable,它存储了所有的File对象。
㈢ Request类
因为当Form表单用来实现文件上传时,通过JSP的内置对象request的getParameter()方法无法获取其他表单项的值,所以提供了该类来获取,Request类中提供了下表所示的方法。
Request类中的常用方法
㈣ SmartUpload类这个类完成上传下载工作。
SmartUpload类用于实现文件的上传与下载操作,该类中提供的方法如下。
1.文件上传与文件下载必须实现的方法
在使用jspSmartUpload组件实现文件上传与下载时,必须先实现initialize()方法。在SmartUpload类中提供了该方法的3种形式。
l(1)initialize(ServletConfig config, HttpServletRequest request, HttpServletResponse response)。
l(2)initialize(ServletContext application, HttpSession session, HttpServletRequest request, HttpServletResponse response, JspWriter out)。
l(3)initialize(PageContext pageContext)。
通常应用第三种形式的方法,该方法中的pageContext参数为JSP的内置对象(页面上下文)。
2.文件上传使用的方法
实现文件上传,首先应实现initialize()方法,然后实现如下的两个方法即可将文件上传到服务器中。
l(1)upload()方法。
实现了initialize()方法后,紧接着就应实现该方法。upload()方法用来完成一些准备操作。首先在该方法中调用JSP的内置对象request的getInputStream()方法获取客户端的输入流,然后通过该输入流的read()方法读取用户上传的所有文件数据到字节数组中,然后在循环语句中从该字节数组中提取每个文件的数据,并将当前提取出来的文件的信息封装到File类对象中,最后将该File类对象通过Files类的addFile()方法添加到Files类对象中。
l(2)save()方法。
在实现了initialize()方法和upload()方法后,通过调用该方法就可以将全部上传文件保存到指定目录下,并返回保存的文件个数。该方法具有以下两种形式。
① save(String destPathName)。
② save(String destPathName, int option)。
第一个方法等同于save(destPathName,0)或save(destPathName,File. SAVE_AUTO)。
实际上在SmartUpload类的save()方法中最终是调用File类中的saveAs()方法保存文件的,所以save()方法中的参数使用与File类的saveAs()方法中的参数使用是相同的。但在save()方法中option参数指定的保存选项的可选值为SAVE_AUTO、SAVE_VIRTUAL和SAVE_PHYSICAL。它们是SmartUpload类中的静态字段,分别表示整数0、1和2。
仅仅通过以上的3个方法就实现了文件的上传。下面介绍SmartUpload类中可用来限制上传文件和获取其他信息的主要方法。
l(1)setDeniedFilesList(String deniedFilesList)方法。
该方法用于设置禁止上传的文件。其中参数deniedFilesList指定禁止上传文件的扩展名,多个扩展名之间以逗号分隔。若禁止上传没有扩展名的文件,以“,,”表示。例如,setDeniedFilesList("exe,jsp,,bat")表示禁止上传*.exe、*.jsp、*.bat和不带扩展名的文件。
l(2)setAllowedFilesList(String allowedFilesList)方法。
该方法用于设置允许上传的文件。其中参数allowedFilesList指定允许上传文件的扩展名,多个扩展名之间以逗号分隔。若允许上传没有扩展名的文件,以“,,”表示。例如,setAllowedFilesList("txt,doc,,")表示只允许上传*.txt、*.doc和不带扩展名的文件。
l(3)setMaxFileSize(long maxFileSize) ()方法。
该方法用于设定允许每个文件上传的最大长度,该长度由参数maxFileSize指定。
l(4)setTotalMaxFileSize(long totalMaxFileSize)()方法。
该方法用于设置允许上传文件的总长度,该长度由参数totalMaxFileSize指定。
上述的对上传文件进行限制的方法需要在upload()方法之前调用。下面为SmartUpload类中的获取文件信息的方法。
l(1)getSize()方法。
该方法用于获取上传文件的总长度,具体代码如下:
public int getSize(){
return m_totalBytes;
}
其中,m_totalBytes为SmartUpload类中的属性,表示上传文件的总长度,它是在upload()方法中通过调用JSP内置对象request的getContentLength()方法被赋值的。
l(2)getFiles()方法。
获取全部上传文件,以Files对象形式返回。
l(3)getRequest()方法。
获取com.jspsmart.upload.Request对象,然后通过该对象获得上传的表单中其他表单项的值。
3.文件下载使用的方法
l(1)setContentDisposition(String contentDisposition)方法。
该方法用于将数据追加到MIME文件头的CONTENT-DISPOSITION域。参数contentDisposition为要添加的数据。进行文件下载时,将contentDispotition设为null,则组件将自动添加“attachment”,表示将下载的文件作为附件,IE浏览器会弹出“文件下载”对话框,而不是自动打开这个文件(IE浏览器一般根据下载的文件扩展名决定执行什么操作,扩展名为doc的文件将用Word打开)。
l(2)downloadFile()方法。
downloadFile()方法实现文件下载,SmartUpload类中提供了4种形式的downloadFile()方法,如下所示。
① downloadFile(String sourceFilePathName) 。
② downloadFile(String sourceFilePathName, String contentType) 。
③ downloadFile(String sourceFilePathName, String contentType, String destFileName) 。
④ downloadFile(String sourceFilePathName, String contentType, String destFileName, int blockSize)。
downloadFile()方法中的参数及说明如下表所示。
downloadFile()方法中的参数及说明
通常使用第一种方法,如果需要更改文件的内容类型,或者更改下载文件另存为的文件名,或者更改用来存储读取的文件数据的字节数组的大小时,可应用后面的3种方法.
三、文件上传篇
㈠ 表单要求
对于上传文件的FORM表单,有两个要求:
1、METHOD应用POST,即METHOD="POST"。
2、增加属性:ENCTYPE="multipart/form-data"
下面是一个用于上传文件的FORM表单的例子:
㈡ 上传的例子
1、上传页面upload.html
本页面提供表单,让用户选择要上传的文件,点击"上传"按钮执行上传操作。
页面源码如下:
2、上传处理页面do_upload.jsp
本页面执行文件上传操作。页面源码中详细介绍了上传方法的用法,在此不赘述了。
页面源码如下:
四、文件下载篇
1、下载链接页面download.html
页面源码如下:
2、下载处理页面do_download.jspdo_download.jsp展示了如何利用jspSmartUpload组件来下载文件,从下面的源码中就可以看到,下载何其简单。
源码如下:
注意,执行下载的页面,在Java脚本范围外(即<% ... %>之外),不要包含HTML代码、空格、回车或换行等字符,有的话将不能正确下载。不信的话,可以在上述源码中%><%之间加入一个换行符,再下载一下,保证出错。因为它影响了返回给浏览器的数据流,导致解析出错。
3、如何下载中文文件
jspSmartUpload虽然能下载文件,但对中文支持不足。若下载的文件名中有汉字,则浏览器在提示另存的文件名时,显示的是一堆乱码,很扫人兴。上面的例子就是这样。(这个问题也是众多下载组件所存在的问题,很少有人解决,搜索不到相关资料,可叹!)
为了给jspSmartUpload组件增加下载中文文件的支持,我对该组件进行了研究,发现对返回给浏览器的另存文件名进行UTF-8编码后,浏览器便能正确显示中文名字了。这是一个令人高兴的发现。于是我对jspSmartUpload组件的SmartUpload类做了升级处理,增加了toUtf8String这个方法,改动部分源码如下:
注意源码中粗体部分,原jspSmartUpload组件对返回的文件未作任何处理,现在做了编码的转换工作,将文件名转换为UTF-8形式的编码形式。UTF-8编码对英文未作任何处理,对中文则需要转换为%XX的形式。toUtf8String方法中,直接利用Java语言提供的编码转换方法获得汉字字符的UTF-8编码,之后将其转换为%XX的形式。
将源码编译后打包成jspSmartUpload.jar,拷贝到Tomcat的shared/lib目录下(可为所有WEB应用程序所共享),然后重启Tomcat服务器就可以正常下载含有中文名字的文件了。另,toUtf8String方法也可用于转换含有中文的超级链接,以保证链接的有效,因为有的WEB服务器不支持中文链接。
jspSmartUpload是由www.jspsmart.com网站开发的一个可免费使用的全功能的文件上传下载组件,适于嵌入执行上传下载操作的JSP文件中。该组件有以下几个特点:
1、使用简单。在JSP文件中仅仅书写三五行java代码就可以搞定文件的上传或下载,方便。
2、能全程控制上传。利用jspSmartUpload组件提供的对象及其操作方法,可以获得全部上传文件的信息(包括文件名,大小,类型,扩展名,文件数据等),方便存取。
3、能对上传的文件在大小、类型等方面做出限制。如此可以滤掉不符合要求的文件。
4、下载灵活。仅写两行代码,就能把Web服务器变成文件服务器。不管文件在Web服务器的目录下或在其它任何目录下,都可以利用jspSmartUpload进行下载。
5、能将文件上传到数据库中,也能将数据库中的数据下载下来。这种功能针对的是MySQL数据库,因为不具有通用性,所以本文不准备举例介绍这种用法。
jspSmartUpload组件可以从www.jspsmart.com网站上自由下载,压缩包的名字是jspSmartUpload.zip。下载后,用WinZip或WinRAR将其解压到Tomcat的webapps目录下(本文以Tomcat服务器为例进行介绍)。解压后,将webapps/jspsmartupload目录下的子目录Web-inf名字改为全大写的WEB-INF,这样一改jspSmartUpload类才能使用。因为Tomcat对文件名大小写敏感,它要求Web应用程序相关的类所在目录为WEB-INF,且必须是大写。接着重新启动Tomcat,这样就可以在JSP文件中使用jspSmartUpload组件了。
注意,按上述方法安装后,只有webapps/jspsmartupload目录下的程序可以使用jspSmartUpload组件,如果想让Tomcat服务器的所有Web应用程序都能用它,必须做如下工作:
1.进入命令行状态,将目录切换到Tomcat的webapps/jspsmartupload/WEB-INF目录下。
2.运行JAR打包命令:jar cvf jspSmartUpload.jar com
(也可以打开资源管理器,切换到当前目录,用WinZip将com目录下的所有文件压缩成jspSmartUpload.zip,然后将jspSmartUpload.zip换名为jspSmartUpload.jar文件即可。)
3.将jspSmartUpload.jar拷贝到Tomcat的shared/lib目录下。
二、相关类说明篇
㈠ File类
该类不同于java.io.File类,在编写程序时应注意使用。File类用于保存单个上传文件的相关信息。如上传文件的文件名、文件大小、文件数据等,下表列出了File类中的常用方法。
File类中的常用方法
方 法 | 说 明 |
saveAs() | 用于保存文件 |
isMissing() | 用于判断用户是否选择了文件,即表单中对应的<input type="file">标记实现的文件选择域中是否有值。该方法返回boolean型值,选择了文件时,返回False;否则返回True |
getFieldName() | 获取Form表单中当前上传文件所对应的表单项的名称 |
getFileName() | 获取文件的文件名,该文件名不包含目录 |
getFilePathName() | 获取文件的文件全名,获取的值是一个包含目录的完整文件名 |
getFileExt() | 获取文件的扩展名,即后缀名,不包含“.”符号 |
getContentType() | 获取文件MIME类型,如“text/plain” |
getContentString() | 获取文件的内容,返回值为String型 |
getSize() | 获取文件的大小、单位字节,返回值为int型 |
getBinaryData(int index) | 返回值为byte,获取文件数据中参数index指定位置处的一个字节,用于检测文件等处理 |
ll saveAs(String destFilePathName)方法。
ll saveAs(String destFilePathName, int optionSaveAs)方法。
这两个方法没有返回值,第一种形式与saveAs(destFilePathName, 0)执行效果相同。
参数说明
l destFilePathName:指定文件保存的路径,包括文件名。其值应以“/”开头。
l optionSaveAs:保存目标选项。该选项有3个值,分别是SAVEAS_AUTO、SAVEAS_ VIRTUAL和SAVEAS_PHYSICAL。它们是File类中的静态字段,分别表示整数0、1和2。将optionSaveAs参数设为SAVEAS_VIRTUAL选项值,则通知jspSmartUpload组件以Web应用的根目录为文件根目录,然后加上destFilePathName参数指定的路径来保存文件;设为SAVEAS_PHYSICAL值,则一种情况是通知jspSmartUpload组件将以Web服务器的安装路径中的磁盘根目录为文件根目录,然后加上destFilePathName参数指定的路径来保存文件,另一种情况则以destFilePathName参数指定的目录为最终目录来保存文件;设为SAVEAS_AUTO值,则首先以SAVEAS_VIRTUAL方式来保存文件,若Web应用下由destFilePathName参数指定的路径不存在,则以SAVEAS_PHYSICAL方式保存文件。
例如,若Web服务器(以Tomcat为例)的安装目录为“E:\Tomcat 5.5”,当前Web应用为“FileUpDown”,下面分别应用这3个选项保存文件。
(1)使用SAVEAS_VIRTUAL选项值。
saveAs("/file/myfile.txt",File.SAVEAS_VIRTUAL)或saveAs("/file/myfile.txt",1)
若FileUpDown应用下存在“file”子目录,则将上传的文件以“myfile.txt”为文件名进行保存,实际的保存路径如下:
E:\Tomcat 5.5\webapps\FileUpDown\file\myfile.txt
若不存在“file”子目录,则抛出下面的异常:
This path does not exist (1135)
(2)使用SAVEAS_PHYSICAL选项值。
saveAs("/file/myfile.txt",File.SAVEAS_PHYSICAL)或saveAs("/file/myfile.txt",2)
因为Tomcat 5.5安装在E盘,因此若E盘根目录下存在“file”子目录,则将上传的文件以“myfile.txt”为文件名进行保存,实际的保存路径如下:
E:\file\myfile.txt
若E盘根目录下不存在“file”子目录,而FileUpDown应用的根目录下存在“file”子目录,则抛出下面的异常:
The path is not a physical path
否则抛出下面的异常:
This path does not exist (1135)
使用SAVEAS_PHYSICAL选项值时,可以将上传的文件保存到由destFilePathName参数指定的一个具体的目录下,例如:
saveAs("D:/temp/myfile.txt",File.SAVEAS_PHYSICAL)
最终文件的实际保存路径如下:
D:\temp\myfile.txt
(3)使用SAVEAS_AUTO选项值。
saveAs("/file/myfile.txt",File.SAVEAS_AUTO)或saveAs("/file/myfile.txt",0)
若FileUpDown应用根目录下存在“file”子目录,则以SAVEAS_VIRTUAL方式保存文件,否则以SAVEAS_PHYSICAL方式保存文件。
通常情况下应使用SAVEAS_VIRTUAL方式保存文件,以便程序的移植。
㈡ Files类
该类存储了所有上传的文件,通过类中的方法可获得上传文件的数量和总长度等信息。下表列出了Files类中的常用方法。
Files类中的常用方法
方 法 | 说 明 |
getCount() | 获取上传文件的数目,返回值为int型 |
getSize() | 获取上传文件的总长度,单位字节,返回值为long型 |
getFile(int index) | 获取参数index指定位置处的com.jspsmart.upload.File对象 |
getCollection() | 将所有File对象以Collection的形式返回 |
getEnumeration() | 将所有File对象以Enumeration形式返回 |
(1)getCollection()方法将所有File对象以Collection的形式返回,以便其他应用程序引用,该方法的具体代码如下:
public Collection getCollection(){
return m_files.values();
}
其中,“m_files”为Files类中的属性,其类型为Hashtable,它存储了所有的File对象。
(2)getEnumeration()方法将所有File对象以Enumeration形式返回,以便其他应用程序引用,该方法的具体代码如下:
public Enumeration getEnumeration(){
return m_files.elements();
}
其中,“m_files”为Files类中的属性,其类型为Hashtable,它存储了所有的File对象。
㈢ Request类
因为当Form表单用来实现文件上传时,通过JSP的内置对象request的getParameter()方法无法获取其他表单项的值,所以提供了该类来获取,Request类中提供了下表所示的方法。
Request类中的常用方法
方 法 | 说 明 |
getParameter(String name) | 获取Form表单中由参数name指定的表单元素的值,如<input type="text" name="user">,当该表单元素不存在时,返回null |
getParameterNames() | 获取Form表单中除<input type="file">外的所有表单元素的名称,它返回一个枚举型对象 |
getParameterValues(String name) | 获取Form表单中多个具有相同名称的表单元素的值,该名称由参数name指定,该方法返回一个字符串数组 |
SmartUpload类用于实现文件的上传与下载操作,该类中提供的方法如下。
1.文件上传与文件下载必须实现的方法
在使用jspSmartUpload组件实现文件上传与下载时,必须先实现initialize()方法。在SmartUpload类中提供了该方法的3种形式。
l(1)initialize(ServletConfig config, HttpServletRequest request, HttpServletResponse response)。
l(2)initialize(ServletContext application, HttpSession session, HttpServletRequest request, HttpServletResponse response, JspWriter out)。
l(3)initialize(PageContext pageContext)。
通常应用第三种形式的方法,该方法中的pageContext参数为JSP的内置对象(页面上下文)。
2.文件上传使用的方法
实现文件上传,首先应实现initialize()方法,然后实现如下的两个方法即可将文件上传到服务器中。
l(1)upload()方法。
实现了initialize()方法后,紧接着就应实现该方法。upload()方法用来完成一些准备操作。首先在该方法中调用JSP的内置对象request的getInputStream()方法获取客户端的输入流,然后通过该输入流的read()方法读取用户上传的所有文件数据到字节数组中,然后在循环语句中从该字节数组中提取每个文件的数据,并将当前提取出来的文件的信息封装到File类对象中,最后将该File类对象通过Files类的addFile()方法添加到Files类对象中。
l(2)save()方法。
在实现了initialize()方法和upload()方法后,通过调用该方法就可以将全部上传文件保存到指定目录下,并返回保存的文件个数。该方法具有以下两种形式。
① save(String destPathName)。
② save(String destPathName, int option)。
第一个方法等同于save(destPathName,0)或save(destPathName,File. SAVE_AUTO)。
实际上在SmartUpload类的save()方法中最终是调用File类中的saveAs()方法保存文件的,所以save()方法中的参数使用与File类的saveAs()方法中的参数使用是相同的。但在save()方法中option参数指定的保存选项的可选值为SAVE_AUTO、SAVE_VIRTUAL和SAVE_PHYSICAL。它们是SmartUpload类中的静态字段,分别表示整数0、1和2。
仅仅通过以上的3个方法就实现了文件的上传。下面介绍SmartUpload类中可用来限制上传文件和获取其他信息的主要方法。
l(1)setDeniedFilesList(String deniedFilesList)方法。
该方法用于设置禁止上传的文件。其中参数deniedFilesList指定禁止上传文件的扩展名,多个扩展名之间以逗号分隔。若禁止上传没有扩展名的文件,以“,,”表示。例如,setDeniedFilesList("exe,jsp,,bat")表示禁止上传*.exe、*.jsp、*.bat和不带扩展名的文件。
l(2)setAllowedFilesList(String allowedFilesList)方法。
该方法用于设置允许上传的文件。其中参数allowedFilesList指定允许上传文件的扩展名,多个扩展名之间以逗号分隔。若允许上传没有扩展名的文件,以“,,”表示。例如,setAllowedFilesList("txt,doc,,")表示只允许上传*.txt、*.doc和不带扩展名的文件。
l(3)setMaxFileSize(long maxFileSize) ()方法。
该方法用于设定允许每个文件上传的最大长度,该长度由参数maxFileSize指定。
l(4)setTotalMaxFileSize(long totalMaxFileSize)()方法。
该方法用于设置允许上传文件的总长度,该长度由参数totalMaxFileSize指定。
上述的对上传文件进行限制的方法需要在upload()方法之前调用。下面为SmartUpload类中的获取文件信息的方法。
l(1)getSize()方法。
该方法用于获取上传文件的总长度,具体代码如下:
public int getSize(){
return m_totalBytes;
}
其中,m_totalBytes为SmartUpload类中的属性,表示上传文件的总长度,它是在upload()方法中通过调用JSP内置对象request的getContentLength()方法被赋值的。
l(2)getFiles()方法。
获取全部上传文件,以Files对象形式返回。
l(3)getRequest()方法。
获取com.jspsmart.upload.Request对象,然后通过该对象获得上传的表单中其他表单项的值。
3.文件下载使用的方法
l(1)setContentDisposition(String contentDisposition)方法。
该方法用于将数据追加到MIME文件头的CONTENT-DISPOSITION域。参数contentDisposition为要添加的数据。进行文件下载时,将contentDispotition设为null,则组件将自动添加“attachment”,表示将下载的文件作为附件,IE浏览器会弹出“文件下载”对话框,而不是自动打开这个文件(IE浏览器一般根据下载的文件扩展名决定执行什么操作,扩展名为doc的文件将用Word打开)。
l(2)downloadFile()方法。
downloadFile()方法实现文件下载,SmartUpload类中提供了4种形式的downloadFile()方法,如下所示。
① downloadFile(String sourceFilePathName) 。
② downloadFile(String sourceFilePathName, String contentType) 。
③ downloadFile(String sourceFilePathName, String contentType, String destFileName) 。
④ downloadFile(String sourceFilePathName, String contentType, String destFileName, int blockSize)。
downloadFile()方法中的参数及说明如下表所示。
downloadFile()方法中的参数及说明
参 数 | 说 明 |
sourceFilePathName | 指定要下载文件的文件名(可带目录,如“/file/myfile.txt”或“E:/file/myfile.text”),若该文件名存在当前应用下,则sourceFilePathName=pageContext.getServletContext().getReal Path(sourceFilePathName) |
contentType | 指定一个文件内容类型(MIME格式的文件类型信息) |
destFileName | 指定下载的文件另存为的文件名 |
blockSize | 指定存储读取的文件数据的字节数组的大小,默认值为65000 |
三、文件上传篇
㈠ 表单要求
对于上传文件的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> |
1、上传页面upload.html
本页面提供表单,让用户选择要上传的文件,点击"上传"按钮执行上传操作。
页面源码如下:
<!-- 文件名:upload.html 作 者:纵横软件制作中心雨亦奇(zhsoft88@sohu.com) --> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>文件上传</title> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> </head> <body> <p> </p> <p align="center">上传文件选择</p> <FORM METHOD="POST" ACTION="jsp/do_upload.jsp" ENCTYPE="multipart/form-data"> <input type="hidden" name="TEST" value="good"> <table width="75%" border="1" align="center"> <tr> <td><div align="center">1、 <input type="FILE" name="FILE1" size="30"> </div></td> </tr> <tr> <td><div align="center">2、 <input type="FILE" name="FILE2" size="30"> </div></td> </tr> <tr> <td><div align="center">3、 <input type="FILE" name="FILE3" size="30"> </div></td> </tr> <tr> <td><div align="center">4、 <input type="FILE" name="FILE4" size="30"> </div></td> </tr> <tr> <td><div align="center"> <input type="submit" name="Submit" value="上传它!"> </div></td> </tr> </table> </FORM> </body> </html> |
本页面执行文件上传操作。页面源码中详细介绍了上传方法的用法,在此不赘述了。
页面源码如下:
<%-- 文件名:do_upload.jsp 作 者:纵横软件制作中心雨亦奇(zhsoft88@sohu.com) --%> <%@ page contentType="text/html; charset=gb2312" language="java" import="java.util.*,com.jspsmart.upload.*" errorPage="" %> <html> <head> <title>文件上传处理页面</title> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> </head> <body> <% // 新建一个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. PR intln(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); } %> </body> </html> |
1、下载链接页面download.html
页面源码如下:
<!-- 文件名:download.html 作 者:纵横软件制作中心雨亦奇(zhsoft88@sohu.com) --> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>下载</title> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> </head> <body> <a href="jsp/do_download.jsp">点击下载</a> </body> </html> |
源码如下:
<%@ page contentType="text/html;charset=gb2312" import="com.jspsmart.upload.*" %><% // 新建一个SmartUpload对象 SmartUpload su = new SmartUpload(); // 初始化 su.initialize(pageContext); // 设定contentDisposition为null以禁止浏览器自动打开文件, //保证点击链接后是下载文件。若不设定,则下载的文件扩展名为 //doc时,浏览器将自动用word打开它。扩展名为pdf时, //浏览器将用acrobat打开。 su.setContentDisposition(null); // 下载文件 su.downloadFile("/upload/如何赚取我的第一桶金.doc"); %> |
3、如何下载中文文件
jspSmartUpload虽然能下载文件,但对中文支持不足。若下载的文件名中有汉字,则浏览器在提示另存的文件名时,显示的是一堆乱码,很扫人兴。上面的例子就是这样。(这个问题也是众多下载组件所存在的问题,很少有人解决,搜索不到相关资料,可叹!)
为了给jspSmartUpload组件增加下载中文文件的支持,我对该组件进行了研究,发现对返回给浏览器的另存文件名进行UTF-8编码后,浏览器便能正确显示中文名字了。这是一个令人高兴的发现。于是我对jspSmartUpload组件的SmartUpload类做了升级处理,增加了toUtf8String这个方法,改动部分源码如下:
public void downloadFile(String s, String s1, String s2, int i) throws ServletException, IOException, SmartUploadException { if(s == null) throw new IllegalArgumentException("File '" + s + "' not found (1040)."); if(s.equals("")) throw new IllegalArgumentException("File '" + s + "' not found (1040)."); if(!isVirtual(s) && m_denyPhysicalPath) throw new SecurityException("Physical path is denied (1035)."); if(isVirtual(s)) s = m_ application .getRealPath(s); java.io.File file = new java.io.File(s); FileInputStream fileinputstream = new FileInputStream(file); long l = file.length(); boolean flag = false; int k = 0; byte abyte0[] = new byte[i]; if(s1 == null) m_response.setContentType("application/x-msdownload"); else if(s1.length() == 0) m_response.setContentType("application/x-msdownload"); else m_response.setContentType(s1); m_response.setContentLength((int)l); m_contentDisposition = m_contentDisposition != null ? m_contentDisposition : "attachment;"; if(s2 == null) m_response.setHeader("Content-Disposition", m_contentDisposition + " filename=" + toUtf8String(getFileName(s))); else if(s2.length() == 0) m_response.setHeader("Content-Disposition", m_contentDisposition); else m_response.setHeader("Content-Disposition", m_contentDisposition + " filename=" + toUtf8String(s2)); while((long)k < l) { int j = fileinputstream.read(abyte0, 0, i); k += j; m_response.getOutputStream().write(abyte0, 0, j); } fileinputstream.close(); } /** * 将文件名中的汉字转为UTF8编码的串,以便下载时能正确显示另存的文件名. * 纵横软件制作中心雨亦奇2003.08.01 * @param s 原文件名 * @return 重新编码后的文件名 */ public static String toUtf8String(String s) { StringBuffer sb = new StringBuffer(); for (int i=0;i<s.length();i++) { char c = s.charAt(i); if (c >= 0 && c <= 255) { sb.append(c); } else { byte[] b; try { b = Character.toString(c).getBytes("utf-8"); } catch (Exception ex) { System.out.println(ex); b = new byte[0]; } for (int j = 0; j < b.length; j++) { int k = b[j]; if (k < 0) k += 256; sb.append("%" + Integer.toHexString(k). toUpperCase()); } } } return sb.toString(); } |
将源码编译后打包成jspSmartUpload.jar,拷贝到Tomcat的shared/lib目录下(可为所有WEB应用程序所共享),然后重启Tomcat服务器就可以正常下载含有中文名字的文件了。另,toUtf8String方法也可用于转换含有中文的超级链接,以保证链接的有效,因为有的WEB服务器不支持中文链接。
相关文章推荐
- jspSmartUpload上传下载全攻略[转]
- 上传下载全攻略jspSmartUpload
- 上传下载全攻略jspSmartUpload
- jspSmartUpload上传下载全攻略
- jspSmartUpload上传下载全攻略(二)
- jspSmartUpload上传下载全攻略
- jspSmartUpload上传下载全攻略(转)
- jspSmartUpload上传下载全攻略
- jspSmartUpload上传下载全攻略
- jsp-SmartUpload上传下载全攻略
- jspSmartUpload上传下载全攻略
- jspSmartUpload上传下载全攻略
- jspSmartUpload上传下载全攻略
- jspSmartUpload上传下载全攻略
- jspSmartUpload上传下载全攻略!
- jspSmartUpload上传下载全攻略
- jspSmartUpload上传下载全攻略
- (转)jspSmartUpload上传下载全攻略
- jspSmartUpload上传下载全攻略
- jspSmartUpload上传下载全攻略