天天看點

Struts2教程7:上傳任意多個檔案

本文為原創,如需轉載,請注明作者和出處,謝謝!

<a href="http://www.blogjava.net/nokiaguy/archive/2008/04/22/194846.html" target="_blank"></a>

一、上傳單個檔案

    上傳檔案是很多Web程式都具有的功能。在Struts1.x中已經提供了用于上傳檔案的元件。而在Struts2中提供了一個更為容易操作的上傳檔案元件。所不同的是,Struts1.x的上傳元件需要一個ActionForm來傳遞檔案,而Struts2的上傳元件是一個攔截器(這個攔截器不用配置,是自動裝載的)。在本文中先介紹一下如何用struts2上傳單個檔案,最後介紹一下用struts2上傳任意多個檔案。

    要用Struts2實作上傳單個檔案的功能非常容易實作,隻要使用普通的Action即可。但為了獲得一些上傳檔案的資訊,如上傳檔案名、上傳檔案類型以及上傳檔案的Stream對象,就需要按着一定規則來為Action類增加一些getter和setter方法。

    在Struts2中,用于獲得和設定java.io.File對象(Struts2将檔案上傳到臨時路徑,并使用java.io.File打開這個臨時檔案)的方法是getUpload和setUpload。獲得和設定檔案名的方法是getUploadFileName和setUploadFileName,獲得和設定上傳檔案内容類型的方法是getUploadContentType和setUploadContentType。下面是用于上傳的動作類的完整代碼:

package action;

import java.io.*;

import com.opensymphony.xwork2.ActionSupport;

public class UploadAction extends ActionSupport 

{

    private File upload;

    private String uploadFileName;

    private String uploadContentType;

    public String getUploadFileName()

    {

        return uploadFileName;

    }

    public void setUploadFileName(String fileName)

        this.uploadFileName = fileName;

    public File getUpload()

        return upload;

    public void setUpload(File upload)

        this.upload = upload;

    public void setUploadContentType(String contentType)

        this.uploadContentType=contentType;

    public String getUploadContentType()

        return this.uploadContentType;

    public String execute() throws Exception

    {   

        java.io.InputStream is = new java.io.FileInputStream(upload);

        java.io.OutputStream os = new java.io.FileOutputStream("d://upload//" + uploadFileName);

        byte buffer[] = new byte[8192];

        int count = 0;

        while((count = is.read(buffer)) &gt; 0)

        {

            os.write(buffer, 0, count);

        }

        os.close();

        is.close();

        return SUCCESS;

}

    在execute方法中的實作代碼就很簡單了,隻是從臨時檔案複制到指定的路徑(在這裡是d:/upload)中。上傳檔案的臨時目錄的預設值是javax.servlet.context.tempdir的值,但可以通過struts.properties(和struts.xml在同一個目錄下)的struts.multipart.saveDir屬性設定。Struts2上傳檔案的預設大小限制是2M(2097152位元組),也可以通過struts.properties檔案中的struts.multipart.maxSize修改,如struts.multipart.maxSize=2048 表示一次上傳檔案的總大小不能超過2K位元組。

    下面的代碼是上傳檔案的JSP頁面代碼:

&lt;%@ page language="java" import="java.util.*" pageEncoding="GBK"%&gt;

&lt;%@ taglib prefix="s" uri="/struts-tags"%&gt;

&lt;html&gt;

    &lt;head&gt;

        &lt;title&gt;上傳單個檔案&lt;/title&gt;

    &lt;/head&gt;

    &lt;body&gt;

        &lt;s:form action="upload" namespace="/test"

            enctype="multipart/form-data"&gt;

            &lt;s:file name="upload" label="輸入要上傳的檔案名" /&gt;

            &lt;s:submit value="上傳" /&gt;

        &lt;/s:form&gt;

    &lt;/body&gt;

&lt;/html&gt;

也可以在success.jsp頁中通過&lt;s:property&gt;獲得檔案的屬性(檔案名和檔案内容類型),代碼如下:

    &lt;s:property value="uploadFileName"/&gt;

二、上傳任意多個檔案

    在Struts2中,上傳任意多個檔案也非常容易實作。首先,要想上傳任意多個檔案,需要在用戶端使用DOM技術生成任意多個&lt;input type=”file” /&gt;标簽。name屬性值都相同。代碼如下:

        &lt;script language="javascript"&gt;

function addComponent()

        var uploadHTML = document.createElement( "&lt;input type='file'  name='upload'/&gt;");

        document.getElementById("files").appendChild(uploadHTML);

        uploadHTML = document.createElement( "&lt;p/&gt;");

&lt;/script&gt;

        &lt;input type="button" onclick="addComponent();" value="添加檔案" /&gt;

        &lt;br /&gt;

        &lt;form onsubmit="return true;" action="/struts2/test/upload.action"

            method="post" enctype="multipart/form-data"&gt;

            &lt;span id="files"&gt; &lt;input type='file' name='upload' /&gt;

                &lt;p /&gt;

            &lt;/span&gt;

            &lt;input type="submit" value="上傳" /&gt;

        &lt;/form&gt;

     上面的javascript代碼可以生成任意多個&lt;input type=’file’&gt;标簽,name的值都為file(要注意的是,上面的javascript代碼隻适合于IE浏覽器,firefox等其他浏覽器需要使用他的代碼)。至于Action類,和上傳單個檔案的Action類基本一至,隻需要将三個屬性的類型改為List即可。代碼如下:

public class UploadMoreAction extends ActionSupport

    private java.util.List&lt;File&gt; uploads;

    private java.util.List&lt;String&gt; uploadsFileName;

    private java.util.List&lt;String&gt; uploadsContentType;

    public java.util.List&lt;String&gt; getUploadsFileName()

    public void setUploadFileName(java.util.List&lt;String&gt; fileNames)

        this.uploadFileName = fileNames;

    public java.util.List&lt;File&gt; getUploads()

        return uploads;

    public void setUploads(java.util.List&lt;File&gt; uploads)

        this.uploads = uploads;

    public void setUploadsContentType(java.util.List&lt;String&gt; contentTypes)

        this.uploadsContentType = contentTypes;

    public java.util.List&lt;String&gt; getUploadsContentType()

        return this.uploadsContentType;

        if (uploads != null)

            int i = 0;

            for (; i &lt; uploads.size(); i++)

            {

                java.io.InputStream is = new java.io.FileInputStream(uploads.get(i));

                java.io.OutputStream os = new java.io.FileOutputStream(

                        "d://upload//" + uploadsFileName.get(i));

                byte buffer[] = new byte[8192];

                int count = 0;

                while ((count = is.read(buffer)) &gt; 0)

                {

                    os.write(buffer, 0, count);

                }

                os.close();

                is.close();

            }

    在execute方法中,隻是對List對象進行枚舉,在循環中的代碼和上傳單個檔案時的代碼基本相同。如果讀者使用過struts1.x的上傳元件,是不是感覺Struts2的上傳功能更容易實作呢?在Struts1.x中上傳多個檔案時,可是需要建立帶索引的屬性的。而在Struts2中,就是這麼簡單就搞定了。圖1是上傳任意多個檔案的界面。

Struts2教程7:上傳任意多個檔案

圖1

    在本文中給出了用Struts2上傳任意多個檔案的一個方法,如果哪位讀者有更好的方法,請跟貼!

<a href="http://www.eoeandroid.com/forumdisplay.php?fid=4">國内最棒的Google Android技術社群(eoeandroid),歡迎通路!</a>