struts2的上传和下载

Struts2上传下载(转)


====================================
文件上传的原理:

  表单元素的enctype属性指定的是表单数据的编码方式,该属性有3个值:

  1) application/x-www-form-urlencoded:这是默认编码方式,它只处理表单域里的value属性值,采用这种编码方式的表单会将表单域的值处理成URL编码方式。

  2) multipart/form-data:这种编码方式的表单会以二进制流的方式来处理表单数据,这种编码方式会把文件域指定文件的内容也封装到请求参数里。

  3) text/plain:这种方式主要适用于直接通过表单发送邮件的方式。

  文件上传是web应用经常用到的一个知识。原理是,通过为表单元素设置enctype=”multipart/form-data”属性,让表单提交的数据以二进制编码的方式提交,在接收此请求的Servlet中用二进制流来获取内容,就可以取得上传文件的内容,从而实现文件的上传。

  在Java领域中,有两个常用的文件上传项目:一个是Apache组织Jakarta的Common-FileUpload组件

(http://commons.apache.org/fileupload/),另一个是Oreilly组织的COS框架(http://www.servlets.com/cos/)。利用这两个框架都能很方便
的实现文件的上传。

====================================

Struts2上传文件
增加commons-fileupload-1.2.jar和commons-io-1.3.1.jar到lib

=====
jsp
=====
form 的 enctype 设置为 multipart/form-data

==============
UploadAction
==============


Java代码  
private String username;  
private String password;  
private File file; // 对应文件域  
private String fileFileName; // 前面的File属性的名字 + FileName(固定的)  
private String fileContent; // 前面的File属性的名字 + Content  
  
// setter... getter...  
  
String execute() throws Exception {  
  
    InputStream is = new FileInputStream(file);  
  
    String root = ServletActionContext.getRequest().getRealPath("/upload");  
  
    File destFile = new File(root, this.getFileFileName());  
  
    OutputStream os = new FileOutputStream(destFile);  
  
    byte[] buffer = new byte[400];  
  
    int length = 0;  
  
    while ((length = is.read(buffer)) > 0) {  
  
        os.write(buffer, 0, length);  
    }  
  
    is.close();  
    os.close();  
  
    return SUCCESS;  
}  

==============
  中文问题   
==============
不过我全部用UTF-8并未遇到中文问题
struts2-core包
struts-default.xml                      ----拦截器的设置
org.apache.struts2.default.properties   ----全局属性的设置 33行  strusts.i18n.encoding=UTF-8   默认UTF-8可以在struts.xml下进行设置

<struts>
设置字符集
<constant name="struts.i18n.encoding" value="gbk"/>

设置上传文件缓存
<constant name="struts.multipart.saveDir" value="c:\"/>
</struts>

其他属性
struts.multipart.parser=jakarta   struts2采用那种方式上传pell
                        cos

struts.multipart.maxSize=2097152   默认上传文件最大的请求大小2M

struts.action.extension=action     整个url的后缀名

==============
上传多个文件
==============

有两种方式:
1.数组
File[] file                文件
String[] fileFileName      文件名
String[] fileContentType   文件类型

2.集合
List<File>   file 
List<String> fileFileName
List<String> fileContentType

--------
action中:
--------
Java代码  
String execute() {  
        for(int i = 0; i < file.size(); i++) {  
            InputStream is = new FileInputStream(file.get(i));  
            String root = ServletActionContext.getRequest().getRealPath("/upload");  
            File destFile = new File(root,this.getFileFileName().get(i));   
            ...   
        }   
         return SUCCESS;  
    }  


--------
jsp中:
--------
多个file时,file的名字要一致,都要叫file,它会自动set到跟file名对应的List中去

<s:file name="file" />
<s:file name="file" />
<s:file name="file" />

========================
    上传任意个文件     
========================
<td id="more">
<input type="button" value="添加" onclick="addMore()" />
</td>
--------
  JS:
--------

Java代码  
funcation addMore() {  
         var td = document.getElementById("more");  
         //生成一个换行符  
         var br = document.createElement("br");  
         //创建一个input组件  
         var input = document.createElement("input");  
         var button = document.createElement("input");  
  
         //指定类型 为 file 为文件上传  
         input.type = "file";  
         //指定组件的名字  
         input.name = "file";  
  
         button.type = "button";  
         button.value = "删除";  
         //为删除按钮注册一个事件   
         button.onclick = function() {  
             //alert("删除按钮");  
      
             //删除一行  
             td.removeChild(br);  
             td.removeChild(input);  
             td.removeChild(button);  
         }  
  
         //将创建的组件加到<td>中  
         td.appendChild(br);  
         td.appendChild(input);  
         td.appendChild(button);  
    }  


=======================
     限制上传类型     
=======================
org.apache.struts2.interceptor.FileUploadInterceptor类

Long maximumSize:最大上传大小---每一个文件的大小,不是总和
String allowedTypes:允许的类型

-------------
struts.xml 
-------------

<struts>
<action ...>
  <result name="input">/upload.jsp</result>
  <result .../>
 
  加入一个上传文件的拦截器并设置其属性
  <interceptor-ref name="fileUpload">


   <param name="maximumSize">409600</param>   单个上传文件最大不能超过400K
   <param name="allowedTypes">...</param>     mime类型,多个用逗号分开


  </interceptor-ref>

  ** 加入默认的拦截器
  <interceptor-ref name="defaultStack" />
</action> 
</struts>

注:后缀可以到tomcat\conf\web.xml中找<mime-type>中的字符串

-------------
  upload.jsp
-------------

  添加<s:fielderror />

-------------
  更改显示的错误信息
-------------

org.apache.struts2中  找到struts-messages.properties

-----------------------
上传文件类型不匹配
struts.messages.error.content.type.not.allowed=Content-Type not allowed: {0} "{1}" {2}

-----------------------
上传文件大小超出规定
struts.messages.error.file.too.large=File too large: {0} "{1}" {2}

-----------------------
上传文件出错
struts.messages.error.uploading=Error uploading: {0}

创建一个全局的属性文件 /src/messages.properties

struts.messages.error.content.type.not.allowed=不支持上传该类型的文件
struts.messages.error.file.too.large=上传文件过大,请重试
struts.messages.error.uploading=上传文件时发生错误

---------
  国际化
---------
<constant name="struts.custom.i18n.resources" value="messages"/>

messages_en_US.properties
messages_zh_CN.properties

==============================
            下载             
==============================
处理下载的类:org.apache.struts2.dispatcher.StreamResult

== 属性 ==

String contentType = "text/plain";     
String contentLength;
String contentDisposition = "inline";  
String inputName = "inputStream";      
InputStream inputStream;              
int bufferSize = 1024;
== 说明 ==         
contentType
内容类型,和互联网MIME标准中的规定类型一致,例如text/plain代表纯文本,text/xml表示XML,image/gif代表GIF图片,image/jpeg代表JPG图片 

用来做动态文件下载的,事先并不知道未来的文件类型是什么,那么我们可以把它的值设置成为:application/octet-stream;charset=ISO8859-1 ,注意一定要加入charset,否则某些时候会导致下载的文件出错
inputName
下载文件的来源流,对应着action类中某个类型为Inputstream的属性名,例如取值为inputStream的属性需要编写getInputStream()方法
contentDisposition
文件下载的处理方式,包括内联(inline)和附件(attachment)两种方式,而附件方式会弹出文件保存对话框,否则浏览器会尝试直接显示文件。取值为:attachment;filename="struts2.txt",表示文件下载的时候保存的名字应为struts2.txt。如果直接写filename="struts2.txt",那么默认情况是代表inline,浏览器会尝试自动打开它,等价于这样的写法:inline; filename="struts2.txt"
bufferSize
下载缓冲区的大小

# contentType属性和contentDisposition分别对应着HTTP响应中的头Content-Type和Content-disposition头。

   如:
     HTTP头内容:

     HTTP/1.1 200 OK
     Server: Apache-Coyote/1.1
     Content-disposition: attachment;filename="struts2.txt"
     Content-Type: text/plain
     Transfer-Encoding: chunked
     Date: Sun, 02 Mar 2008 02:58:25 GMT
----------
  action 
----------
Java代码  
Class DownloadAction extends ActionSupport {  
     private String path;  
     // setter... getter...  
     //必须返回一个输入流,该流是让用户下载的  
     public InputStream getDownloadFile() {  
      //从某个文件获得流 --这里是获得项目root下upload下的文件  
      //也可以 new FileInputStream("c:/test.text");  
      return ServletActionContext.getServletContext().getResourceAsStream("/upload/struts2.ppt");  
     }  
  
     public String execute() throws Exception {  
      return SUCCESS;  
     }  
}  

-----------
struts.xml
-----------
<action name="download" class="org.scorpio.jh.struts2.upload.action.DownloadAction">
 
   <!-- 依赖注入文件路径 -->
   <param name="path">/download/xhtml.txt</param>
  
   <!-- 设置结果类型为 流 -->
   <result name="success" type="stream">
   
    <!-- 设置内容类型 -->
    <param name="contentType">text/plain</param>
   
    <!-- 设置下载文件的名字  attachment:作为附件,filename=:指定下载文件名-->
    <param name="contentDisposition">attachment;filename="xhtml.txt"</param>
  
    <!-- 设置下载文件的输入流对应的方法 downloadFile对应DownloadAction中的getDownloadFile()-->
    <param name="inputName">downloadFile</param>
  
    <!-- 指定下载文件的缓冲大小 -->
    <param name="bufferSize">4096</param>
   </result>
  </action>

==========================
  解决下载文件名中文问题 
==========================
1.在下载action获取文件名的方法中先进行转码然后再返回
   path = new String( path.getBytes(), "ISO-8859-1" );

2.xml配置文件动态的获取path的值
   <param name="contentDisposition">attachment;filename="${path}"</param>
   ${path} 用于动态的获取所配置的action中path成员的值,相当于调用getPath()方法
-------
action
-------
Java代码  
private String path;  
  
    public String getPath() {  
        try { // 转换成西欧字符集  
            path = new String(path.getBytes(), "ISO-8859-1");  
        } catch (UnsupportedEncodingException e) {  
            e.printStackTrace();  
        }  
        return path;  
    }  
  
    public void setPath(String path) {  
        this.path = path;  
    }  

---------------
   struts.xml 
---------------
<action name="download" class="org.scorpio.jh.struts2.upload.action.DownloadAction">

  <param name="path">/download/wmlscript实例.txt</param>

  <result name="success" type="stream">
  <param name="contentType">text/plain</param>

  <!-- 动态的获取 DownloadAction的path属性 -->
  <param name="contentDisposition">attachment;filename="${path}"</param>

  <param name="inputName">downloadFile</param>
  <param name="bufferSize">4096</param>
</result>
</action>

=================
    安全隐患    
=================

访问者如果精通Struts 2的话,它可能使用这样的带有表单参数的地址来访问:

http://localhost:8080/struts2hello/download3.action?inputPath=/WEB-INF/web.xml,这样的结果就是下载后的文件内容是您系统里面的web.xml的文件的源代码,甚至还可以用这种方式来下载任何其它JSP文件的源码。这对系统安全是个很大的威胁。作为一种变通的方法,读者最好是从数据库中进行路径配置,然后把Action类中的设置inputPath的方法统统去掉,简言之就是删除这个方法定义:
Java代码  
public void setPath(String path) {  
         this.path = path;  
    }   


而实际情况则应该成为 download.action?fileid=1 类似于这样的形式来进行。或者呢,读者可以在execute()方法中进行路径检查,如果发现有访问不属于download下面文件的代码,就一律拒绝,不给他们返回文件内容。例如,我们可以把刚才类中的execute()方法加以改进,成为这样:
Java代码  
public String execute() throws Exception {  
        // 文件下载目录路径  
        String downloadDir = ServletActionContext.getServletContext().getRealPath("/download");  
        // 文件下载路径  
        String downloadFile = ServletActionContext.getServletContext().getRealPath(inputPath);  
        java.io.File file = new java.io.File(downloadFile);  
        downloadFile = file.getCanonicalPath();// 真实文件路径,去掉里面的..等信息  
  
        // 发现企图下载不在 /download 下的文件, 就显示空内容  
        if(!downloadFile.startsWith(downloadDir)) {  
         return null;  
        }  
        return SUCCESS;  
    }   

这时候如果访问者再企图下载web.xml的内容,它只能得到一个空白页,现在访问者只能下载位于/download目录下的文件
其他的一些资料:

Struts 2中实现文件上传

http://www.blogjava.net/max/archive/2007/03/21/105124.html



Struts 2中实现文件下载(修正中文问题)

http://www.blogjava.net/beansoft/archive/2008/03/03/183468.html



Struts 1文件下载:

http://hi.baidu.com/gisland/blog/item/268caecc7b4eea1301e9288f.html

http://hi.baidu.com/joe_tech/blog/item/164ced16bd0cbe52f2de3235.html

http://www.blogjava.net/max/archive/2007/03/21/105124.html
http://callan.iteye.com/blog/179351
转载自:http://longzijian.iteye.com/blog/336841

一、Struts2文件上传
 
Struts2的文件上传实现非常简单,只需要简单几步就可完成;
注意:
(1)文件上传的struts2标签为:<s:file name="" label="上传"/>
(2)文件上传的前提是表单属性method="post" enctype="multipart/form-data";
(3)web应用中必须包含common-fileupload.jar和common-io.jar,因为struts2默认上传解析器使用的是jakarta;
(4)可以在struts.xml中配置最大允许上传的文件大小:<constant name="struts.multipart.maxSize" value="....."/>,默认为2M;
 
1.普通文件上传
 
实现规则:
(1)在JSP中设定表单控件<s:file name="upload" label="上传"/>
(2)在Action中定义属性:
private File upload;        //包含文件内容
private String uploadFileName;    //上传文件的名称;
private String uploadContentType;    //上传文件的MIME类型;
这些属性都会随着文件的上传自动赋值;
(3)在execute()中完成写入磁盘功能;
 
代码示例:
 
Upload01Action.java
 
package org.upload.action;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class Upload01Action extends ActionSupport {
private File upload;
private String uploadFileName;
private String uploadContentType;
private String name;
public String execute()throws Exception{
String path = ServletActionContext.getServletContext().getRealPath("/WEB-INF/upload");
String filename = path+File.separator+name;
FileInputStream in = new FileInputStream(upload);
FileOutputStream out = new FileOutputStream(filename);
byte[]b = new byte[1024];
int len = 0;
while((len=in.read(b))>0){
out.write(b,0,len);
}
out.close();
return SUCCESS;
}

public File getUpload() {
return upload;
}

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

public String getUploadFileName() {
return uploadFileName;
}

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

public String getUploadContentType() {
return uploadContentType;
}

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

public String getName() {
return name;
}

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


}
 
struts.xml
 
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
<constant name="struts.devMode" value="true" />
<constant name="struts.custom.i18n.resources" value="message"></constant>
<package name="default" namespace="/"  extends="struts-default">
<action name="upload0*" class="org.upload.action.Upload0{1}Action">
<param name="name">1.jpg</param>
<result>/{1}.jsp</result>
</action>
</package>
</struts>

1.jsp
 
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>   
    <title>My JSP '1.jsp' starting page</title>
  </head>
 
  <body>
   <s:form action="upload01" method="post" enctype="multipart/form-data">
   <s:file name="upload" label="上传"></s:file>
   <s:submit value="上传"></s:submit>
   </s:form>
  </body>
</html>

 
2.利用拦截器进行过滤
 
手动实现过滤的方式非常简单,就是利用输入校验的方式进行过滤,即在validate()中进行过滤;
而这里要讲的拦截器方式是很好的方式,只需要在配置文件中配置,灵活性很好,能够限制文件的类型、文件的大小;如果上传的文件不符合要求,则返回input逻辑视图;
 
配置拦截器步骤:
 
(1)文件上传的拦截器为fileUpload;
(2)需要给定参数allowedTypes、maximumSize;
(3)在fileUpload拦截器后,需要添加<interceptor-ref name="defaultStack"/>
 
代码示例:
 
由于通过拦截器进行过滤只需要配置struts.xml,因此这里只给出struts.xml的配置
 
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
<constant name="struts.devMode" value="true" />
<constant name="struts.custom.i18n.resources" value="message"></constant>
<package name="default" namespace="/"  extends="struts-default">
<action name="upload0*" class="org.upload.action.Upload0{1}Action">
<interceptor-ref name="fileUpload">
<param name="allowedTypes">image/jpeg,image/gif</param>
<param name="maximumSize">1024*1024</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
<param name="name">1.jpg</param>
<result>/{1}.jsp</result>
<result name="input">/{1}.jsp</result>
</action>
</package>
</struts>

 
我们还需要配置文件上传失败后的错误提示信息,我们需要在全局国际化资源文件中配置:
 
struts.messages.error.content.type.not.allowed=文件类型不匹配

struts.messages.error.file.too.large=文件太大


 
 
二、Struts2文件下载
 
我们在学习Servlet和HTTP协议时已经可以实现文件下载,即写content-disposition头即可,struts2的实现原理也是这个,但是提供了更好的封装性;
struts2的stream结果类型专门用于实现文件下载;
(1)struts.xml中配置stream结果类型,并配置contentType、contentDisposition、bufferSize参数即可,模板:
<action name="download" class="">
<result type="stream" name="success">
<param name="contentType"></param>
<param name="contentDisposition">attachment;filename=""</param>
<param name="bufferSize">4096</param>
</result>
</action>

(2)在Action中创建public InputStream getInputStream()throws Exception;方法,此方法用于获得下载文件的输入流;
 
DownloadAction.java
 
package org.download.action;

import java.io.InputStream;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class DownloadAction extends ActionSupport {
public InputStream getInputStream()throws Exception{

return ServletActionContext.getServletContext().getResourceAsStream("/WEB-INF/upload/1.jpg");

}
public String execute()throws Exception{
return SUCCESS;
}
}

struts.xml
 
<action name="download" class="org.download.action.DownloadAction">
<result type="stream" name="success">
<param name="contentType">image/jpeg</param>
<param name="contentDisposition">attachment;filename="1.jpg"</param>
<param name="bufferSize">4096</param>
</result>
</action>

 
就可以完成下载;


文件信息批量导入数据库(Struts2实现文件上传,POI实现Excel文件读取并写入数据库

如题:文件信息的批量导入......
项目中经常会遇到客户的一些单表信息的数据批量导入,也就是提供定制Excel表,再把Excel表中的数据提取到数据库的操作,其实实现起来很简单。以下是小菜鸟我的实现思路:
 
1、JSP页面+Struts2实现文件上传,把定制Excel上传到服务器指定目录下,以供读取;
2、POI读取Excel表格,把数据封装为持久化实体List
3、批量导入数据库
 
这是TT的开发环境:
Struts2.1.6 + Spring2.5.6 + Hibernate3.3.1 + MyEclipse8.5 + tomcat5.5 + Oracle11g
 
需要的Jar包:SSH的就不需要说了
主要就是一个POI的包:
我这里是 poi-3.7-beta-20100620.jar,这一个jar包可以去apach的官网上下载
还有一个就是struts的IO包:
commons-io-1.3.2.jar,顾名思义:IO工具类
 
第一步:文件上传
这一步,网上有很多的例子:
 
JSP页面:
 
[java] view plaincopy
<body>  
    <s:form id="form1" name="form1" action="roleFileUpload.action" method="post" enctype="multipart/form-data" theme="simple">  
        <div align="center" id="div1" style="width: 80%">  
    <table width="80%" border="1" align="center" class="DB_table">  
      <tr>  
        <td colspan="99" align="left">文件上传</td>  
      </tr>  
      <tr>  
        <td colspan="99" id="more">  
          <s:file name="uploadFile" label="文件位置" size="80"/>  
        </td>  
      </tr>  
      <tr>  
        <td colspan="99" align="right">  
        <s:submit value="上传"></s:submit>  
        <s:reset value="重置"></s:reset>  
        </td>  
      </tr>  
        </table>  
    </div>  
    </s:form>  
  </body>  
 
 
Struts.xml配置文件:这里可以定制Filter,指定文件类型和最大长度,就不列举了
 
[xhtml] view plaincopy
<action name="roleFileUpload" class="roleFileAction" method="loadRoleFile">  
    <result name="success">/page/role/roleallinput.jsp</result>  
    <result name="input">/page/role/roleallinput.jsp</result>  
</action>  
 
对应的applicationContext.xml配置
[xhtml] view plaincopy
<bean id="roleFileAction" class="com.adtec.datacenter.action.manager.RoleFileUploadAction"  
    scope="prototype">  
    <property name="fileLoadDao" ref="fileLoadDao"></property>  
</bean>  
<bean id="fileLoadDao"  
    class="com.adtec.datacenter.dao.manager.FileLoadDaoImpl">  
    <property name="sessionFactory" ref="sessionFactory"></property>  
</bean>  
 
RoleFileUploadAction实现
这里有几个点需要注意:
上传文件的文件如果为uploadFile,那么文件名一定要为uploadFileFileName,也就是在文件后加入FileName,不然不能识别
 
[java] view plaincopy
package com.adtec.datacenter.action.manager;  
  
import java.io.File;  
import java.io.FileInputStream;  
import java.io.IOException;  
import java.io.PrintWriter;  
import java.util.ArrayList;  
import java.util.List;  
  
import javax.servlet.http.HttpServletResponse;  
  
import org.apache.commons.io.FileUtils;  
import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
import org.apache.poi.ss.usermodel.Cell;  
import org.apache.poi.ss.usermodel.Row;  
import org.apache.poi.ss.usermodel.Sheet;  
import org.apache.poi.ss.usermodel.Workbook;  
import org.apache.struts2.ServletActionContext;  
  
import com.adtec.datacenter.dao.manager.FileLoadDao;  
import com.adtec.datacenter.dao.manager.RoleDao;  
import com.adtec.datacenter.entity.manager.PtRoleInfo;  
import com.adtec.datacenter.vo.manager.RoleInfo;  
import com.opensymphony.xwork2.ActionSupport;  
  
public class RoleFileUploadAction extends ActionSupport{  
      
    private File uploadFile;  
    private String uploadFileFileName;  
    private FileLoadDao fileLoadDao;  
    private RoleDao roleDao;  
      
    public File getUploadFile() {  
        return uploadFile;  
    }  
    public void setUploadFile(File uploadFile) {  
        this.uploadFile = uploadFile;  
    }  
    public String getUploadFileFileName() {  
        return uploadFileFileName;  
    }  
    public void setUploadFileFileName(String uploadFileFileName) {  
        this.uploadFileFileName = uploadFileFileName;  
    }  
      
    public FileLoadDao getFileLoadDao() {  
        return fileLoadDao;  
    }  
    public void setFileLoadDao(FileLoadDao fileLoadDao) {  
        this.fileLoadDao = fileLoadDao;  
    }  
      
    public RoleDao getRoleDao() {  
        return roleDao;  
    }  
    public void setRoleDao(RoleDao roleDao) {  
        this.roleDao = roleDao;  
    }  
    @Override  
    public void validate() {  
        super.validate();  
    }  
      
    public String loadRoleFile(){  
          
        String directory = "/upload/role";  
        String targetDirectory = ServletActionContext.getServletContext().getRealPath(directory);  
        //生成上传的文件对象  
        File target = new File(targetDirectory,uploadFileFileName);  
        //如果文件已经存在,则删除原有文件  
        if(target.exists()){  
            target.delete();  
        }  
        //复制file对象,实现上传  
        try {  
            FileUtils.copyFile(uploadFile, target);  
              
            //out = response.getWriter();  
            //out.print("文件上传成功!");  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
          
        loadRoleInfo(uploadFileFileName);  
        return SUCCESS;  
    }  
      
    /** 
     * 把Excele表读出的数据,组装成一个List,统一导入数据库 
     * @param uploadFileFileName 
     */  
    public void loadRoleInfo(String uploadFileFileName){  
          
        String directory = "/upload/role";   
        String targetDirectory = ServletActionContext.getServletContext().getRealPath(directory);  
        File target = new File(targetDirectory,uploadFileFileName);  
          
        List roleList = new ArrayList();  
        try{  
            FileInputStream fi = new FileInputStream(target);  
            Workbook wb = new HSSFWorkbook(fi);  
            Sheet sheet = wb.getSheetAt(0);  
              
            int rowNum = sheet.getLastRowNum()+1;  
            for(int i=1;i<rowNum;i++){  
                PtRoleInfo ptRoleInfo = new PtRoleInfo();  
                Row row = sheet.getRow(i);  
                int cellNum = row.getLastCellNum();  
                for(int j=0;j<cellNum;j++){  
                    Cell cell = row.getCell(j);  
                    String cellValue = null;  
                    switch(cell.getCellType()){ //判断excel单元格内容的格式,并对其进行转换,以便插入数据库  
                        case 0 : cellValue = String.valueOf((int)cell.getNumericCellValue()); break;  
                        case 1 : cellValue = cell.getStringCellValue(); break;  
                        case 2 : cellValue = String.valueOf(cell.getDateCellValue()); break;  
                        case 3 : cellValue = ""; break;  
                        case 4 : cellValue = String.valueOf(cell.getBooleanCellValue()); break;  
                        case 5 : cellValue = String.valueOf(cell.getErrorCellValue()); break;  
                    }  
                      
                    switch(j){//通过列数来判断对应插如的字段  
                        case 0 : ptRoleInfo.setRoleId(cellValue);break;  
                        case 1 : ptRoleInfo.setRoleName(cellValue);break;  
                        case 2 : ptRoleInfo.setDeil(cellValue);break;  
                    }  
                }  
                roleList.add(ptRoleInfo);  
            }  
            fileLoadDao.roleInfotoDB(roleList);  
        }catch(IOException e){  
            e.printStackTrace();  
        }  
    }  
      
      
}  
 
roleDao接口实现
这里接口类就不贴出来了,直接贴实现类,把持久化实体List循环写入数据库
 
[java] view plaincopy
package com.adtec.datacenter.dao.manager;  
  
import java.io.File;  
import java.io.FileInputStream;  
import java.io.FileOutputStream;  
import java.io.IOException;  
import java.io.PrintWriter;  
import java.util.Iterator;  
import java.util.List;  
  
import javax.servlet.http.HttpServletResponse;  
  
import org.apache.commons.io.FileUtils;  
import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
import org.apache.poi.ss.usermodel.Cell;  
import org.apache.poi.ss.usermodel.Row;  
import org.apache.poi.ss.usermodel.Sheet;  
import org.apache.poi.ss.usermodel.Workbook;  
import org.apache.struts2.ServletActionContext;  
import org.hibernate.HibernateException;  
import org.hibernate.Session;  
import org.hibernate.Transaction;  
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;  
  
import com.adtec.datacenter.entity.manager.PtRoleInfo;  
import com.adtec.datacenter.vo.manager.RoleInfo;  
/** 
 * 文件工具类 
 * @author Tony 
 * 
 */  
public class FileLoadDaoImpl extends HibernateDaoSupport implements FileLoadDao {  
    /** 
     * 把从excel表读出的数据写入到数据库 
     */  
    public void roleInfotoDB(List roleList){  
        Session session = this.getHibernateTemplate().getSessionFactory().openSession();  
        Transaction tx = null;  
          
        try{  
            tx = session.beginTransaction();  
            if(roleList.size() > 0){  
                  
                int roleNum = roleList.size();  
                for(int i=0;i<roleNum;i++){  
                    session.save(roleList.get(i));  
                }  
                /*for(Iterator iterator = roleList.iterator();iterator.hasNext();){ 
                    session.save(iterator.next()); 
                }*/  
            }  
            tx.commit();  
        }catch(HibernateException e){  
            e.printStackTrace();  
            tx.rollback();  
        }finally{  
            session.close();  
        }  
        //this.getHibernateTemplate().saveOrUpdateAll(roleList);  
        return;  
    }  
}  
 
这里循环写入数据库,可以使用Spring自动注入的事务管理,更方便简洁,可惜我这里的框架不知道为什么,只要注入事务管理就报错,TT正在查找问题所在!





猜你喜欢

转载自zhyp29.iteye.com/blog/2296645
今日推荐