`
gaoyu
  • 浏览: 270145 次
  • 来自: 云南大理
社区版块
存档分类
最新评论

struts2实现文件的上传、下载

阅读更多

 

struts2实现文件的上传、下载

struts2实现文件的上传、下载

struts2能实现上传、下载是基于组件commons-fileupload-1.2.2.jarcommons-io-2.0.1.jar

 

表单元素的enctype属性,

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

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

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

text/plain:这种编码方式当表单的action属性为mailto:URL的形式时比较方便,这种方式主要适用于直接通过表单发送邮件的方式。

我们根据例子来分析:

jsp页面:

<s:form action=”uploadAction”method=”post” enctype=multipart/form-data>

     <s:label  name=”file”   /> <s:file  />

     <s:submit  value=”上传” />

<s:form> 

 

UploadAction :

public  class  UploadAction  extends ActionSupport {

     private String file;//这里的名字要和JSP参数名一样,(为了set方法);

     private String fileFileName; //参数名+FileName,必须这样。保存文件真正的名字

     private String fileContentType; //参数名+ContentType,必须这样。保存文件真正的类型

 

     /*

* get/set方法

*/

 

public String execute() throws Exception {

     //JSPform将表单内容以二进制的形式传参给action

     //这时,actionfile保存了上传的文件。

     //获得file的路径

    System.out.println(file.getAbsolutePath());

}    

}

注:

     上例,我机子上的运行结果如下:

 

     文件上传后,struts2会先临时将这个文件保存起来,struts.multipart.saveDir 用来指定临时文件保存位置。struts.multipart.saveDir=null(没指定)的话会保存到服务器中的一个位置。

      配置struts.multipart.saveDir有两种方式:

  1. struts.xml中配置,<constant name="struts.multipart.saveDir" value="/tmp"/>
  2. 写个sturt.propertiesstruts.multipart.saveDir=/temp

struts2默认上传文件最大是2M我们可以修改配置文件来更改大小(以字节为单位)

  1. struts.xml中配置,<constant name="struts.multipart.maxSize" value="10701096"/>
  2. struts.properties中配置,  struts.multipart.maxSize=10701096

注:

        struts.properties中的配置都可以放到struts.xml中用constant配置。

好了,现在进入正题:

单个文件上传:

public String execute() throws Exception {

     //webRoot下建个文件夹,用来存放上传来的文件,“upload”

    //其实这个文件只是一个映射,真正保存文件的uploadTomcat那里。

    //获得Tomcatupload的真实路径。

String  realPath = ServletActionContext

                                     .getRequest()

                                     .getSession()

                                     .getServletContext()

                                     .getRealPath(“upload”);

//通过真实路径+真实文件名,完全将文件copy过来。

File  theCopy = new File(realPath, fileFileName);

 

//输入流插到临时文件上,读数据。输入,输出,都是相对于程序。

InputStream is = new FileInputStream(file);

//输出流插到新文件上,写数据。

OutputStream os = new OutputStream(theCopy);

 

//一个缓冲字节数组。

byte[] buffer = new byte[];

int length=0;

//开始copy

while ( (length=is.read(buffer0)) != -1 ) {

              os.write(buffer, 0, length);

}

}

//临时文件的删除?

多个文件上传:

   多个文件的上传跟单个文件上传类似,只是操作的是一个集合而已。

   例子如下:

   jsp页面:

    <s:from  action=”upload” method=”post” enctype=”multipart/form-data”>

              <! - - 上传的所有参数必须是一个名,struts将它们封装成一个集合-- >

              <s:file  name=”files”> <br />  

              <s:file  name=”files”> <br />

              <s:submit value=”上传” />

       </s:form>

     action

            public  class UploadFileAction extends ActionSupport {

                     private  List<File>  files;

                     private  List<String>  filesFileName;

                     private  List<String>  filesContentType;

 

                     //getset方法

                     

                     public  String  execute( ) throws  Exception {

                            String realpath = ServletActionContext

.getRequest()

.getSession() 

.getServletContext()

.getRealPath("upload");

                            for(int i=0;  i<files.size(); i++ ) {

                                   File  copy  =  new  File(realpath, filesFileName.get(i) );

                                   inputStream  is = new  FileInputStream ( files.get(i) );

                                   OutputStream  os  = new FileOutputStream (copy );

 

                                   byte[]  buffer = new  byte[];

                                   int  length = 0;

                                   while( ( length =is.read(buffer) ) != -1 ) {

                                          os.write( buffer, 0, length );

                                   }

                            }

 

                            return SUCCESS;

                     }  

              }

文件下载:

    action:

    public  class DownloadFileAction  extends  ActionSupport {

          

         private String fileName;

         private  InputStream  downloadFile;

 

              //主要的方法

        public InputStream  getDownloadFile() {

              try {

                //模拟根据条件下载对应的文件

                if( num == 1 )

                        //将制定的文件作为一个流返回出去;

                    return  return ServletActionContext

                                        .getServletContext()

                                        .getResourceAsStream("/upload/xxoo.jpg");

                else

                       //将制定的文件作为一个流返回出去;

                       return  return ServletActionContext

                                               .getServletContext()

                                               .getResourceAsStream("/upload/jj.txt");

 

                   } catch (Exception e) {

                       e.printStackTrace();

                   }

              return  null;

         }

 

         public String  getFileName() {

              return this.fileName;

         }

 

         public  String  execute() throws Exception {

              return SUCCESS;

         }

     }

    struts配置

    <struts >

        <! – 指定,文件上传时临时文件的位置- - >

        <constant  name=”struts.multipart.saveDir” value=”/upload” />

         <action  name=”download” class=”action.DownloadFileAction” >

            <!- - 要注意result的类型是stream - - >

            <result  name=”success” type=”stream” >

<!—inputName参数指定文件的源头,根据这个配置,找getDownloadFile方法获得文件流 - ->

                <param  name=”inputName”>downloadFile</param>

<!—指定下载的方式,默认的是inline,这种方式,浏览器如果能打开的文件的话,就直接打开,而不会下载(如.txt格式文件)。一般指定是attachment方式,让用户可以选择是打开还是下载。- - >

                <param 

name=”contentDisposition”>attachment;filename=”xxoo.jpg”</param>

<! – 如果想不写死文件的话,”xxoo.jpg”可以换成${fileName},action里必须提供fileNameget方法- - >

             </result>

     </struts>

 

jsp页面:

 

<a  href = “download.action?num=1”>下载文件</a>

 

    还可以指定文件的格式,缓冲大小,如:

     

 <result name="success" type="stream">

          <param name="contentType">image/jpeg</param>

          <param name="inputName">imageStream</param>

 <param name="contentDisposition">attachment;filename="document.pdf"</param>

          <param name="bufferSize">1024</param>

 </result>

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics