• 【SSH2(实用文章)】--Struts2文件上传和下载的例子


           回想一下,再上一篇文章Struts2实现机制,该步骤做一步一步来解决,这种决心不仅要理清再次Struts2用法。映射机制及其在深入分析。最后一个例子来介绍Struts2一种用法,这里将做一个有关文件上传下载的实例。


    一、文件上传


           Struts2并没有提供文件上传的组件。所以想要实现上传的功能就必须通过第三方组件来实现。在Struts2引用的jar中包括了文件上传的组件。它是通过commons-fileupload.jar和commons-io.jar来实现的。

    这当中的处理细节不须要太懂。在使用中慢慢思考就能够做到灵活运用。


      1、首先编写Action类

           该类名称为downloadAction.java,必须在该类中引入java.io。文件上传的核心实现使用的还是java的数据流io操作。

    package com.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 uploadAction extends ActionSupport {
    	
    	private File file;
    	
    	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;
    	}
    
    	//文件名
    	private String fileFileName;
    	
    	//文件类型
    	private String fileContentType;
    	//注意:文件名和文件类型的名称前缀必须同样,
    	
    	@Override
    	public String execute() throws Exception{	
    		
    		//获取须要上传文件的文件路径
    		File uploadFile=new File(ServletActionContext.getServletContext().getRealPath("uploadFile"));
    		//推断文件是否上传,假设上传的话将会创建该文件夹
    		if(!uploadFile.exists()){
    			uploadFile.mkdir();	//创建该文件夹
    		}
    		
    		//第一种文件上传的方法
    		//声明文件输入流,为输入流指定文件路径
    		FileInputStream input=new FileInputStream(file);
    		//获取输出流,获取文件的文件地址及名称
    		FileOutputStream out=new FileOutputStream(uploadFile + "\" +fileFileName);
    		
    		try{
    			byte[] b=new byte[1024];//每次写入的大小
    			int i=0;
    			while((i=input.read(b))>0){
    				out.write(b,0,i);
    			}
    		}catch(Exception e){
    			e.printStackTrace();
    		}finally{
    			input.close();
    			out.close();
    		}
    		
    		
    		
    		//另外一种文件上传的方法
    		//FileUtils.copyFile(upload,new File(uploadFile+"\"+uploadFileName));
    		//FileUtils.copyFile(upload,new File(uploadFile,uploadFileName));
    		
    		//第三种方法
    //		BufferedReader bReader=new BufferedReader(new InputStreamReader(new FileInputStream(upload)));
    //		BufferedWriter bWriter=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(uploadFile+"\"+uploadFileName)));
    		
    //		try{
    //			char[] str=new char[1024];
    //			int i=0;
    //			while((i=bReader.read(str))>0){
    //				bWriter.write(str,0,i); 
    //			}
    //		}catch(Exception e){
    //			e.printStackTrace();
    //		}finally{
    //			bReader.close();
    //			bWriter.close();
    //			uploadFile.delete();
    //		}
    		
    		return "success";
    	}
    
    }
    

            Action类中须要注意的是文件名称和文件类型的命名都是有要求的。文件名称和文件类型的前缀必须是文件变量,而且要和jsp页面中加入的文件名称称一致,如上例中的jsp标签为:<input type='File' name='file'>,在Action类中的文件名称称和文件类型必须对应为fileXXX和fileXXX。另外也能够在该Action类中配置其他上传属性,如:能够通过maximumSize指定上传文件的大小,allowedTypes运行上传文件的类型。

           上面的Action类指定了三种上传方法,它们操作的核心还是java.io。通过数据流的读入和写出来实现文件的上传。当中第一种和第三种採用的是java.io流操作,而另外一种採用的是common.io流操作。


       2、struts2.xml对应的action配置

           action类编写完毕后。接下来要把它配置到对应的action标签中。这样在运行action时会依据注冊类运行内部的方法。详细配置方法例如以下实例。

    <package name="upload" namespace="/file" extends="struts-default">
    	<action name="upload" class="uploadAction">
    		<result name="success">/success.jsp</result>
    		<result name="error">/error.jsp</result>
    		<result name="input">/index.jsp</result>
    		<param name="savePath">/upload</param>
    	</action>
    </package>
    

       3、最后配置对应的jsp页面

            在配置时须要注意的是文件的编码格式,须要改成multipart/form-data类型。是指把文件及文件的内容都提交,另外enctype还有两个属性值各自是text/plain。指定了表单是以文本的方式进行提交。application/x-www-form-urlencoded这是默认的编码方式,提交时,仅仅提交表单域的value属性值。

    <body>
    	<form action="file/upload" method="post" enctype="multipart/form-data">
    		<input type="file" name="upload">
    		<input type="submit" name="btnUpload" value="上传">
    	</form>
    </body>

         最后提交。查看提交结果,提交后的文件默认存放在.metadata.pluginsorg.eclipse.wst.server.core mp0wtpwebapps项目名称uploadFile下。所以在编写action类时须要获取文件上传的路径使用的是getRealPath("uploadFile")。


    二、文件下载


          相较上传,文件的下载编写起来相交就简单多了。首先也须要加入下载的action类。然后配置struts.xml中的action,最后在jsp中加入链接标签。


      1、加入下载action类

           加入的action类指定要注意获取文件的输出路径,通过获取输出流来获取文件的路径。


    package com.action;
    
    import java.io.InputStream;
    
    import org.apache.struts2.ServletActionContext;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    public class downloadAction extends ActionSupport {
    	
    	private InputStream fileInput;
    	private String fileName;
    
    	public String getFileName() {
    		return fileName;
    	}
    
    	public void setFileName(String fileName) {
    		this.fileName = fileName;
    	}
    
    	public InputStream getFileInput() {
    		return ServletActionContext.getServletContext().getResourceAsStream("upload\"+fileName);
    	}
    
    	public void setFileInput(InputStream fileInput) {
    		this.fileInput = fileInput;
    	}
    	
    	public String execute() throws Exception{
    		fileInput=ServletActionContext.getServletContext().getResourceAsStream("upload\"+fileName);
    		return "success";
    	}
    }
    

       2、配置struts.xml标签

            在配置时结果类型要指定type类型,将它赋值为stream,并加入属性以下的属性,该属性相同能够配置到拦截器中,在拦截器中指定配置的文件。

    <action name="download" class="com.action.downloadAction">
        	<result name="success" type="stream">
    		<param name="inputName">fileInput</param>
    		<param name="contentDispostion">attachment;filename="$(fileName)"</param>
    	</result>
    </action>


        3、jsp页面代码

           jsp代码就非常easy了,不多说看代码。

    <body>
    	<a href="file/download">123.txt</a>
    </body>

    结语


            通过使用文件的上传下载功能来熟悉Struts2的用法,并了解Servlet请求的基本用法,为以后深入学习Servlet打下基础。struts的文件上传和下载使用的是io流操作完毕的,能够使用java.io流,相同能够使用第三方的common.io流实现。我们将讨论在接下来的文章中涉及到多文件上传问题。

    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    搬家来博客园了
    公司初印象
    毕业之殇觉醒
    毕业之殇天意弄人
    毕业之殇预告篇
    scribe 安装文档
    毕业之殇寻找
    IOS 资料整理(转)
    IOS IPHONE相册应用 资料整理
    NSFileManager和NSFileHandle(附:获取文件大小 )
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4741470.html
Copyright © 2020-2023  润新知