struts2实现文件的上传、下载

 

struts2实现文件的上传、下载

struts2实现文件的上传、下载

struts2能实现上传、下载是基于组件commons-fileupload-1.2.2.jar和commons-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 {

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

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

     //获得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.properties,struts.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”。

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

    //获得Tomcat下upload的真实路径。

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;

 

                     //get、set方法

                     

                     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里必须提供fileName的get方法- - >

             </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>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值