Struts2实现文件上传和下载

限于喜欢 提交于 2019-12-01 12:36:10

在做B/S系统时,通常会涉及到上传文件和下载文件,在没接struts2框架之前,我们都是使用apache下面的commons子项目的FileUpload组件来进行文件的上传,但是那样做的话,代码看起来比较繁琐,而且不灵活,在学习了struts2后,struts2为文件上传下载提供了更好的实现机制,在这里我分别就单文件上传和多文件上传的源代码进行一下讲解,这里需要导入文件下载上传的两个jar文件,一个是commons-fileupload-1.2.2.jar,另一个是commons-io-2.0.1.jar

struts2单文件上传:

首先是一个jsp文件上传页面,这个比较简单,就是一个表单,里面有个文件上传框

复制代码

   <!--在进行文件上传时,表单提交方式一定要是post的方式,因为文件上传时二进制文件可能会很大,还有就是enctype属性,这个属性一定要写成,
  不然就会以二进制文本上传到服务器端--> 

        
        

复制代码

接下来是FileUploadAction部分代码,因为struts2对上传和下载都提供了很好的实习机制,所以在action这段我们只需要写很少的代码就行:

复制代码

  FileUploadAction 
    
     .username = .file = .fileFileName = .fileContentType = String execute() = ServletActionContext.getServletContext().getRealPath("/upload"= =  FileOutputStream("fileFileName: " +"file: " +"file: " +[] buffer =  [500 length = 0(-1 != (length = is.read(buffer, 0

复制代码

首先我们要清楚一点,这里的file并不是真正指代jsp上传过来的文件,当文件上传过来时,struts2首先会寻找struts.multipart.saveDir(这个是在default.properties里面有)这个name所指定的存放位置,我们可以新建一个struts.properties属性文件来指定这个临时文件存放位置,如果没有指定,那么文件会存放在tomcat的apache-tomcat-7.0.29\work\Catalina\localhost\目录下,然后我们可以指定文件上传后的存放位置,通过输出流将其写到流里面就行了,这时我们就可以在文件夹里看到我们上传的文件了。

文件上传后我们还需要将其下载下来,其实struts2的文件下载原理很简单,就是定义一个输入流,然后将文件写到输入流里面就行,关键配置还是在struts.xml这个配置文件里配置:

FileDownloadAction代码如下:

复制代码

public class FileDownloadAction extends ActionSupport
{    public InputStream getDownloadFile()
    {        return ServletActionContext.getServletContext().getResourceAsStream("upload/通讯录2012年9月4日.xls");
    }
    
    @Override    public String execute() throws Exception
    {        return SUCCESS;
    }
}

复制代码

我们看,这个action只是定义了一个输入流,然后为其提供getter方法就行,接下来我们看看struts.xml的配置文件:

        <action name="fileDownload" class="com.xiaoluo.struts2.FileDownloadAction">
            <result name="success" type="stream">
                <param name="contentDisposition">attachment;filename="通讯录2012年9月4日.xls"</param>
                <param name="inputName">downloadFile</param>
            </result>
        </action>

struts.xml配置文件有几个地方我们要注意,首先是result的类型,以前我们定义一个action,result那里我们基本上都不写type属性,因为其默认是请求转发(dispatcher)的方式,除了这个属性一般还有redirect(重定向)等这些值,在这里因为我们用的是文件下载,所以type一定要定义成stream类型,告诉action这是文件下载的result,result元素里面一般还有param子元素,这个是用来设定文件下载时的参数,inputName这个属性就是得到action中的文件输入流,名字一定要和action中的输入流属性名字相同,然后就是contentDisposition属性,这个属性一般用来指定我们希望通过怎么样的方式来处理下载的文件,如果值是attachment,则会弹出一个下载框,让用户选择是否下载,如果不设定这个值,那么浏览器会首先查看自己能否打开下载的文件,如果能,就会直接打开所下载的文件,(这当然不是我们所需要的),另外一个值就是filename这个就是文件在下载时所提示的文件下载名字。在配置完这些信息后,我们就能过实现文件的下载功能了。


struts2多文件上传:

其实多文件上传和单文件上传原理一样,单文件上传过去的是单一的File,多文件上传过去的就是一个List<File>集合或者是一个File[]数组,首先我们来看一下前端jsp部分的代码,这里我用到了jquery来实现动态的添加文件下载框以及动态的删除下载框:

复制代码

    <script type="text/javascript" src="script/jquery-1.8.1.js"></script>
    <script type="text/javascript">
            
        $(function()
        {
            $("#button").click(function()
            {                var html = $("<input type='file' name='file'>");                var button = $("<input type='button' name='button' value='删除'><br>");
                
                $("#body div").append(html).append(button);
                
                button.click(function()
                {
                    html.remove();
                    button.remove();
                })
            })
        })    
    </script>
  </head>
  
  <body id="body">

    <form action="fileUpload2.action" method="post" enctype="multipart/form-data">
    
        username: <input type="text" name="username"><br>
        file: <input type="file" name="file">
        <input type="button" value="添加" id="button"><br>
        <div></div>
        <input type="submit" value="submit"> 
        
    </form>

  </body>

复制代码

file的名字必须都命名成file才行,然后处理多文件上传的action代码如下:

复制代码

  FileUploadAction2  List<File> List<String> List<String> .username = List<File>  setFile(List<File>.file = List<String>  setFileFileName(List<String>.fileFileName = List<String>  setFileContentType(List<String>.fileContentType = String execute() = ServletActionContext.getServletContext().getRealPath("/upload"( i = 0; i < file.size(); i++= =  FileOutputStream([] buffer =  [500"unused" length = 0(-1 != (length = is.read(buffer, 0

复制代码

这样同样将其写到一个输出流里面,这样我们就可以在文件夹里看到上传的多个文件了

接下来的文件下载就和刚才的文件下载一模一样,struts.xml也是一样的,这里就不再重复了

 

总结:总的来说,struts2提供的文件上传下载机制简化了我们很多代码,我们可以在以后的项目中使用该机制,同样我们也可以使用FileUpload组件来进行文件的上传,这个都是因个人爱好决定!

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!