`
linzy410
  • 浏览: 8554 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

struts2文件上传

阅读更多
文件上传的原理:
表单元素的enctype属性指定的是表单数据的编码方式,该属性有3个值:
1)      application/x-www-form-urlencoded:这是默认编码方式,它只处理表单域里的value属性值,采用这种编码方式的表单会将表单域的值处理成URL编码方式。
2)      multipart/form-data:这种编码方式的表单会以二进制流的方式来处理表单数据,这种编码方式会把文件域指定文件的内容也封装到请求参数里。
3)      text/plain:这种方式主要适用于直接通过表单发送邮件的方式。
文件上传是web应用经常用到的一个知识。原理是,通过为表单元素设置enctype=”multipart/form-data”属性,让表单提交的数据以二进制编码的方式提交,在接收此请求的Servlet中用二进制流来获取内容,就可以取得上传文件的内容,从而实现文件的上传。
在Java领域中,有两个常用的文件上传项目:一个是Apache组织Jakarta的Common-FileUpload组件(http://commons.apache.org/fileupload/),另一个是Oreilly组织的COS框架(http://www.servlets.com/cos/)。利用这两个框架都能很方便的实现文件的上传。
Struts2的文件上传:
Struts2并未提供自己的请求解析器,也就是就Struts2不会自己去处理multipart/form-data的请求,它需要调用其他请求解析器,将HTTP请求中的表单域解析出来。但Struts2在原有的上传解析器基础上做了进一步封装,更进一步简化了文件上传。
Struts2默认使用的是Jakarta的Common-FileUpload框架来上传文件,因此,要在web应用中增加两个Jar文件:commons-fileupload-1.2.jar和commons-io-1.3.1.jar。它在原上传框架上做了进一步封装,简化了文件上传的代码实现,取消了不同上传框架上的编程差异。

具体使用FileUpload和内建的FileUploadInterceptor拦截器实现文件上传,所需的jar包如下:
    commons-logging-1.1.jar
    freemarker-2.3.8.jar
    ognl-2.6.11.jar
    struts2-core-2.0.6.jar
    xwork-2.0.1.jar
    commons-io-1.3.1.jar
    commons-fileupload-1.2.jar

文件上传页面 fileupload.jsp
<form action="/tiny_uploadImage.action" method="post" enctype="multipart/form-data">
    <input type="file" name="image" />
    <input type="submit" value="提交"/>
</form>


注意:enctype="multipart/form-data" 不能忘掉


TinyAction.java
import java.io.File;
import java.io.PrintWriter;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;

import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class TinyAction extends ActionSupport {

	/**
	 * 
	 */
	private static final long serialVersionUID = 5908981338203682183L;
	
	private File image;	
	private String imageFileName;   
        private String imageContentType;   
	
	public String uploadImage() throws Exception{
		String targetDirectory = "e:/upload/";   // 指定保存地址
            String targetFileName = generateFileName(imageFileName);   
            File target = new File(targetDirectory, targetFileName);   
           
            FileUtils.copyFile(image, target);              

	}

	/**
	 * 生成保存的文件名称
	 * @param fileName
	 * @return
	 */
	private String generateFileName(String fileName) {   
            DateFormat format = new SimpleDateFormat("yyMMddHHmmssSSS");   
            String formatDate = format.format(new Date());   
           
            int random = new Random().nextInt(10000);   
           
            int position = fileName.lastIndexOf(".");   
            String extension = fileName.substring(position);   
           
            return formatDate + random + extension;   
        }      

	public File getImage() {
		return image;
	}

	public void setImage(File image) {
		this.image = image;
	}

	public String getImageFileName() {
		return imageFileName;
	}

	public void setImageFileName(String imageFileName) {
		this.imageFileName = imageFileName;
	}

	public String getImageContentType() {
		return imageContentType;
	}

	public void setImageContentType(String imageContentType) {
		this.imageContentType = imageContentType;
	}

}

说明:在jsp中,只有image一个字段,而Action中,却有三个字段,Struts2怎么通过页面的一个字段设置Action里的三个字段呢?没错,这就是FileUploadInterceptor的功劳了!你所要做的只是按照一定的样式命名这三个字段的set方法,而字段名可以任意命名。第一个File类型的字段的set方法还是以常规的方式命名,另两个String类型的字段的set方法必须分别以“File字段的set方法名+FileName”和“File字段的set方法名+ContentType”来命名。
本例中就是image imageFileName imageContentType。

配置web.xml
没什么新意
<?xml version="1.0" encoding="UTF-8"?>  
<web-app version="2.4"    
    xmlns="http://java.sun.com/xml/ns/j2ee"    
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee    
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">  
       
    <filter>  
        <filter-name>struts-cleanup</filter-name>  
        <filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>  
    </filter>  
       
    <filter>  
        <filter-name>struts2</filter-name>  
        <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>  
    </filter>  
       
    <filter-mapping>  
        <filter-name>struts-cleanup</filter-name>  
        <url-pattern>/*</url-pattern>  
    </filter-mapping>  
       
    <filter-mapping>  
        <filter-name>struts2</filter-name>  
        <url-pattern>/*</url-pattern>  
    </filter-mapping>  
  
</web-app>


多文件上传
与单文件上传相似,Struts 2实现多文件上传也很简单。你可以将多个<s:file />绑定Action的数组或列表。如下例所示
 <form action="multiFileUpload.action" method="POST" enctype="multipart/form-data">

       <!-- 设置二个文件域,名字相同 -->
        选择第一个文件:<input type="file" name="upload" size="50"/><br/>
        选择第二个文件:<input type="file" name="upload" size="50"/><br/>
       <input type="submit" value=" 上传 "/>       
    </form>


Action中以数组或list实现
 private File[] uploads;
     private String[] uploadFileNames;
     private String[] uploadContentTypes;

     public File[] getUpload() { return this .uploads; } 
     public void setUpload(File[] upload) { this .uploads = upload; } 
 
     public String[] getUploadFileName() { return this .uploadFileNames; } 
     public void setUploadFileName(String[] uploadFileName) { this .uploadFileNames = uploadFileName; } 
 
     public String[] getUploadContentType() { return this .uploadContentTypes; } 
     public void setUploadContentType(String[] uploadContentType) { this .uploadContentTypes = uploadContentType; }


list方式
private List < File > uploads = new ArrayList < File > ();
     private List < String > uploadFileNames = new ArrayList < String > ();
     private List < String > uploadContentTypes = new ArrayList < String > ();

     public List < File > getUpload() {
         return this .uploads;
    } 
     public void setUpload(List < File > uploads) {
         this .uploads = uploads;
    } 
 
     public List < String > getUploadFileName() {
         return this .uploadFileNames;
    } 
     public void setUploadFileName(List < String > uploadFileNames) {
         this .uploadFileNames = uploadFileNames;
    } 
 
     public List < String > getUploadContentType() {
         return this .uploadContentTypes;
    } 
     public void setUploadContentType(List < String > contentTypes) {
         this .uploadContentTypes = contentTypes;
    }


分享到:
评论

相关推荐

    struts2文件上传和下载

    struts2文件上传和下载 struts2文件上传和下载 struts2文件上传和下载 struts2文件上传和下载 struts2文件上传和下载

    struts2 文件上传

    struts2 文件上传 struts2上传标签file fileuploadstruts2 文件上传 struts2上传标签file fileuploadstruts2 文件上传 struts2上传标签file fileupload

    struts2文件上传实例

    struts2文件上传实例,程序员宝典......

    struts2文件上传jar

    里面包括的是实现struts2文件上传所需要的全部jar包

    Struts2文件上传

    Struts2文件上传

    Struts2 文件上传

    Struts2 文件上传

    Struts2文件上传源码

    Struts2文件上传源码 Struts2文件上传源码 Struts2文件上传源码 Struts2文件上传源码 Struts2文件上传源码

    struts2文件上传与下载

    struts2文件上传与下载,eclipse与myeclipse导入即可使用的代码,简单易懂,希望对你有帮助,喜欢的给个五星评价,谢谢!!!

    struts2 文件上传功能

    Struts 2是通过Commons FileUpload文件上传。Commons FileUpload通过将HTTP的数据保存到临时文件夹,然后Struts使用fileUpload拦截器将文件绑定到Action的实例中。从而我们就能够以本地文件方式的操作浏览器上传的...

    struts2文件上传下载源代码

    http://blog.csdn.net/johnjobs/article/details/8076832博文中附件的下载链接

Global site tag (gtag.js) - Google Analytics