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


  本人正在做一个要求首页发布视频的功能,所以要用到远程的文件上传,这里自然上传的是视频文件,包括几种常见的视频文件,如 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.             }

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

你可能感兴趣的:(tomcat,jsp,servlet,Path,web服务,stylesheet)