基于struts框架的上传下载的实现

来源:互联网 发布:连锁店管理系统源码 编辑:程序博客网 时间:2024/05/17 02:19


基于struts框架实现上传下载首先必须有的两个jar包:commons-fileupload-1.2.2.jar 和 commons-io-2.0.1.jar


下面进入正题----------------


情况一:单文件上传 


jsp页面:

复制代码
   <!--在进行文件上传时,表单提交方式一定要是post的方式,因为文件上传时二进制文件可能会很大,还有就是enctype属性,这个属性一定要写成multipart/form-data
  不然就会以二进制文本上传到服务器端-->
  <form action="fileUpload.action" method="post" enctype="multipart/form-data">    username: <input type="text" name="username"><br> file: <input type="file" name="file"><br> <input type="submit" value="submit"> </form>
复制代码

接下来是action的实现:

复制代码
public class FileUploadAction extends ActionSupport{    private String username;    
   //注意,file并不是指前端jsp上传过来的文件本身,而是文件上传过来存放在临时文件夹下面的文件
private File file; //提交过来的file的名字 private String fileFileName; //提交过来的file的MIME类型 private String fileContentType; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public File getFile() { return file; } public void setFile(File file) { this.file = file; } public String getFileFileName() { return fileFileName; } public void setFileFileName(String fileFileName) { this.fileFileName = fileFileName; } public String getFileContentType() { return fileContentType; } public void setFileContentType(String fileContentType) { this.fileContentType = fileContentType; } @Override public String execute() throws Exception { String root = ServletActionContext.getServletContext().getRealPath("/upload"); InputStream is = new FileInputStream(file); OutputStream os = new FileOutputStream(new File(root, fileFileName)); System.out.println("fileFileName: " + fileFileName);

    // 因为file是存放在临时文件夹的文件,我们可以将其文件名和文件路径打印出来,看和之前的fileFileName是否相同 System.out.println(
"file: " + file.getName()); System.out.println("file: " + file.getPath()); byte[] buffer = new byte[500]; int length = 0; while(-1 != (length = is.read(buffer, 0, buffer.length))) { os.write(buffer); } os.close(); is.close(); return SUCCESS; }}
复制代码
这里的file并不是真正指代jsp上传过来的文件,当文件上传过来时,struts2首先会寻找struts.multipart.saveDir(这个是在default.properties里面有)这个name所指定的存放位置,我们可以新建一个struts.properties属性文件来指定这个临时文件存放位置,如果没有指定,那么文件会存放在tomcat的apache-tomcat-7.0.29\work\Catalina\localhost\目录下,然后我们可以指定文件上传后的存放位置,通过输出流将其写到流里面就行了,这时我们就可以在文件夹里看到我们上传的文件了。

-----------------------------------------------------------


情况二:文件下载


首先:

  action的xml配置文件需要配置。


这个action的配置定义一个输入流,然后为其提供getter方法就行。


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

其次:

action的实现


复制代码
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;    }}
复制代码


注意:

首先是result的类型,以前我们定义一个action,result那里我们基本上都不写type属性,因为其默认是请求转发(dispatcher)的方式,除了这个属性一般还有redirect(重定向)等这些值,

在这里因为我们用的是文件下载,所以type一定要定义成stream类型,告诉action这是文件下载的result,result元素里面一般还有param子元素,

这个是用来设定文件下载时的参数,inputName这个属性就是得到action中的文件输入流,名字一定要和action中的输入流属性名字相同

然后就是contentDisposition属性,这个属性一般用来指定我们希望通过怎么样的方式来处理下载的文件,如果值是attachment

则会弹出一个下载框,让用户选择是否下载,如果不设定这个值,那么浏览器会首先查看自己能否打开下载的文件,

如果能,就会直接打开所下载的文件,(这当然不是我们所需要的),另外一个值就是filename这个就是文件在下载时所提示的文件下载名字。

在配置完这些信息后,我们就能过实现文件的下载功能了。


-------------------------------------------------------------------------------------------------------------------

情况三:多文件上传的实现

其实多文件上传和单文件上传原理一样,单文件上传过去的是单一的File,多文件上传过去的就是一个List<File>集合或者是一个File[]数组,

首先我们来看一下前端jsp部分的代码,这里我用到了jquery来实现动态的添加文件下载框以及动态的删除下载框:

jsp页面的实现:

<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的实现:

public class FileUploadAction2 extends ActionSupport{    private String username;    
  //这里用List来存放上传过来的文件,file同样指的是临时文件夹中的临时文件,而不是真正上传过来的文件
private List<File> file;
  //这个List存放的是文件的名字,和List<File>中的文件相对应
private List<String> fileFileName; private List<String> fileContentType; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public List<File> getFile() { return file; } public void setFile(List<File> file) { this.file = file; } public List<String> getFileFileName() { return fileFileName; } public void setFileFileName(List<String> fileFileName) { this.fileFileName = fileFileName; } public List<String> getFileContentType() { return fileContentType; } public void setFileContentType(List<String> fileContentType) { this.fileContentType = fileContentType; } @Override public String execute() throws Exception { String root = ServletActionContext.getServletContext().getRealPath("/upload"); for(int i = 0; i < file.size(); i++) { InputStream is = new FileInputStream(file.get(i)); OutputStream os = new FileOutputStream(new File(root, fileFileName.get(i))); byte[] buffer = new byte[500]; @SuppressWarnings("unused") int length = 0; while(-1 != (length = is.read(buffer, 0, buffer.length))) { os.write(buffer); } os.close(); is.close(); } return SUCCESS; }}
复制代码

这样我们就实现了多个文件上传的功能。


多文件下载你跟单个文件下载的原理一样,在此就不详细解析了。









































0 0
原创粉丝点击