Struts2文件上传与下载

  一,页面 index.html

    在页面中最重要的就是这个文件上传用的 form 表单,注意这里一定要把 form 的encyType属性明确标定为“multipart/form-data”,只有这样。表单才可能以二进制的形式上传到服务器。

<form action = "<%=contextPath%>/file/uploadImage.action" encytype="multipart/form-data">

    <input type="file" name="upload"/>

    <input type="submit" value="上传"/>

</form>

  

 二,业务处理类 FileAction

    1,当页面中的文件上传表被提交时,上传的文件会被Struts拦截器处理。并被填充到与页面中相应的<input type="file">标签的name属性相同的File类型的属性中。因为上面的index.html页面中相应的标签name属性值为“upload”,那么在下面的程序中对应的属性就是这个 private File upload 属性。

    同时有两个相关的string类型的属性也将被填充。一个是 String ##FileName属性(保存有上传文件的原名),一个是String ##ContentType属性(保存了上传文件的内容类型,如“text/plain”,"image/png")。##代表的同样是页面中相应的<input type="file">标签的name属性值。so,现在你已经拿到了代表被上传文件的 File 类型对象。现在你可以把它保存到本地文件夹,甚至上传到FTP服务器 (如果要操作FTP服务器,推荐使用Apache组织的 comment-net 工具包) 。

    2,当要从服务器下载文件时,情况稍有不同。当下载时,Action业务类中相应的方法不可以再返回String类型的返回值,应当返回一个 InputStream 流对象。这个流对象的内容就应该是要被下载的文件(参见下面程序中的)。

public class FileAction extends ActionSupport{

    private File upload;

    private String uploadFileName;

    private String uploadContentType;

    //**不要忘了为这三个属性设置setter和getter方法**//

 

    /**

    * 文件存储过程

    */

        public String uploadFile(){

        //存储文件。。。。。。

        System.out.println(uploadFileName);

        return "success";

    }

 

    /**

    * 文件下载

    * @return 返回代表文件的输入流(为什么会返回输入流而不是输出流,因为写程序时请注意你的位置一直是“内存”,应    * 该站在内存的位置思考问题。现在要从存储介质上读取数据到服务器内存,然后再由服务器发送到客户端。所以从内存    * 的角度看,此方法的作用是在读入文件到内存。所以应当是文件输入流,文件内容流向你所在的位置。)

    */

    public InputStream getDownloadFile(){

        InputStream file = ********;//读取文件

        return ;

    }

}

  

三,struts.xml 配置文件

    当使用Struts2进行文件上传时,在配置文件中并不能看出与普通action有何区别,这使得使用Struts2上传文件变得简单并普通。

    当使用Struts2进行文件下时,情况略有不同,但是与普通Action的差别并不是很大,差别有以下几点:

    1,此action不要指定method属性(原因见下面)。

    2,该action只有一个result,且其name属性指定为“success” type属性必须为“stream”

    3,这个唯一的result的内容不是一个页面路径。而是四个 param 属性

        (1)contentType 指定下载内容的MIME类型

        (2)contentDisposition 可以在此指定下载后的文件名称

        (3)inputName 指定输入流的来源,上文说的不要为此action指定method就是因为这个属性的原因,在上面的FileAction类中 有个 getDownLoad 方法,下面xml文件中指定的inputName属性的值就是指定了这个方法。而这个方法正好返回一个InputStream对象。

        (4)bufferSize 缓冲区大小。这个就不多说了。

<package name="file" namespace="/file" extends="struts-default">

    <action name="uploadImage" class="org.toybrick.strutsfile.FileAction" method="uploadFile">

        <result name="input">/index.html</result>

    </action>

    <action name="download" class="org.toybrick.strutsfile.FileAction">

        <result name="success" type="stream">

            <param name="contentType">image/png</param>

            <param name="contentDisposition">filename="iamge.png"</param>

            <param name="inputName">downloadFile</param>

            <param name="bufferSize">2048</param>

        </result>

    </action>

</package>

  

你可能感兴趣的:(struts2)