文档章节

java struts2 多文件上传 加进度条

smallyer
 smallyer
发布于 2014/06/19 15:38
字数 1088
阅读 145
收藏 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
JAVA WEB项目文件上传下载求思路,求指教

1.使用的框架是springmvc + mybatics 2.问题点在于使用java上传文件时如何把进度传给前端制作出一个进度条。 3.目前本人使用七牛云java sdk连接了七牛云,并且能够成功上传文件。但是不知如何...

蛋炒饭加冰块
2017/12/15
179
5
为Struts2 应用程序创建进度条(等待页面)

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

Java编程思想
2014/01/04
0
0
JAVA WEB项目文件上传下载功能模块求思路

1.使用的框架是springmvc + mybatics 2.问题点在于使用java上传文件时如何把进度传给前端制作出一个进度条。 3.目前本人使用七牛云java sdk连接了七牛云,并且能够成功上传文件。但是不知如何...

蛋炒饭加冰块
2017/12/15
460
0
Java程序员从笨鸟到菜鸟全部博客目录【2012年十一月七日更新】

本文来自:曹胜欢博客专栏。转载请注明出处:http://blog.csdn.net/csh624366188 大学上了一年半,接触java也一年半了,虽然中间也有其他东西的学习,但是还是以java为主路线,想想这一年半,...

长平狐
2012/11/12
103
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周一乱弹 —— 白掌柜说了卖货不卖身

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @爱漫爱 :这是一场修行分享羽肿的单曲《Moony》 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :开不开心? 开心呀, 我又不爱睡懒觉…...

小小编辑
今天
8
0
大数据教程(11.7)hadoop2.9.1平台上仓库工具hive1.2.2搭建

上一篇文章介绍了hive2.3.4的搭建,然而这个版本已经不能稳定的支持mapreduce程序。本篇博主将分享hive1.2.2工具搭建全过程。先说明:本节就直接在上一节的hadoop环境中搭建了! 一、下载apa...

em_aaron
今天
3
0
开始看《JSP&Servlet学习笔记》

1:WEB应用简介。其中1.2.1对Web容器的工作流程写得不错 2:编写Servlet。搞清楚了Java的Web目录结构,以及Web.xml的一些配置作用。特别是讲了@WebServlet标签 3:请求与响应。更细致的讲了从...

max佩恩
今天
4
0
mysql分区功能详细介绍,以及实例

一,什么是数据库分区 前段时间写过一篇关于mysql分表的的文章,下面来说一下什么是数据库分区,以mysql为例。mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面(可...

吴伟祥
今天
3
0
SQL语句查询

1.1 排序 通过order by语句,可以将查询出的结果进行排序。放置在select语句的最后。 格式: SELECT * FROM 表名 ORDER BY 排序字段ASC|DESC; ASC 升序 (默认) DESC 降序 1.查询所有商品信息,...

stars永恒
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部