文档章节

java struts2 多文件上传 加进度条

smallyer
 smallyer
发布于 2014/06/19 15:38
字数 1088
阅读 145
收藏 0
点赞 0
评论 0

1、struts.xml文件配置

<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">    
<struts>
	<constant name="struts.multipart.maxSize" value="61440000000"></constant>
	<constant name="struts.i18n.reload" value="true" />
	<constant name="struts.action.extension" value="html" /> 
	<package name="imgfile" extends="struts-default" namespace="/imgfile">
	    <global-results>
			<result name="notFound">/error/404.jsp</result>
		</global-results>
		<action name="uploadfilesUpload" class="cn.test.ProgressAction" method="filesUpload"></action>
		<action name="uploadgetUploadStatus" class="cn.test.ProgressAction" method="getUploadStatus"></action>
	</package>	 
</struts>

2、bean类,存储上传文件的序号,已上传大小等信息

package cn.test.bean;

import java.io.Serializable;

@SuppressWarnings("serial")
public class FileUploadStatus implements Serializable {

	private int fileIndex;//当前文件序号
	private float uploadFileSize;//当前已上传大小
	private int percent;//上传进度
	private float fileSize;//文件总大小
	
	public int getFileIndex() {
		return fileIndex;
	}
	public void setFileIndex(int fileIndex) {
		this.fileIndex = fileIndex;
	}
	public float getUploadFileSize() {
		return uploadFileSize;
	}
	public void setUploadFileSize(float uploadFileSize) {
		this.uploadFileSize = uploadFileSize;
	}
	public int getPercent() {
		return percent;
	}
	public void setPercent(int percent) {
		this.percent = percent;
	}
	public float getFileSize() {
		return fileSize;
	}
	public void setFileSize(float fileSize) {
		this.fileSize = fileSize;
	}
}

3、主要代码,action文件

package cn.test;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.Calendar;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;


import cn.test.bean.FileUploadStatus;

import com.opensymphony.xwork2.ActionSupport;

@SuppressWarnings("serial")
public class ProgressAction extends ActionSupport {

	private static final int IO_SIZE=10;//上传字符流的大小(单位:字节)
	private List<File> file;
	private List<String> fileFileName;
	private List<String> fileContentType;
	private float uploadFileSize=0;//已上传大小
	private float fileSize=0;//文件总大小
	private int percent=0;//进度百分比
	
	
	/**
	 * 文件上传
	 * @param src
	 * 			根文件
	 * @param dst
	 * 			目标文件
	 */
	public void uploadFile(File src, File dst, int i){
		System.out.println("进入");
		uploadFileSize=0;
		InputStream in=null;
		OutputStream out=null;
		FileUploadStatus status=new FileUploadStatus();
		HttpServletRequest request=ServletActionContext.getRequest();
		HttpSession session=request.getSession();
		try {
			in=new BufferedInputStream(new FileInputStream(src), IO_SIZE);
			out=new BufferedOutputStream(new FileOutputStream(dst), IO_SIZE);
			fileSize=in.available();
			if((fileSize/1024/1024)>2){
				return;
			}
			byte[] buffer=new byte[IO_SIZE];
			int len=0;
			while((len=in.read(buffer))>0){
				out.write(buffer, 0, len);
				uploadFileSize+=len;
				percent=(int) (uploadFileSize/fileSize*100);//上传百分比
				status.setFileIndex(i);
				status.setFileSize(fileSize);
				status.setUploadFileSize(uploadFileSize);
				status.setPercent(percent);
				System.out.println("fileIndex:"+status.getFileIndex()+"fileSize:"+fileSize+"percent:"+percent+"uploadFileSize:"+uploadFileSize);
				session.setAttribute("status", status);
			}
		}  catch (IOException e) {
			e.printStackTrace();
		}  finally  {
			if(null!=in){
				try {
					in.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if(null!=out){
				try {
					out.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	/**
	 * 上传文件
	 * @return
	 */
	public String filesUpload(){
		System.out.println("进入");
		try{
			String dstPath=ServletActionContext.getServletContext().getRealPath("/fileupload");
			Calendar cal=Calendar.getInstance();
			int year=cal.get(Calendar.YEAR);
			int month=cal.get(Calendar.MONTH)+1;
			int day=cal.get(Calendar.DAY_OF_MONTH);
			for(int i=0;i<fileFileName.size();i++){
				File src=file.get(i);
				File dst=new File(dstPath+"/"+year+"/"+month+"/"+day);
				if(!dst.exists()){
					dst.mkdirs();
				}
				dst=new File(dst,"\\"+fileFileName.get(i));
				uploadFile(src, dst, i);
			}
			return null;
		}catch (Exception e) {
			e.printStackTrace();
			return "error";
		}
	}
	
	/**
	 * ajax获取文件上传进度状态
	 * @return
	 */
	public String getUploadStatus(){
		System.out.println("ddddd");
		HttpServletRequest request=ServletActionContext.getRequest();
		HttpSession session=request.getSession();
		FileUploadStatus status=(FileUploadStatus) session.getAttribute("status");
		if(status!=null){
			try{
				HttpServletResponse response=ServletActionContext.getResponse();
				PrintWriter out=response.getWriter();
				out.print("{\"fileIndex\":"+status.getFileIndex()
						+",\"percent\":"+status.getPercent()
						+",\"uploadFileSize\":"+status.getUploadFileSize()
						+",\"fileSize\":"+status.getFileSize()+"}");
				System.out.println("{\"fileIndex\":"+status.getFileIndex()
						+",\"percent\":"+status.getPercent()
						+",\"uploadFileSize\":"+status.getUploadFileSize()
						+",\"fileSize\":"+status.getFileSize()+"}");
				out.close();
				session.removeAttribute("status");
				return null;
			}catch (Exception e) {
				e.printStackTrace();
				return "error";
			}
		}else{
			return null;
		}
		
	}

	public List<File> getFile() {
		return file;
	}

	public void setFile(List<File> file) {
		this.file = file;
	}

	public List<String> getFileFileName() {
		return fileFileName;
	}

	public void setFileFileName(List<String> fileFileName) {
		this.fileFileName = fileFileName;
	}

	public List<String> getFileContentType() {
		return fileContentType;
	}

	public void setFileContentType(List<String> fileContentType) {
		this.fileContentType = fileContentType;
	}
}

4、前台页面

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
	String path = request.getContextPath();
	String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
	request.setAttribute("bp",basePath);
%>
<%@taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    
    <title>My JSP 'test1.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" type="text/css" href="styles.css">
	-->

  </head>
  <script type="text/javascript" src="./jquery-1.7.1.js"></script> 
    <body>
        <div id="imgDivs">
        	
        </div>
        <div id="progressBarTips" style="height: 10px; width: 200px; text-align: center; font-size: 12px;"></div>
        <br />
        <span id="speed" style="font-size: 12px;"></span>
        <br />
        <form action="${bp}imgfile/uploadfilesUpload.html" method="post" enctype="multipart/form-data" target="upload-target">
        	<input type="file" name="file" onchange="perImg(this);" multiple="multiple" accept="image/*"/>
        	<button type="submit" value="上传" id="sub" onclick="return showProgress();">上传</button>
        </form>
                     日志:<br/>
        <span id="tipsText" style="color: red; font-size: 12px;"></span>
        <iframe frameborder="0" style="height: 0px; width: 0px;" id="upload-target" name="upload-target"></iframe>
    </body>
</html>

5、超出字数限制,js在这,判断图片类型和大小

<script type="text/javascript">  
 	var imgSum=0;//图片总数
 	var finished=false;//是否长传完成
	var nextUploadFileSize=0;//上一次已上传文件大小
	var nowUploadFileSize=0;//当前上传文件大小
	var fileIndex=0;//图片序号
	function perImg(obj) {  
	    var filepath = ""; //文件路径    
	    var agent = window.navigator.userAgent;  
	    var isIE7 = agent.indexOf('MSIE 7.0') != -1;  
	    var isIE8 = agent.indexOf('MSIE 8.0') != -1;  
	    if (!obj.value.match(/.jpg|.gif|.png|.bmp|.jpeg/i)) {
	        alert('图片格式无效!');
	        return;
	    }
        var fileList=obj.files;
        alert(fileList.length);
        if(fileList.length>6){
            alert("一次最多只能上传6张图片!");
        }else{
        	imgSum=fileList.length;
        	for(var i=0;i<fileList.length;i++){
                alert(fileList[i].size);
                alert(obj.value);
                var file_names=obj.value.replace(/[ ]/g,"").split(",");
                var file_size=fileList[i].size;
                if(((file_size/1024)/1024)<=2){
                    var img_div=$("<div/>");
                	var img_obj=$("<img style='width: 80px; height: 85px; border: 0px;'/>");
                    $(img_obj).attr("src",window.URL.createObjectURL(fileList[i]));
                    $(img_div).append(img_obj);
                    var img_progress=$("<div id='img_progress_"+i+"' style='background-color: red; height: 10px; width: 0px;'></div>")
                    var img_upload_tip=$("<div id='img_upload_tip_"+i+"' style='height: 10px; width: 100px; text-align: center; font-size: 12px;'></div>");
                    $("#imgDivs").append(img_div);
                    $("#imgDivs").append(img_upload_tip);
                    $("#imgDivs").append(img_progress);
                }else{
                    alert("图片"+file_names[i]+"大于2M");
                }
            }
        }
	}
    </script>

5、监听进度js字数超了,接下一篇



© 著作权归作者所有

共有 人打赏支持
smallyer
粉丝 0
博文 2
码字总数 1365
作品 0
郑州
程序员
Struts2上传文件学习笔记

问题一:中文乱码 在使用Struts2实现文件上传时,若上传文件名为中文,则会在项目的发布目录中看上传文件名显示为乱码。解决办法很简单: 在struts.xml配置文件中配置: <constant name="st...

键盘小生
2012/06/10
0
1
为Struts2 应用程序创建进度条(等待页面)

对于一些需要较长时间才能完成的任务,在Web开发中,会由HTTP协议会因为超时而断开而面临许多风险,这是在桌面开发不曾遇到的。Struts 2提供的execAndWait拦截器就是为了处理和应付这种情况而...

Java编程思想
2014/01/04
0
0
struts2 上传文件添加进度条

为了给用户更好体验,最进在struts2添加了上传进度条让用户知道上传过程时间,增加有好度。 由于以前做个 文件上传 没有用过 组件进行解析,直接用servlet 解析的,而现在 struts2 框架使用 ...

hlevel
2013/08/14
0
6
7款基于JavaScript和AJAX的文件上传插件

本文整理了7款基于JavaScript和AJAX的文件上传插件,这些插件基本上都能实现以下功能: 多文件上传 拖拽操作 实时上传进度 自定义上传限制 希望能为你的开发工作带来帮助。 1. jQuery File U...

EDIAGD
2013/09/23
0
0
Struts2.3.4.1最简单例子

一、找到开发Struts2应用需要使用到的jar文件: asm-x.x.jar:官方说要加,但我不加也行 asm-commons-x.x.jar:官方说要加,但我不加也行 asm-tree-x.x.jar:官方说要加,但我不加也行 Stru...

VincentJiang
2013/03/30
0
2
CKEditor和CKFinder整合实现上传下载功能

事先说明:此整合的是java版本的, 用到的有:jsp + ckeditor + ckfinder (没有servlet 及其它框架技术) 一.需要的资源: 用到的网站,文件自己下载: a) ckeditor_3.6.2 (解压) download...

jxlgzwh
2013/03/06
0
0
Linux系统梳理---系统搭建(一):jdk卸载与安装

1.去官网下载符合Linux版本的jdk,暂用jdk-8u171-linux-x64.rpm 2.登陆Linux,进入usr目录,创建java目录(方便管理,可以其他位置):mkdir java 3.上传下载的jdk包至Linux服务器,使用rz指令(sz f...

勤奋的蚂蚁
07/16
0
0
Ubuntu 下搭建 Android 开发环境

一、首先准备好必须的安装文件。 1.Eclipse 3.6.2 ,下载页面:http://www.eclipse.org/downloads/download.php?file=/eclipse/downloads/drops/R-3.6.2-201102101200/eclipse-SDK-3.6.2-li......

Jian-Yong
2012/01/19
0
1
PHP监控后台程序 生成进度条

// 这里的页面采用ajax轮询的方式 php获取java生成进度条文件。 //后台处理采用java 生成进度条文件。 后台监控如下: 启用了3个线程 几乎把服务器给榨干了。 [root@localhost wcms]# ps -e...

大灰狼wow
2014/04/10
0
0
Android应用自动更新功能实现使用AsyncTask!

我所开发应用不是面向大众的应用,所以无法放到应用市场去让大家下载,然后通过应用市场更新.所以我必要做一个应用自动更新功能.但是不难,Thanks to下面这篇博客: Android应用自动更新功能的实...

李海珍
2012/05/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JPA @MappedSuperclass 注解说明

基于代码复用和模型分离的思想,在项目开发中使用JPA的@MappedSuperclass注解将实体类的多个属性分别封装到不同的非实体类中。 1.@MappedSuperclass注解只能标准在类上:@Target({java.lang....

海博1600
9分钟前
0
0
Scala Configuration 相关API

Play使用了 Typesafe config library,但是也提供了一个有着更多Scala高级特性的的 Configuration 封装。不熟悉Typesafe配置的开发者可以移步 configuration文件的语法和特性文档。 读取配置...

Landas
今天
1
0
使用cookie技术 记住账号

1. 效果 2. 实现过程 2.1 前端 将用户的选中传递给后台 这个参数的获取是 参考:https://my.oschina.net/springMVCAndspring/blog/1860498 // var rememberLogin = $("#rememberLoginId").i...

Lucky_Me
今天
1
0
《趣谈网络协议》02之网络分层的真实含义

一、提出问题 1.提出问题 当你听到什么二层设备、三层设备、四层 LB 和七层 LB 中层的时候,是否有点一头雾水,不知道这些所谓的层,对应的各种协议具体要做什么“工作”? 2.这四个问题你弄...

aibinxiao
今天
2
0
Python3学习日志二 Python中的集合set和字典dict

1.集合set 定义一个集合set 我们可以看到定义集合set有两种不同的形式,如果要定义一个空的集合set不能用{}而是要用set();另外,集合是无序的,而且set中的元素是不可重复的,如果你定义了一...

Mr_bullshit
今天
0
0
adb 操作指令详解

ADB,即 Android Debug Bridge,它是 Android 开发/测试人员不可替代的强大工具,也是 Android 设备玩家的好玩具。 注:有部分命令的支持情况可能与 Android 系统版本及定制 ROM 的实现有关。...

孟飞阳
今天
0
0
nodejs安装以及环境配置(很好的node安装和配置文章,少走很多弯路)

一、安装环境 1、本机系统:Windows 10 Pro(64位) 2、Node.js:v6.9.2LTS(64位) 二、安装Node.js步骤 1、下载对应你系统的Node.js版本:https://nodejs.org/en/download/ 2、选安装目录进...

sprouting
今天
1
0
Redisson

了解了Redisson,发现使用挺简单的,接下来准备深入学习一下。 Redisson介绍 Redisson是架设于Redis基础之上的一个Java驻内存数据网格(In-Memory Data Grid) Redisson在基于NIO的Netty框架上...

to_ln
今天
0
0
python有哪些好玩的应用实现,用python爬虫做一个二维码生成器

python爬虫不止可以批量下载数据,还可以有很多有趣的应用,之前也发过很多,比如天气预报实时查询、cmd版的实时翻译、快速浏览论坛热门帖等等,这些都可以算是爬虫的另一个应用方向! 今天给...

python玩家
今天
0
0
python爬虫日志(3)-爬去异步加载网页

在浏览器检查元素页面中,选取Network中的XHR选项即可观察每次加载页面,网页发出的请求,观察url的规律即可利用封装的函数对每一页进行爬取。

茫羽行
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部