7.Struts2的文件上传

l          Struts2的文件上传是基于第三方组件的,需要包含相应jar包,其中以apache的commons-io.jar与commons-fileupload.jar使用最多。

l          文件上传action的简单写法

package edu.yzu.action;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.InputStream;

import java.io.OutputStream;

import java.util.List;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

@SuppressWarnings("serial")

public class FileUpLoadAction extends ActionSupport {

    private File photo;// file控件的名字

    private String photoFileName;// 提交上来的文件的名字。不能随便命名

    // 必须与相应字段对应。

    private String photoContentType;

//上传文件的类型(如果word文件的类型为application/msword,这此可以在tomcat配置文件web.xml中找到,

//这个类型对限制上传文件类型也很有用)。也不能随便命名。这两个字段如此命名的原因可以在struts的FileUploadInterceptor

//源码中找到

   

   

/*下面这种搞法可以同时接收几个文件的上传,

 * 但是有点要注意,上传的file控件的name必须要一样,

 * 接收上来的文件按顺序存在files中,

 * 对应文件的文件名存在filesFileName中,

 * 对应文件类型则存在filesContentType中,

 * 这种搞法在不确定,或者可以在客户端动态改变上传文件个数时极有用,

 * 如给邮件添加附件等

 */

/*

private List<File> files;

private List<String>filesFileName;

private List<String>filesContentType;

 

    public List<File> getFiles() {

    return files;

}

public void setFiles(List<File> files) {

    this.files = files;

}

public List<String> getFilesFileName() {

    return filesFileName;

}

 

public void setFilesFileName(List<String> filesFileName) {

    this.filesFileName = filesFileName;

}

public List<String> getFilesContentType() {

    return filesContentType;

}

public void setFilesContentType(List<String> filesContentType) {

    this.filesContentType = filesContentType;

}

*/

    public File getPhoto() {

        return photo;

    }

    public void setPhoto(File photo) {

        this.photo = photo;

    }

    public String getPhotoFileName() {

        return photoFileName;

    }

    public void setPhotoFileName(String photoFileName) {

        this.photoFileName = photoFileName;

    }

    public String getPhotoContentType() {

        return photoContentType;

    }

    public void setPhotoContentType(String photoContentType) {

        this.photoContentType = photoContentType;

    }

    @Override

    public String execute() throws Exception {

        System.out.println(photoContentType);

        InputStream input = new FileInputStream(photo);

        //得到文件的上传后保存的地方

        String path = ServletActionContext.getServletContext().getRealPath(

                "/images/users");

        File savefile = new File(path, this.getPhotoFileName());

        OutputStream output = new FileOutputStream(savefile);

        byte[] buffer = new byte[1024];

        int length = 0;

        while ((length = input.read(buffer)) > 0) {

            output.write(buffer, 0, length);

        }

        output.close();

        input.close();

        return SUCCESS;

    }

}

l          限制文件上传的配置,可以限制每个上传文件的大小,上传文件的类型等(可以struts的FileUploadInterceptor的源码中查看到,类型的写法在tomcat的web.xml中找到)

 <action name="upload" class="edu.yzu.action.FileUpLoadAction">

<result>/loadok.jsp</result>

<result name="input">/upload.jsp</result>

<interceptor-ref name="fileUpload">

<!-- 多个允许类型可用逗号分开,源码可查!

如果一个不被允许的文件上传,则后引发错误,这个错误消息也放在filederror里面,

一旦发生这个错误,则会转回到input对应的路径上去!这些错误的消息并不太好处理,

所以跟类型转换出现错误一样,struts2使此类错误可以国际化,以方便配置,及按需显示。

这些配置可以在struts-messages.properties中找到,然后在自己的国际化文件中配置即可

如上传文件类型不被允许的错误为:struts.messages.error.content.type.not.allowed

可以在国际化文件中这么配置:struts.messages.error.content.type.not.allowed=file type is error!以指定自己的

想要显示的消息!

这个action配置了两次fileUpload这个拦截器,这并不会引发错,但没有这个必要。

拦截器配置几次执行几次拦截,并且拦截器的执行顺序与配置顺序一致

 -->

<param name="allowedTypes">application/msword</param>

</interceptor-ref>

<!-- 一旦一个action显示配置了一个拦截器,则默认拦截器将不起作用,如果需要则要显示引入 -->

<interceptor-ref name="defaultStack"></interceptor-ref>

</action>  

posted @ 2010-05-03 17:02  沉兮  阅读(361)  评论(0编辑  收藏  举报