JSP上传文件的实现,应用jspsmart组件包

本文介绍了如何使用jspSmartUpload组件在JSP中实现文件上传功能,特别是视频文件。该组件易于安装,能控制上传过程并设置限制。通过创建JSP页面和Servlet,演示了文件上传的实现步骤,包括文件类型的验证和表单提交。


  本人正在做一个要求首页发布视频的功能,所以要用到远程的文件上传,这里自然上传的是视频文件,包括几种常见的视频文件,如 WMV AVI RM MPG RMVB,用的是jspsmart组件包。 
         一,安装及介绍  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目录下。

        按照上面的方法进行处理后,我们就可以来用jspsmartupload来进行文件的上传了。

       

         二,具体实例

          首先建立一个JSP页面,来提交要进行上传文件的路径和视频的名称,比如名称是addNewVideo.jsp,内容如下:

        

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  2. <%
  3. String path = request.getContextPath();
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
  5. %>
  6. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  7. <html>
  8.   <head>
  9.     <base href="<%=basePath%>">
  10.     
  11.     <title>发布新的首页视频</title>
  12.     
  13.     <meta http-equiv="pragma" content="no-cache">
  14.     <meta http-equiv="cache-control" content="no-cache">
  15.     <meta http-equiv="expires" content="0">    
  16.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
  17.     <meta http-equiv="description" content="This is my page">
  18.     <!--
  19.     <link rel="stylesheet" type="text/css" href="styles.css">
  20.     -->
  21.   </head>
  22.   <script type="text/javascript">
  23.   //进行验证输入的内容是否合法
  24.     function checkContent(){
  25.         var name = document.formName.nameOfVideo.value;
  26.         var content = document.formName.contentOfVideo.value;
  27.         
  28.         var alarm = "";
  29.         if( name == ""){
  30.             alarm +="视频名称为空!";
  31.         }
  32.         
  33.         if( content == ""){
  34.             alarm += " " + "路径为空!";
  35.         }else{
  36.             //进行判断文件的类型,视频的文件类型一般为几种
  37.             //常见的有 WMV AVI RM MPG RMVB              
  38.             var fileNameCons = content.split("//");
  39.             var fileNameLast = fileNameCons[fileNameCons.length-1];
  40.             
  41.             var fileType = fileNameLast.split(".");
  42.             var type = fileType[fileType.length - 1].toLowerCase();         
  43.             
  44.             var typeSet = new Array("wmv","avi","rm","mpg","rmvb");
  45.             var symbol = 1;
  46.                         
  47.             for( var i = 0; i < typeSet.length; i ++ ){
  48.                 //alert(typeSet[i] + " " + type );
  49.                 if(typeSet[i] == type){
  50.                     //alert("--------");
  51.                     symbol = 0;
  52.                     break;
  53.                 }
  54.             }
  55.             
  56.             if( symbol == 0 ){
  57.                 //ok
  58.             }else{
  59.                 alarm += " " + "不合法的文件类型,必须是视频文件!";
  60.             }                       
  61.         }       
  62.         if( alarm != ""){
  63.             alert(alarm);
  64.             return false;
  65.         }else{
  66.             document.formName.submit();
  67.             return true;
  68.         }
  69.     }
  70.   </script>
  71.   
  72.   <body>
  73.     <table width = "1000px" align = "center">
  74.         <tr align = 'center'>
  75.             <td><jsp:include flush="true" page="../menu.jsp"></jsp:include></td>            
  76.             <td align = 'center' height = "100%">
  77.                 <div style = "border-width:1px;border-style:dashed;border-color:#cccccc;width:100%;height:100%;">
  78.                 <table width = "100%" align = "center"><tr align = "left" bgcolor="#BEE1FF"><td colspan = '2'>位置:发布管理->首页视频发布</td></tr></table>
  79.                     <table align = "center">
  80.                         <tr><td>
  81.                         <form name = 'formName' action = "./servlet/AddNewVideoServlet" method = "post" ENCTYPE="multipart/form-data">
  82.                         <table align = "center" style = "margin-top:100px;" style = "border-width:1px;border-style:dashed;border-color:#cccccc;">                           
  83.                                 <tr><td>视频名称:</td><td><input type = 'text' name = 'nameOfVideo' size = "32"></td></tr>
  84.                                 <tr><td>路径:</td><td><input type = "file" name  = "contentOfVideo"></td></tr>
  85.                                 <tr align = "center"><td colspan = '2'><input type = "submit" value = "提交" onclick = "checkContent();return false;"><input type = 'reset' value = "清空重写"></td></tr>
  86.                         </table>
  87.                         </form>
  88.                         </td></tr>
  89.                     </table>    
  90.                 </div>          
  91.             </td>
  92.         </tr>    
  93.     </table>
  94.   </body>
  95. </html>

   上面的checkContent()方法是用来进行验证表单的,主要是验证表单的非空以及提交的文件是否是视频文件,本人现在找到的方法来判断视频文件,就是用他的后缀表来进行判断的,不知道是不是会有更加好的办法,总感觉用后缀名来进行判断总是不好,万一用户把文件后缀随便一改不就挂了,呵呵。而且注意FORM后面要加上这个属性ENCTYPE="multipart/form-data",<jsp:include flush="true" page="../menu.jsp"></jsp:include>是我做的东西的一个菜单表,对于这个来讲是没有什么别的用处。

        然后提交到Servlet,在这里比如Servlet是AddNewVideoServlet,下面是它的内容:

  1. package com.yspace.dxf.releaseManageServlet;
  2. import java.io.IOException;
  3. import java.io.PrintWriter;
  4. import javax.servlet.ServletConfig;
  5. import javax.servlet.ServletException;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. import com.jspsmart.upload.SmartUpload;
  10. public class AddNewVideoServlet extends HttpServlet {
  11.     private ServletConfig config;
  12.     /**
  13.     * Init the servlet
  14.     */
  15.     final public void init(ServletConfig config) throws ServletException {
  16.         this.config = config;
  17.     }
  18.     
  19.     /**
  20.      * The doGet method of the servlet. <br>
  21.      *
  22.      * This method is called when a form has its tag value method equals to get.
  23.      * 
  24.      * @param request the request send by the client to the server
  25.      * @param response the response send by the server to the client
  26.      * @throws ServletException if an error occurred
  27.      * @throws IOException if an error occurred
  28.      */
  29.     public void doGet(HttpServletRequest request, HttpServletResponse response)
  30.             throws ServletException, IOException {
  31.         response.setContentType("text/html");
  32.         PrintWriter out = response.getWriter();
  33.         out
  34.                 .println("<!DOCTYPE HTML PUBLIC /"-//W3C//DTD HTML 4.01 Transitional//EN/">");
  35.         out.println("<HTML>");
  36.         out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
  37.         out.println("  <BODY>");
  38.         out.print("    This is ");
  39.         out.print(this.getClass());
  40.         out.println(", using the GET method");
  41.         out.println("  </BODY>");
  42.         out.println("</HTML>");
  43.         out.flush();
  44.         out.close();
  45.     }
  46.     /**
  47.      * The doPost method of the servlet. <br>
  48.      *
  49.      * This method is called when a form has its tag value method equals to post.
  50.      * 
  51.      * @param request the request send by the client to the server
  52.      * @param response the response send by the server to the client
  53.      * @throws ServletException if an error occurred
  54.      * @throws IOException if an error occurred
  55.      */
  56.     public void doPost(HttpServletRequest request, HttpServletResponse response)
  57.             throws ServletException, IOException {
  58.         //这个是用来进行发布首页视频用的
  59.         //视频的名称
  60.         request.setCharacterEncoding("UTF-8");
  61.         String videoName = request.getParameter("nameOfVideo");
  62.         //视频的路径
  63.         String videoFilePath = request.getParameter("contentOfVideo");      
  64.         System.out.println(videoName + "---" + videoFilePath);  
  65.         
  66.         /*
  67.          * 以下是用的JSPSMART来进行上传的应用
  68.          * 因为技术已经比较成熟了,所以就直接使用了
  69.          * 可以从 www.jspsmart.com直接进行下载
  70.          */
  71.         SmartUpload mySmartUpload = new SmartUpload();
  72.         int count = 0;
  73.         try {
  74.             // Initialization
  75.    //初始休的方法必须先执行            
  76.             mySmartUpload.initialize(config,request,response);
  77.             // Upload
  78.             mySmartUpload.upload();
  79.             // Save the file with the original name
  80.             // in a virtual path of the web server
  81.             //count = mySmartUpload.save(mySmartUpload.getRequest().getParameter("PATH"));
  82.             count = mySmartUpload.save("D://");//save的参数就是要进行保存的路径,因为我也是刚刚的测试就随便写了一下,后面我会把我最终的给大家贴上来,count是指所有的上传的数目,因为有可能是批次的提交,进行提交的<input type = "file">的名称就不会显示的体现
  83.             
  84.             // Display the result
  85.             System.out.println(count + " file uploaded.");
  86.         } catch (Exception e){
  87.             System.out.println("Unable to upload the file.<br>");
  88.             System.out.println("Error : " + e.toString());
  89.         }   
  90.                 
  91.     }
  92. }

         经过上面的方法就可以初始的实现一个文件远程上传的服务器,可以看到不用怎么写几行代码就可以搞定,真是方便,但是我发现上传之后会有一个问题,就是文件如果是中文名称的话是一个乱码,但文件的内容没有问题,这个组件包我也是刚刚在使用,我会把最后修改后的代码发上来,和大家分享。

 

-----------------------------------一些更新

        因为文件上传到JSPSMART,它得到中文名称是乱码,我最后的想法是,能过在提交的时候先利用AJAX把要提交的文件的名称以及路径提交到一个SERVLET,然后把名称和路径存入到SESSION中,最后再跳向JSPSMART中,这样子是可以的,在JSPSMART的servlet中不可以使用request.getParameter("....");,因为form提交的时候加了一个属性ENCTYPE="multipart/form-data",所以我就是拿AJAX来动态的先提交再进行.

        代码如下,其中只是一些JS进行提交信息到SERVLET的:

    

  1. <!-- AJAX动态验证 admin-->
  2.             var xmlHttp;
  3.             //关闭窗体用的..
  4.             function closeWindow(){
  5.                 window.close();
  6.             }
  7.             function createXMLHttpRequest(){
  8.                 if(window.ActiveXObject){
  9.                     xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
  10.                 }else if(window.XMLHttpRequest){
  11.                     xmlHttp = new XMLHttpRequest();
  12.                 }
  13.             }
  14.             
  15.             function startRequest(){
  16.                 createXMLHttpRequest();
  17.                 xmlHttp.onreadystatechange = handleStateChange; 
  18.                 
  19.                 //在那个FORM中是不可以这个样子的写的,得不到,因为FORM加了一个属性,应该再写一个FORM
  20.                 
  21.                 document.getElementById("name").value = document.getElementById("nameVideo").value;
  22.                 //这两个是隐藏的标签,用来提交到AJAX中使用的
  23.                 document.getElementById("path").value = document.getElementById("pathVideo").value;
  24.                                                         
  25.                 url = "./servlet/AddNewVideoServlet?name="+document.getElementById("name").value+"&path="+document.getElementById("path").value;
  26.                 //alert(url);
  27.                 <!--那个等号中间是不可以有空格的... -->
  28.                 xmlHttp.open("get",url,true);
  29.                 xmlHttp.send(null);
  30.             }
  31.             function handleStateChange(){
  32.                 if(xmlHttp.readyState == 4)
  33.                     if(xmlHttp.status == 200){                      
  34.                         var resText = xmlHttp.responseText;
  35.                         
  36.                         //成功的情况succ,失败的情况fail
  37.                         if( resText == "succ" ){
  38.                             //成功情况,再做其他的操作
  39.                             checkContent();                         
  40.                         }else if( resText == "fail" ){
  41.                             alert("上传失败!");
  42.                             return false;
  43.                         }else{
  44.                             alert("内部异常!");
  45.                             return false;
  46.                         }                                               
  47.                     }
  48.             
  49.             }

基本上就是这些就可以提交一些小文件了,如果有什么不清楚的,我们可以一起讨论

㈠ File类   这个类装了一个上传文件的所有信息。通过它,可以得到上传文件文件名、文件大小、扩展名、文件数据等信息。   File类主要提供以下方法: 1、saveAs作用:将文件换名另存。 原型: public void saveAs(java.lang.String destFilePathName) 或 public void saveAs(java.lang.String destFilePathName, int optionSaveAs) 其中,destFilePathName是另存的文件名,optionSaveAs是另存的选项,该选项有三个值,分别是SAVEAS_PHYSICAL, SAVEAS_VIRTUAL,SAVEAS_AUTO。SAVEAS_PHYSICAL表明以操作系统的根目录为文件根目录另存文件, SAVEAS_VIRTUAL表明以Web应用程序的根目录为文件根目录另存文件,SAVEAS_AUTO则表示让组件决定,当Web应用程序的根目录存在另存文件的目录时,它会选择SAVEAS_VIRTUAL,否则会选择SAVEAS_PHYSICAL。 例如,saveAs ("/upload/sample.zip",SAVEAS_PHYSICAL)执行后若Web服务器安装在C盘,则另存的文件名实际是c:\ upload\sample.zip。而saveAs("/upload/sample.zip",SAVEAS_VIRTUAL)执行后若Web应用程序的根目录是webapps/jspsmartupload,则另存的文件名实际是 webapps/jspsmartupload/upload/sample.zip。saveAs("/upload/sample.zip", SAVEAS_AUTO)执行时若Web应用程序根目录下存在upload目录,则其效果同saveAs("/upload/sample.zip", SAVEAS_VIRTUAL),否则同saveAs("/upload/sample.zip",SAVEAS_PHYSICAL)。 建议:对于Web程序的开发来说,最好使用SAVEAS_VIRTUAL,以便移植。 2、isMissing 作用:这个方法用于判断用户是否选择了文件,也即对应的表单项是否有值。选择了文件时,它返回false。未选文件时,它返回true。 原型:public boolean isMissing() 3、getFieldName 作用:取HTML表单中对应于此上传文件的表单项的名字。 原型:public String getFieldName() 4、getFileName 作用:取文件名(不含目录信息) 原型:public String getFileName() 5、getFilePathName 作用:取文件全名(带目录) 原型:public String getFilePathName 6、getFileExt 作用:取文件扩展名(后缀) 原型:public String getFileExt() 7、getSize 作用:取文件长度(以字节计) 原型:public int getSize() 8、getBinaryData 作用:取文件数据中指定位移处的一个字节,用于检测文件等处理。 原型:public byte getBinaryData(int index)。其中,index表示位移,其值在0到getSize()-1之间。 ㈡ Files类   这个类表示所有上传文件的集合,通过它可以得到上传文件的数目、大小等信息。有以下方法: 1、getCount 作用:取得上传文件的数目。 原型:public int getCount() 2、getFile 作用:取得指定位移处的文件对象File(这是com.jspsmart.upload.File,不是java.io.File,注意区分)。 原型:public File getFile(int index)。其中,index为指定位移,其值在0到getCount()-1之间。 3、getSize 作用:取得上传文件的总长度,可用于限制一次性上传的数据量大小。 原型:public long getSize() 4、getCollection 作用:将所有上传文件对象以Collection的形式返回,以便其它应用程序引用,浏览上传文件信息。 原型:public Collection getCollection() 5、getEnumeration 作用:将所有上传文件对象以Enumeration(枚举)的形式返回,以便其它应用程序浏览上传文件信息。 原型:public Enumeration getEnumeration() ㈢ Request类   这个类的功能等同于JSP内置的对象request。只所以提供这个类,是因为对于文件上传表单,通过request对象无法获得表单项的值,必须通过jspSmartUpload组件提供的Request对象来获取。该类提供如下方法: 1、getParameter 作用:获取指定参数之值。当参数不存在时,返回值为null。 原型:public String getParameter(String name)。其中,name为参数的名字。 2、getParameterValues 作用:当一个参数可以有多个值时,用此方法来取其值。它返回的是一个字符串数组。当参数不存在时,返回值为null。 原型:public String[] getParameterValues(String name)。其中,name为参数的名字。 3、getParameterNames 作用:取得Request对象中所有参数的名字,用于遍历所有参数。它返回的是一个枚举型的对象。 原型:public Enumeration getParameterNames() ㈣ SmartUpload类这个类完成上传下载工作。 A.上传与下载共用的方法: 只有一个:initialize。 作用:执行上传下载的初始化工作,必须第一个执行。 原型:有多个,主要使用下面这个: public final void initialize(javax.servlet.jsp.PageContext pageContext) 其中,pageContext为JSP页面内置对象(页面上下文)。 B.上传文件使用的方法: 1、upload 作用:上传文件数据。对于上传操作,第一步执行initialize方法,第二步就要执行这个方法。 原型:public void upload() 2、save 作用:将全部上传文件保存到指定目录下,并返回保存的文件个数。 原型:public int save(String destPathName) 和public int save(String destPathName,int option) 其中,destPathName为文件保存目录,option为保存选项,它有三个值,分别是SAVE_PHYSICAL,SAVE_VIRTUAL和 SAVE_AUTO。(同File类的saveAs方法的选项之值类似)SAVE_PHYSICAL指示组件将文件保存到以操作系统根目录为文件根目录的目录下,SAVE_VIRTUAL指示组件将文件保存到以Web应用程序根目录为文件根目录的目录下,而SAVE_AUTO则表示由组件自动选择。 注:save(destPathName)作用等同于save(destPathName,SAVE_AUTO)。 3、getSize 作用:取上传文件数据的总长度 原型:public int getSize() 4、getFiles 作用:取全部上传文件,以Files对象形式返回,可以利用Files类的操作方法来获得上传文件的数目等信息。 原型:public Files getFiles() 5、getRequest 作用:取得Request对象,以便由此对象获得上传表单参数之值。 原型:public Request getRequest() 6、setAllowedFilesList 作用:设定允许上传带有指定扩展名的文件,当上传过程中有文件名不允许时,组件将抛出异常。 原型:public void setAllowedFilesList(String allowedFilesList) 其中,allowedFilesList为允许上传文件扩展名列表,各个扩展名之间以逗号分隔。如果想允许上传那些没有扩展名的文件,可以用两个逗号表示。例如:setAllowedFilesList("doc,txt,,")将允许上传带doc和txt扩展名的文件以及没有扩展名的文件。 7、setDeniedFilesList 作用:用于限制上传那些带有指定扩展名的文件。若有文件扩展名被限制,则上传时组件将抛出异常。 原型:public void setDeniedFilesList(String deniedFilesList) 其中,deniedFilesList为禁止上传文件扩展名列表,各个扩展名之间以逗号分隔。如果想禁止上传那些没有扩展名的文件,可以用两个逗号来表示。例如:setDeniedFilesList("exe,bat,,")将禁止上传带exe和bat扩展名的文件以及没有扩展名的文件。 8、setMaxFileSize 作用:设定每个文件允许上传的最大长度。 原型:public void setMaxFileSize(long maxFileSize) 其中,maxFileSize为为每个文件允许上传的最大长度,当文件超出此长度时,将不被上传。 9、setTotalMaxFileSize 作用:设定允许上传文件的总长度,用于限制一次性上传的数据量大小。 原型:public void setTotalMaxFileSize(long totalMaxFileSize) 其中,totalMaxFileSize为允许上传文件的总长度。 C.下载文件常用的方法 1、setContentDisposition 作用:将数据追加到MIME文件头的CONTENT-DISPOSITION域。jspSmartUpload组件会在返回下载的信息时自动填写MIME文件头的CONTENT-DISPOSITION域,如果用户需要添加额外信息,请用此方法。 原型:public void setContentDisposition(String contentDisposition) 其中,contentDisposition为要添加的数据。如果contentDisposition为null,则组件将自动添加 "attachment;",以表明将下载的文件作为附件,结果是IE浏览器将会提示另存文件,而不是自动打开这个文件(IE浏览器一般根据下载的文件扩展名决定执行什么操作,扩展名为doc的将用word程序打开,扩展名为pdf的将用acrobat程序打开,等等)。 2、downloadFile 作用:下载文件。 原型:共有以下三个原型可用,第一个最常用,后两个用于特殊情况下的文件下载(如更改内容类型,更改另存的文件名)。 ① public void downloadFile(String sourceFilePathName) 其中,sourceFilePathName为要下载的文件名(带目录的文件全名) ② public void downloadFile(String sourceFilePathName,String contentType) 其中,sourceFilePathName为要下载的文件名(带目录的文件全名),contentType为内容类型(MIME格式的文件类型信息,可被浏览器识别)。 ③ public void downloadFile(String sourceFilePathName,String contentType,String destFileName) 其中,sourceFilePathName为要下载的文件名(带目录的文件全名),contentType为内容类型(MIME格式的文件类型信息,可被浏览器识别),destFileName为下载后默认的另存文件名。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值