软件编程
位置:首页>> 软件编程>> java编程>> Struts2 文件上传进度条的实现实例代码

Struts2 文件上传进度条的实现实例代码

作者:亭ting  发布时间:2023-04-20 11:13:59 

标签:struts,上传,进度条,文件

最近在写我们大三项目的一个视频文件上传的页面,实现后台对上传的进度进行监听,然后将监听的信息返回给前台页面。

前台的页面效果图:

Struts2 文件上传进度条的实现实例代码

前台进度条控件选择使用easyui 的progressbar控件。

详细的使用说明参考官网文档:http://www.jeasyui.com/documentation/index.php

所有需要引入jquery-1.11.1.min.js 以及jquery.easyui.min.js

一.前台的代码:


<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<%
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%>" rel="external nofollow" >
 <title>My JSP 'uploadVideo.jsp' starting page</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" href="demo.css" rel="external nofollow" />
 <link rel="stylesheet" href="easyui.css" rel="external nofollow" />
 <link rel="stylesheet" href="icon.css" rel="external nofollow" />
 <script type="text/javascript" src="jquery.min.js" ></script>
 <script type="text/javascript" src="jquery.easyui.min.js" ></script>
 <link rel="stylesheet" href="videoCss/upload.css" rel="external nofollow" />
 <script>
 $(function() {
   var pro=0;
   $("#save").click(function(){
     saveDate();
     setinterval=setInterval(showUploadProgress, 100);
   });
   function saveDate(){
   var form = new FormData(document.getElementById("form"));
     $.ajax({
       type:"POST",
       url:"uploadfile.action",
       data:form,
       async:false,
       cache:false,
       processData:false,
       contentType:false,
       success:function(result){
         var msg=result.msg;
         $(".msg").text(msg);
       },
       error:function(){
         alert("file异步提交失败");
       }
     });
   }

function showUploadProgress(){
     $.ajax({
       type:"GET",
       url:"uploadProgress.action",
       dataType:"json",
       async:false,
       cache:false,
       success:function(result){
         var progressInfo=result.progressInfo;
         pro=progressInfo.percent;
         if(pro==100){
           clearInterval(setinterval);
         }
         $('#progress').progressbar('setValue', progressInfo.percent);
         $('progress-bar-status').find(".speed").text(progressInfo.velocity);
         $('progress-bar-status').find(".finished").text("已上传:"+progressInfo.length+"/"+progressInfo.totalLength);
         $('progress-bar-status').find(".remain").text(progressInfo.timeLeft);
       },
       error:function(result){
          alert("error1");
       }
     });
   }

});
 </script>
</head>

<body>
   <div class="main_wrapper">
       <div class="head_wrapper">
         <div class="headinside">
           <ul>
             <li><a href="">主站</a></li>
             <li><a href="">视频栏</a></li>
             <li><a href="">资源区</a></li>
             <li><a href="">个人中心</a></li>
           </ul>
         </div>  
       </div><!--head_wrapper结束-->
       <div class="upload_box">
         <p id="error">
           <s:fielderror name="struts.messages.error.content.type.not.allowed"></s:fielderror>
           <s:actionerror/>
           <font color="red" class="msg">${msg }</font>
         </p>
          <div class="uploadInfo">
          <span class="title">
            当前上传:
            <span class="filename">文件名</span>
          </span>
          <div id="progress" class="easyui-progressbar" style="width:400px;"></div>
          <div class="progress-bar-status">
            <span class="speed" style="display: none;">当前上传的速度:80.23k/s</span>
            <span class="finished">已上传:10.86M/10.86M</span>
            <span class="remain" style="display:none">剩余时间:00秒</span>
          </div>
          <div class="videoInfo">
          <form method="post" enctype="multipart/form-data" id="form">
            <ul>
              <li>
                <div>
                  <label for="video1">文件上传</label>
                   <input type="file" id="btn_file" name="video"/>
                </div>
              </li>
              <li>

<label for="name">标题</label>
                  <input type="text" name="name" id="name" title="标题" placeholder="给你的视频七个标题名吧"/>

</li>
              <li>
                <div>
                  <label for="cate">分类</label>
                  <select class="cate" id="cate" name="cate">
                  <option value ="1">传统文学</option>
                  <option value ="2">民间手工艺</option>
                  <option value="3">节假日常</option>
                 </select>
               </div>
              </li>
              <li>
                <div>
                  <label for="tag">标签</label>
                  <input type="text" name="tag" id="tag" placeholder="请给您的视频添加相应的标签"/>
                </div>
              </li>
              <li>
                <div>
                  <label for="desc" id="label_desc">描述</label>
                  <textarea name="videoDesc" id="desc" placeholder="请添加相应的视频描述" >
                  </textarea>
                </div>
              </li>
              <input id="save" type="button" value="保存"/>
              <!-- <button id="save">保存</button> -->
            </ul>
          </form>
          </div>
       </div>
       </div>
   </div>
   <div style="width: 100%;">
        <div class="footer" style="width: 100%;">
          <div class="inner">
            <p class="a_menu">
              <a target="_blank" href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >关于我们</a>
              <i class="line">|</i>
              <a target="_blank" href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >联系合作</a>
              <i class="line">|</i>
              <a target="_blank" href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >帮助中心</a>
              <i class="line">|</i>
              <a target="_blank" href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >合伙人计划</a>
              <i class="line">|</i>
              <a target="_blank" href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >版权声明</a>
            </p>
            <p class="center">
              <span>江西师范大学瑶湖校区</span>
              <span>java工作室</span>
              <br>
              copyright&copy 大白
            </p>
          </div>
        </div>
      </div>
  </body>
</html>

二.点击上传后,如何获得文上传的进度信息。

1.自定义一个UploadListener类实现org.apache.commons.fileupload中的ProgressListener接口,从而获得当前上传的文件的已读取的数据长度,文件总长度,正在保存第几个文件;

2.重写一个MyMultiPartRequest类,覆盖org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest,改写parseRequest方法,在其中为上传添加 * ;

3.定义一个UploadStatus bean类存放上传的状态信息,并将获得上传进度信息的UploadStatus对象存在在Session域中;

4.编写UploadListenAction,获取Session域中的UploadStatus对象,进行相应的数据处理,然后将需要的数据放入Map中以json的形式返回给jsp;

5.编写UploadFile.action,实现文件的上传存储;

三.相对应的代码。


package video.action;

import org.apache.commons.fileupload.ProgressListener;

public class UploadListener implements ProgressListener {
 private UploadStatus status;

public UploadListener(UploadStatus status) {
   this.status = status;
 }

public void update(long bytesRead, long contentLength, int items) {
     // 上传组件会调用该方法
     status.setBytesRead(bytesRead); // 已读取的数据长度
     status.setContentLength(contentLength); // 文件总长度
     status.setItems(items); // 正在保存第几个文件

}

}

对于步骤2中MyMultiPartRequest修改后的方法代码。


protected List<FileItem> parseRequest(HttpServletRequest servletRequest, String saveDir) throws FileUploadException {
    UploadStatus status = new UploadStatus(); // 上传状态
    UploadListener listner = new UploadListener(status); // *
    servletRequest.getSession().setAttribute("uploadStatus", status);//将上传的进度状态存放进Session;

DiskFileItemFactory fac = createDiskFileItemFactory(saveDir);
    ServletFileUpload upload = createServletFileUpload(fac);

upload.setProgressListener(listner);// 添加 *
   return upload.parseRequest(createRequestContext(servletRequest));
 }

package video.action;

public class UploadStatus {
 private long bytesRead; // 已经上传的字节数,单位:字节
 private long contentLength; // 所有文件的总长度,单位:字节
 private int items; // 正在上传第几个文件
 private long startTime = System.currentTimeMillis(); // 开始上传的时间,用于计算上传速度等

public long getBytesRead() {
   return bytesRead;
 }

public void setBytesRead(long bytesRead) {
   this.bytesRead = bytesRead;
 }

public long getContentLength() {
   return contentLength;
 }

public void setContentLength(long contentLength) {
   this.contentLength = contentLength;
 }

public int getItems() {
   return items;
 }

public void setItems(int items) {
   this.items = items;
 }

public long getStartTime() {
   return startTime;
 }

public void setStartTime(long startTime) {
   this.startTime = startTime;
 }
}


package video.action;

import java.util.HashMap;
import java.util.Map;

import org.apache.struts2.interceptor.SessionAware;

import com.opensymphony.xwork2.ActionSupport;

public class UploadListenAction extends ActionSupport implements SessionAware{
 private UploadStatus status;
 Map<String,Object> session;
 Map<String,String> progressInfo=new HashMap<>();
 @Override
 public String execute() throws Exception {
   // TODO Auto-generated method stub
   status=(UploadStatus)session.get("uploadStatus");
   if(status!=null){
     long startTime = status.getStartTime(); //上传开始时间
     long currentTime = System.currentTimeMillis(); //现在时间
     long time = (currentTime - startTime)/ 1000 + 1; //已传输的时间 单位:s
     //传输速度单位:byte/s
     double velocity = ((double)status.getBytesRead()/1000) / (double)time;
    //估计总时间
     double totalTime = status.getContentLength()/velocity;
    //估计剩余时间
     double timeLeft = totalTime - time;
     //已经完成的百分比
     int percent = (int)(100 * (double)status.getBytesRead() / (double)status.getContentLength());
     //已经完成数单位:m
     double length = ((double) status.getBytesRead())/1024/1024;
     //总长度 单位:m
     double totalLength = ((double) status.getContentLength())/1024/1024;
     progressInfo.put("percent", String.valueOf(percent));
     progressInfo.put("velocity", String.valueOf(velocity));
     progressInfo.put("totalTime", String.valueOf(totalTime));
     progressInfo.put("timeLeft", String.valueOf(timeLeft));
     progressInfo.put("length", String.valueOf(length));
     progressInfo.put("totalLength", String.valueOf(totalLength));
   }

return super.execute();
 }
 @Override
 public void setSession(Map<String, Object> session) {
   // TODO Auto-generated method stub
   this.session=session;
 }
 public Map<String, String> getProgressInfo() {
   return progressInfo;
 }

/*public UploadStatus getStatus() {
   return status;
 }*/

}


package video.action;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;

import javax.servlet.ServletContext;

import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.SessionAware;

import video.dao.UploadDao;
import video.daoimpl.UploadDaoImpl;
import videomodel.VideoInfo;
import cn.history.pojo.User;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class UploadFile extends ActionSupport{
 private static final long serialVersionUID = 4182168930616232826L;
 private String name;  //标题名
 private File video;    
 private String videoFileName;
 private String videoContentType;
 private String videoDesc;  //描述
 private int cate;      //类型
 private String tag;      //标签
 /*private VideoInfo videoInfo=new VideoInfo();*/
 private String msg;

private UploadDao uploadDao=new UploadDaoImpl();
 public String upload() throws Exception{
   //完成上传
   ServletContext sc=ServletActionContext.getServletContext();
   String directory=sc.getRealPath("/video");//得到存放文件的真是目录
   //根据视频的不同类型,存放在不同的目录下
   if(cate==1){  //如果是传统文学
     directory=directory+"/guoxue";
   }else if(cate==2){
     directory=directory+"/minjian";
   }else{
     directory=directory+"/jiari";
   }
   SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMddHHmmssS");//格式化时间输出
   String Rname=null;
   if(name!=null&&!name.equals("")){
     Rname=name+"_"+sdf.format(new Date())+".mp4";
   }else{
     Rname=videoFileName;
   }
   System.out.println(Rname);
   //构建目标文件
   File target=new File(directory,Rname);
   FileUtils.copyFile(video, target);
   System.out.println(Rname+"\n"+videoFileName+"\n"+videoDesc+"\n"+videoContentType);
   //将成功上传的视频基本信息保存至数据库m
   String filePath=target.getPath();
   filePath=filePath.substring(filePath.indexOf("video")).replace("\\", "/");
   System.out.println(filePath);
   VideoInfo videoInfo=new VideoInfo();
   videoInfo.setVideoName(Rname);
   videoInfo.setVideoDesc(videoDesc);
   videoInfo.setVideoUrl(filePath);
   videoInfo.setCate(cate);
   videoInfo.setTag(tag);
   //ActionContext.getContext().getSession().get("name");
   if(ActionContext.getContext().getSession().get("user")!=null){
     User user=(User) ActionContext.getContext().getSession().get("user");
     videoInfo.setAuthorId(user.getUser_id());
   }else{
     //设置为管理员的id,默认是管理员上传的
     videoInfo.setAuthorId(1);
   }
   int tag=uploadDao.saveVideo(videoInfo);
   if(tag==0){
     msg="上传失败(存储数据库过程出错)";
     return INPUT;
   }else{
     msg="视频上传成功";
   }
   return SUCCESS;
 }

/*  public VideoInfo getVideoInfo() {
   return videoInfo;
 }

public void setVideoInfo(VideoInfo videoInfo) {
   this.videoInfo = videoInfo;
 }*/

/*public String getName() {
   return name;
 }*/

public void setName(String name) {
   this.name = name;
 }

//  public File getVideo() {
//    return video;
//  }

public void setVideo(File video) {
   System.out.println(video);
   this.video = video;
 }

//  public String getVideoDesc() {
//    return videoDesc;
//  }
 public void setVideoDesc(String videoDesc) {
   this.videoDesc = videoDesc;
 }

/*public int getCate() {
   return cate;
 }*/

public void setCate(int cate) {
   this.cate = cate;
 }

/*public String getTag() {
   return tag;
 }*/

public void setTag(String tag) {
   this.tag = tag;
 }

//  public String getVideoFileName() {
//    return videoFileName;
//  }

public void setVideoFileName(String videoFileName) {
   this.videoFileName = videoFileName;
 }

/*public String getVideoContentType() {
   return videoContentType;
 }*/

public void setVideoContentType(String videoContentType) {
   this.videoContentType = videoContentType;
 }
 public String getMsg() {
   return msg;
 }
 public void setMsg(String msg) {
   this.msg = msg;
 }
}

来源:http://www.cnblogs.com/ting1996/p/6807088.html

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com