本人正在做一个要求首页发布视频的功能,所以要用到远程的文件上传,这里自然上传的是视频文件,包括几种常见的视频文件,如 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,内容如下:
- <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
- <%
- String path = request.getContextPath();
- String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
- %>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <base href="<%=basePath%>">
- <title>发布新的首页视频</title>
- <meta http-equiv="pragma" content="no-cache">
- <meta http-equiv="cache-control" content="no-cache">
- <meta http-equiv="expires" content="0">
- <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
- <meta http-equiv="description" content="This is my page">
- <!--
- <link rel="stylesheet" type="text/css" href="styles.css">
- -->
- </head>
- <script type="text/javascript">
- //进行验证输入的内容是否合法
- function checkContent(){
- var name = document.formName.nameOfVideo.value;
- var content = document.formName.contentOfVideo.value;
- var alarm = "";
- if( name == ""){
- alarm +="视频名称为空!";
- }
- if( content == ""){
- alarm += " " + "路径为空!";
- }else{
- //进行判断文件的类型,视频的文件类型一般为几种
- //常见的有 WMV AVI RM MPG RMVB
- var fileNameCons = content.split("//");
- var fileNameLast = fileNameCons[fileNameCons.length-1];
- var fileType = fileNameLast.split(".");
- var type = fileType[fileType.length - 1].toLowerCase();
- var typeSet = new Array("wmv","avi","rm","mpg","rmvb");
- var symbol = 1;
- for( var i = 0; i < typeSet.length; i ++ ){
- //alert(typeSet[i] + " " + type );
- if(typeSet[i] == type){
- //alert("--------");
- symbol = 0;
- break;
- }
- }
- if( symbol == 0 ){
- //ok
- }else{
- alarm += " " + "不合法的文件类型,必须是视频文件!";
- }
- }
- if( alarm != ""){
- alert(alarm);
- return false;
- }else{
- document.formName.submit();
- return true;
- }
- }
- </script>
- <body>
- <table width = "1000px" align = "center">
- <tr align = 'center'>
- <td><jsp:include flush="true" page="../menu.jsp"></jsp:include></td>
- <td align = 'center' height = "100%">
- <div style = "border-width:1px;border-style:dashed;border-color:#cccccc;width:100%;height:100%;">
- <table width = "100%" align = "center"><tr align = "left" bgcolor="#BEE1FF"><td colspan = '2'>位置:发布管理->首页视频发布</td></tr></table>
- <table align = "center">
- <tr><td>
- <form name = 'formName' action = "./servlet/AddNewVideoServlet" method = "post" ENCTYPE="multipart/form-data">
- <table align = "center" style = "margin-top:100px;" style = "border-width:1px;border-style:dashed;border-color:#cccccc;">
- <tr><td>视频名称:</td><td><input type = 'text' name = 'nameOfVideo' size = "32"></td></tr>
- <tr><td>路径:</td><td><input type = "file" name = "contentOfVideo"></td></tr>
- <tr align = "center"><td colspan = '2'><input type = "submit" value = "提交" onclick = "checkContent();return false;"><input type = 'reset' value = "清空重写"></td></tr>
- </table>
- </form>
- </td></tr>
- </table>
- </div>
- </td>
- </tr>
- </table>
- </body>
- </html>
上面的checkContent()方法是用来进行验证表单的,主要是验证表单的非空以及提交的文件是否是视频文件,本人现在找到的方法来判断视频文件,就是用他的后缀表来进行判断的,不知道是不是会有更加好的办法,总感觉用后缀名来进行判断总是不好,万一用户把文件后缀随便一改不就挂了,呵呵。而且注意FORM后面要加上这个属性ENCTYPE="multipart/form-data",<jsp:include flush="true" page="../menu.jsp"></jsp:include>是我做的东西的一个菜单表,对于这个来讲是没有什么别的用处。
然后提交到Servlet,在这里比如Servlet是AddNewVideoServlet,下面是它的内容:
- package com.yspace.dxf.releaseManageServlet;
- import java.io.IOException;
- import java.io.PrintWriter;
- import javax.servlet.ServletConfig;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import com.jspsmart.upload.SmartUpload;
- public class AddNewVideoServlet extends HttpServlet {
- private ServletConfig config;
- /**
- * Init the servlet
- */
- final public void init(ServletConfig config) throws ServletException {
- this.config = config;
- }
- /**
- * The doGet method of the servlet. <br>
- *
- * This method is called when a form has its tag value method equals to get.
- *
- * @param request the request send by the client to the server
- * @param response the response send by the server to the client
- * @throws ServletException if an error occurred
- * @throws IOException if an error occurred
- */
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- response.setContentType("text/html");
- PrintWriter out = response.getWriter();
- out
- .println("<!DOCTYPE HTML PUBLIC /"-//W3C//DTD HTML 4.01 Transitional//EN/">");
- out.println("<HTML>");
- out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
- out.println(" <BODY>");
- out.print(" This is ");
- out.print(this.getClass());
- out.println(", using the GET method");
- out.println(" </BODY>");
- out.println("</HTML>");
- out.flush();
- out.close();
- }
- /**
- * The doPost method of the servlet. <br>
- *
- * This method is called when a form has its tag value method equals to post.
- *
- * @param request the request send by the client to the server
- * @param response the response send by the server to the client
- * @throws ServletException if an error occurred
- * @throws IOException if an error occurred
- */
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- //这个是用来进行发布首页视频用的
- //视频的名称
- request.setCharacterEncoding("UTF-8");
- String videoName = request.getParameter("nameOfVideo");
- //视频的路径
- String videoFilePath = request.getParameter("contentOfVideo");
- System.out.println(videoName + "---" + videoFilePath);
- /*
- * 以下是用的JSPSMART来进行上传的应用
- * 因为技术已经比较成熟了,所以就直接使用了
- * 可以从 www.jspsmart.com直接进行下载
- */
- SmartUpload mySmartUpload = new SmartUpload();
- int count = 0;
- try {
- // Initialization
- //初始休的方法必须先执行
- mySmartUpload.initialize(config,request,response);
- // Upload
- mySmartUpload.upload();
- // Save the file with the original name
- // in a virtual path of the web server
- //count = mySmartUpload.save(mySmartUpload.getRequest().getParameter("PATH"));
- count = mySmartUpload.save("D://");//save的参数就是要进行保存的路径,因为我也是刚刚的测试就随便写了一下,后面我会把我最终的给大家贴上来,count是指所有的上传的数目,因为有可能是批次的提交,进行提交的<input type = "file">的名称就不会显示的体现
- // Display the result
- System.out.println(count + " file uploaded.");
- } catch (Exception e){
- System.out.println("Unable to upload the file.<br>");
- System.out.println("Error : " + e.toString());
- }
- }
- }
经过上面的方法就可以初始的实现一个文件远程上传的服务器,可以看到不用怎么写几行代码就可以搞定,真是方便,但是我发现上传之后会有一个问题,就是文件如果是中文名称的话是一个乱码,但文件的内容没有问题,这个组件包我也是刚刚在使用,我会把最后修改后的代码发上来,和大家分享。
-----------------------------------一些更新
因为文件上传到JSPSMART,它得到中文名称是乱码,我最后的想法是,能过在提交的时候先利用AJAX把要提交的文件的名称以及路径提交到一个SERVLET,然后把名称和路径存入到SESSION中,最后再跳向JSPSMART中,这样子是可以的,在JSPSMART的servlet中不可以使用request.getParameter("....");,因为form提交的时候加了一个属性ENCTYPE="multipart/form-data",所以我就是拿AJAX来动态的先提交再进行.
代码如下,其中只是一些JS进行提交信息到SERVLET的:
- <!-- AJAX动态验证 admin-->
- var xmlHttp;
- //关闭窗体用的..
- function closeWindow(){
- window.close();
- }
- function createXMLHttpRequest(){
- if(window.ActiveXObject){
- xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
- }else if(window.XMLHttpRequest){
- xmlHttp = new XMLHttpRequest();
- }
- }
- function startRequest(){
- createXMLHttpRequest();
- xmlHttp.onreadystatechange = handleStateChange;
- //在那个FORM中是不可以这个样子的写的,得不到,因为FORM加了一个属性,应该再写一个FORM
- document.getElementById("name").value = document.getElementById("nameVideo").value;
- //这两个是隐藏的标签,用来提交到AJAX中使用的
- document.getElementById("path").value = document.getElementById("pathVideo").value;
- url = "./servlet/AddNewVideoServlet?name="+document.getElementById("name").value+"&path="+document.getElementById("path").value;
- //alert(url);
- <!--那个等号中间是不可以有空格的... -->
- xmlHttp.open("get",url,true);
- xmlHttp.send(null);
- }
- function handleStateChange(){
- if(xmlHttp.readyState == 4)
- if(xmlHttp.status == 200){
- var resText = xmlHttp.responseText;
- //成功的情况succ,失败的情况fail
- if( resText == "succ" ){
- //成功情况,再做其他的操作
- checkContent();
- }else if( resText == "fail" ){
- alert("上传失败!");
- return false;
- }else{
- alert("内部异常!");
- return false;
- }
- }
- }
基本上就是这些就可以提交一些小文件了,如果有什么不清楚的,我们可以一起讨论