`

struts2读取文件,并处理文件保存到数据库并显示进度条

 
阅读更多
package ;

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.ArrayList;
import java.util.List;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.ServletActionContext;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.InterceptorRef;
import org.apache.struts2.convention.annotation.InterceptorRefs;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import com.googlecode.genericdao.search.Filter;
import com.googlecode.genericdao.search.Search;

/**
 * 上传客户并保持到数据库
 * @author 
 * 
 */
@Namespace("/customerexcelupload")  
@Action("")  
@InterceptorRefs(value = { @InterceptorRef("fileUploadStack") })  
@Results({ 
@Result(name = "success", location = "/jsp/customervisit/customer/importok.jsp"), 
@Result(name = "error", location = "/jsp/customervisit/customer/importfailed.jsp")
})  
public class CustomerExcelUpload extends GeoinfoAction {
    /**
     * 序列化
     */
	private static final long serialVersionUID = 572146812454l;
	/**
	 * 缓存
	 */
	private static final int BUFFER_SIZE = 16 * 1024;
	/**
	 * 文件
	 */
	private File upload;
	/**
	 * 类型
	 */
	private String contentType;
	/**
	 * 文件名
	 */
	private String fileName;
	/**
	 * 实际文件名
	 */
	private String storageFileName;
	/**
	 * 处理结果信息
	 */
	private String exceptionstr = "";
	
	/** geoinfoService业务操作对象 */
	@Resource(type = CustomerService.class)
	private CustomerService customerService;	

	/** geoinfoService业务操作对象 */
	@Resource(type = ClassifyService.class)
	private ClassifyService classifyService;		
 	
 	/**
 	 * 分类ID
 	 */
	private String classifyexcelId;
	
	/**
	 * 地物分类:客户1  店面2 竞品店3
	 */
	private String geoType;
	
	/**  负责人的ID  **/
	private String responseAccountId;
	
	/** 负责人的名字 **/
	private String responseName;
	
	/**
	 * 上传数据处理工具
	 */
	@Resource(name = "importDataHandler") 
	private ImportDataHandler importDataHandler;
	
	/**
	 * 用户登录信息
	 */
	@Resource(name = "accountAPI")
	private AccountAPI accountAPI; 	
	
	/**
     * 拷贝文件
     * @param src xx
     * @param dst xx
     */
	public void copy(File src, File dst) {
		try {
			InputStream in = null;
			OutputStream out = null;
			try {
				in = new BufferedInputStream(new FileInputStream(src),
						BUFFER_SIZE);
				out = new BufferedOutputStream(new FileOutputStream(dst),
						BUFFER_SIZE);
				byte[] buffer = new byte[BUFFER_SIZE];
				while (in.read(buffer) > 0) {
					out.write(buffer);
				}
			} finally {
				if (null != in) {
					in.close();
				}
				if (null != out) {
					out.close();
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
    
	
    /**
     * 上传文件并保存到数据库
     * @return xx
     */
	public String execute(){
		
		
	    HttpServletResponse response = ServletActionContext.getResponse();
	    ServletActionContext.getResponse().setHeader("content-type", "text/html");
	    PrintWriter out = null;
		try {
			out = response.getWriter();
		} catch (IOException e1) {
			e1.printStackTrace();
		}		
		
		//重置错误结果集
		List<ErrorObject> errorList  = new ArrayList<ErrorObject>();
		importDataHandler.setErrorList(errorList); 
		
		if("".equals(classifyexcelId)){
			exceptionstr = importDataHandler.CLASSIFYISNULL;
			writeJumpUrl(out,"no");
			return ERROR;			
		}
		
		if(upload == null){
			exceptionstr = importDataHandler.FILEISNULL;
			writeJumpUrl(out,"no");
			return ERROR;			
		}		
		
		storageFileName = fileName;
		if(fileName.endsWith("xls")||fileName.endsWith("csv")||fileName.endsWith("xlsx")){
			String s = File.separator;
			String uploadpath = ServletActionContext.getServletContext().getRealPath("/")+ "jsp"+s+"customervisit"+s+"excelupload"+s;
			File storageFile = new File(uploadpath+ storageFileName);
			copy(upload, storageFile); 
			
			
			Search search = new Search();
			search.addFilter(Filter.equal("classify.classifyId", classifyexcelId));
			List<ClassifyHoldProperty> list = classifyService.findPropertyMateBySearch(search, true);
			
			int result = count();
			
			try{
				
			    List<GeoinfoExcelModel> gxmlist = new ArrayList<GeoinfoExcelModel>();
			    
			    String currentAccountId = accountAPI.getAccountId();
			    String currentAccountName = accountAPI.getAccountName();
			    if(responseAccountId == null || "".equals(responseAccountId)){
			    	responseAccountId = currentAccountId;
			    }
			    if(responseName == null || "".equals(responseName)){
			    	responseName = currentAccountName;
			    }
			    
			    
			    //处理三种不同文件
			    if(fileName.endsWith("xls")){
			    	gxmlist = importDataHandler.loadXls(uploadpath+ storageFileName , list, classifyexcelId,geoType,responseAccountId,responseName);
				}else if(fileName.endsWith("xlsx")){
					gxmlist = importDataHandler.loadXlsx(uploadpath+ storageFileName , list, classifyexcelId,geoType,responseAccountId,responseName);
				}else if(fileName.endsWith("csv")){
					gxmlist = importDataHandler.superCsvRead(uploadpath+ storageFileName , list, classifyexcelId,geoType,responseAccountId,responseName);
				}
			    
			    int maxline = gxmlist.size();

			    if(maxline == 0){
			    	exceptionstr = importDataHandler.DATAISNULL;
			    	writeJumpUrl(out,"no");
					return ERROR;				    	
			    }			    
			    
				if(gxmlist.size()>0){

				    if(maxline > 1000){
				    	exceptionstr = importDataHandler.OVERMAXLINE;
				    	writeJumpUrl(out,"no");
						return ERROR;				    	
				    }

				    if((maxline+result) >10000){
				    	exceptionstr = importDataHandler.OVERMAXDATABASE;
				    	writeJumpUrl(out,"no");
						return ERROR;				    	
				    }

				    if(importDataHandler.getErrorList().size()>0){
				    	
				    	exceptionstr = "{";
				    	for(int i=0;i<importDataHandler.getErrorList().size();i++){
				    		ErrorObject eo = importDataHandler.getErrorList().get(i);
				    		exceptionstr = exceptionstr + "第" + eo.getLine() + "行第" +eo.getQueue() + "列; ";
				    	}
				    	exceptionstr += "}"+importDataHandler.ERRORINPUT;
				    	writeJumpUrl(out,"no");
				    	
				    	return ERROR;
				    }
				    

				    
				    prepaireHtml(out);

				    for(int i=0;i<gxmlist.size();i++){
						GeoinfoExcelModel gxm = gxmlist.get(i);
						Geoinfo geoinfo = importDataHandler.convertToGeoinfo(gxm);
						customerService.save(geoinfo);
						out.write("<script>genTo("+(Math.ceil((i) * 100/gxmlist.size()))+")</script>");
						out.flush();
						
						Thread.currentThread().sleep(100);
					}
				    out.write("<script>genTo('100')</script>");
				    out.flush();
				    
				    exceptionstr = gxmlist.size()+importDataHandler.HASIMPORT;
				    writeJumpUrl(out,"yes");
				    
				}					
				
			}catch(Exception e){
				e.printStackTrace();
				exceptionstr = importDataHandler.UNKNOWNERRORINPUT;
				writeJumpUrl(out,"no");
				
				return ERROR;				
			}
			
			return SUCCESS;			
		}else{
			exceptionstr = importDataHandler.FILETYPEISNOTGOOD;
			writeJumpUrl(out,"no");
			
			return ERROR;
		}
	}
	
	/**
	 * 写入html的进度条
	 * @param out xx
	 */
	private void prepaireHtml(PrintWriter out){
		String html = "<div id='wrap' style='position:relative; margin:30px auto; width:500px; height:20px; text-algin:center; border:1px solid #ccc; background-color:#fff;'>"+
				"<div style='position:absolute; background-color:#00FF33; width:1px; height:20px; z-index:1; left:0px; top:0px;' id='progres'></div>"+
				"<span id='percent' style='position:absolute; z-index:9;'>0%</span>"+"</div>";
		html+="<script>function $$(id){return document.getElementById(id);}</script>";
		html+="<script>function genTo(p){$$('percent').innerHTML=p+'%';$$('progres').style.width=parseInt($$('wrap').style.width)/100*p+'px';}</script>";
		out.write(html);
		out.flush();
	}
	/**
	 * 写入跳转链接
	 * @param out xx
	 * @param flag xx
	 */
	private void writeJumpUrl(PrintWriter out, String flag){
	    HttpServletRequest request = ServletActionContext.getRequest();
	    String contextPath = request.getContextPath();
		
		if("yes".equals(flag)){
			out.write("<script>window.parent.location.href='"+contextPath+"/stationlatlon/!importOk.action?exceptionstr="+exceptionstr+"'</script>");
			out.flush();
			out.close();
		}else if("no".equals(flag)){
			out.write("<script>");
			out.write("var url = '"+contextPath+"/stationlatlon/!importFail.action';");
			out.write("var postForm = document.createElement('form');");
			out.write("postForm.target='_parent';");
			out.write("postForm.method='post';");
			out.write("postForm.action = url;");
			out.write("var pam = document.createElement('input');");
			out.write("pam.setAttribute('name', 'exceptionstr') ;");
			out.write("pam.setAttribute('value', '"+exceptionstr+"');");
			out.write("postForm.appendChild(pam);");
			out.write("document.body.appendChild(postForm);");
			out.write("postForm.submit();");
			out.write("</script>");
			out.flush();
			out.close();
			
		}		
		
	}
	

	public String getExceptionstr() {
		return exceptionstr;
	}

	public void setExceptionstr(String exceptionstr) {
		this.exceptionstr = exceptionstr;
	}


	public File getUpload() {
		return upload;
	}

	public void setUpload(File upload) {
		this.upload = upload;
	}

	public String getFileName() {
		return fileName;
	}

	public void setFileName(String fileName) {
		this.fileName = fileName;
	}


	public String getUploadFileName() {
		return fileName;
	}

	public void setUploadFileName(String fileName) {
		this.fileName = fileName;
	}

	public String getStorageFileName() {
		return storageFileName;
	}

	public void setStorageFileName(String storageFileName) {
		this.storageFileName = storageFileName;
	}


	public String getUploadContentType() {
		return contentType;
	}

	public void setUploadContentType(String contentType) {
		this.contentType = contentType;
	}

	public String getContentType() {
		return contentType;
	}

	public void setContentType(String contentType) {
		this.contentType = contentType;
	}
	
    public CustomerService getCustomerService() {
		return customerService;
	}

	public void setCustomerService(CustomerService customerService) {
		this.customerService = customerService;
	}

	public String getClassifyexcelId() {
		return classifyexcelId;
	}


	public void setClassifyexcelId(String classifyexcelId) {
		this.classifyexcelId = classifyexcelId;
	}


	public ClassifyService getClassifyService() {
		return classifyService;
	}


	public void setClassifyService(ClassifyService classifyService) {
		this.classifyService = classifyService;
	}


	public ImportDataHandler getImportDataHandler() {
		return importDataHandler;
	}


	public void setImportDataHandler(ImportDataHandler importDataHandler) {
		this.importDataHandler = importDataHandler;
	}


	public String getGeoType() {
		return geoType;
	}


	public void setGeoType(String geoType) {
		this.geoType = geoType;
	}


	public String getResponseAccountId() {
		return responseAccountId;
	}


	public void setResponseAccountId(String responseAccountId) {
		this.responseAccountId = responseAccountId;
	}


	public String getResponseName() {
		return responseName;
	}


	public void setResponseName(String responseName) {
		this.responseName = responseName;
	}


	public AccountAPI getAccountAPI() {
		return accountAPI;
	}


	public void setAccountAPI(AccountAPI accountAPI) {
		this.accountAPI = accountAPI;
	}
	

	
}

 

 

			<form action="<%=contextPath %>/customerexcelupload/!execute.action" method="post" enctype="multipart/form-data" target="load"> 
			        <input type="hidden" value="" id="classifyexcelId" name="classifyexcelId"/>
			        <input type="hidden" value="1" name="geoType"/>
					<input id="responseAccountId" name="responseAccountId" type="hidden"/>
					<input id="responseName" name = "responseName" type="hidden"/>			        
			        <table>  
			            <tr>  
			                <td><input class="inpt" type="file" name="upload"></td>  
			                <td><input class="inpt" style="width:70px; height:25px;line-height:25px; margin-left:15px; cursor:pointer; "  type="submit" value="上   传"></td>  
			            </tr>  
			            <tr>  
			                
			            </tr>  
			        </table>  
			</form> 



<iframe  width="550px" height="85px"  framespacng="0" frameborder="0"   name="load" ></iframe>

 

 

特别注意:

这种一次请求,长时间不关闭响应的处理方式需要关闭nginx的缓存,
否则显示结果将以全部的请求结果一次性返回而看不到进度条效果。

proxy_buffering off; 

 

 

 

分享到:
评论

相关推荐

    struts2_uploadify带进度条的多文件上传下载

    1. Struts2的Action类:负责接收前端上传请求,处理文件保存,并可能返回一个JSON响应,包含上传进度信息。 2. JSP或HTML页面:使用Uploadify插件的JavaScript代码,展示上传界面和进度条,用户可以通过此界面选择...

    extjs3.2+struts2实现多文件上传excel并插入到数据库

    总的来说,"extjs3.2+struts2实现多文件上传excel并插入到数据库"项目结合了前端交互、后端处理和数据库操作,实现了一个完整的数据导入流程。开发者需要理解ExtJS的组件使用、Struts2的文件上传处理、Java对Excel...

    flex struts2文件上传

    在Action中,我们可以使用Servlet API的Part接口或Struts2的FileItem类来获取上传的文件,并进行后续处理,如保存到服务器的特定目录。 同名文件上传是一个特殊场景,通常需要在服务器端处理文件重命名或覆盖的问题...

    struts2结合ext3批量下载文件

    通过以上步骤,我们可以实现一个在Struts2框架下,利用Ext3创建前端交互界面,后端使用Apache POI处理Excel文件,TrueZip打包文件,提供批量下载服务的功能。这不仅可以提高用户的下载效率,还简化了后台处理大量...

    ajax 上传 下载 把excel 中的数据导入到数据库 struts

    本文将深入探讨如何使用AJAX技术、Java和Struts框架来实现一个功能,即通过AJAX实现Excel文件的上传,并将其中的数据导入到数据库中。 首先,我们需要了解AJAX(Asynchronous JavaScript and XML)的核心概念。它是...

    struts2无刷新上传图片

    一旦文件上传成功,可以将其保存到服务器的指定位置,或者存入数据库。 至于"无刷新"部分,通常我们会利用Ajax技术来实现。在客户端,使用JavaScript(例如jQuery库)监听文件输入元素的改变事件,当用户选择文件后...

    SSH3+Oracle数据库实现文件上传下载的项目

    - **文件上传**:用户通过表单提交包含文件的数据到服务器,Struts2框架接收到请求后,将文件保存到服务器的特定目录,并将相关信息(如文件名、大小等)存储到数据库中。 - **文件下载**:用户请求下载时,服务器...

    基于struts2及poi实现的导入功能

    3. **数据处理**:根据业务需求,可能需要对获取的数据进行验证、转换或计算,然后将这些数据保存到数据库或其他持久化存储中。 4. **异常处理**:在处理过程中,可能会遇到文件格式错误、数据格式不正确等问题,...

    Struts的文件下载

    此外,如果你希望优化用户体验,可以提供进度条显示文件下载状态,这通常涉及到AJAX和JavaScript的配合,以及服务器端的异步处理。 最后,源码和工具标签提示我们可以从代码实例和相关开发工具中学习更多。在阅读...

    struts2上传下载

    - **流处理**:服务器需要从存储位置读取文件内容,并通过输出流发送到客户端。 - **安全考虑**:确保只允许下载预期的文件,避免暴露敏感信息。 4. **源码分析** - `struts2_01_014_FileUp`可能是一个具体的...

    四、struts2+swfUpload例子二

    在Struts2 Action中,可以使用`FileItemFactory`和`FileItemStream`接口来读取并处理上传的文件。记得处理可能出现的异常,例如文件过大、文件类型错误等,并提供适当的反馈信息。 SwfUpload提供了丰富的事件回调,...

    用stsuts2实现文件的上传与下载

    Struts2是一个强大的MVC(Model-View-Controller)框架,广泛应用于Java Web开发中,提供了丰富的功能,包括处理...实际开发中,还需要根据项目需求进行定制化处理,如进度条显示、多文件上传、断点续传等高级功能。

    struts2,spring和hibernate集成实现图片上传下载的一个小示例

    在图片上传过程中,Struts2接收表单提交的文件数据,并将其传递给后台处理。 Spring框架则主要负责依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)。在本示例中,Spring...

    用struts和jdbc做的一个上传下载系统

    在UploadAction中,我们可能使用了Apache的Commons FileUpload库来解析请求中的多部分数据,将文件保存到服务器的指定位置,并将文件信息(如文件名、大小、类型等)存入数据库。 对于下载,DownloadAction会根据...

    struts做的文件的上传与下载

    `DownloadAction`类中,读取要下载的文件并将其流化: ```java public class DownloadAction extends ActionSupport { private String fileName; private InputStream fileInputStream; // getters and ...

    java文件上传与下载

    3. **后端处理**:Struts2 Action接收到上传请求后,会将文件保存到服务器指定的位置。通常,我们会自定义一个策略来决定文件的存储路径和命名规则,防止文件名冲突。 4. **文件下载**:为了提供文件下载功能,我们...

    Struts+Spring+Hibernate实现上传下载.doc

    Service层处理业务逻辑,例如验证文件类型、大小等,而DAO层则负责与数据库交互,保存或读取文件元数据。 Hibernate在持久层扮演重要角色,它简化了数据库操作。我们可以创建一个实体类来表示存储在数据库中的文件...

    JavaWeb项目SSH框架的文件上传下载

    在文件上传中,我们需要使用`struts2`的`fileUpload`拦截器,配置`struts.xml`以启用文件上传功能,并在Action类中处理上传的文件。 2. **Spring**:Spring框架负责依赖注入和事务管理。我们可以通过Spring的`@...

    Excel上传操作数据库

    以上就是关于“Excel上传操作数据库”的详细知识点,涵盖了从使用Apache POI处理Excel,到使用Struts2进行文件下载,再到与Oracle数据库的交互等多个层面的技术细节。在实际开发中,这些知识可以帮助构建一个高效、...

    文件中转站

    它可能封装了HTML5的File API,用于处理用户选择的文件,例如读取文件内容、显示预览、计算文件大小等,并且可能通过Ajax技术将文件数据发送到后端服务器。 在实现"文件中转站"的过程中,开发者可能考虑以下知识点...

Global site tag (gtag.js) - Google Analytics