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

銀河使者發表於2008-04-27
本文為原創,如需轉載,請註明作者和出處,謝謝!

一、上傳單個檔案

    上傳檔案是很多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 fileName;
        private String uploadContentType;
       
    public String getUploadFileName()
        {
                return fileName;
        }

        public void setUploadFileName(String fileName)
        {
                this.fileName = 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 s = new java.io.FileOutputStream("d:\upload\" + fileName);
                byte buffer[] = new byte[8192];
                int count = 0;
                while((count = is.read(buffer)) > 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頁面程式碼:





       
                上傳單個檔案
       

       
                                        enctype="multipart/form-data">
                       
                       
               

       


    也可以在success.jsp頁中通過獲得檔案的屬性(檔名和檔案內容型別),程式碼如下:

   

二、上傳任意多個檔案

    在Struts2中,上傳任意多個檔案也非常容易實現。首先,要想上傳任意多個檔案,需要在客戶端使用DOM技術生成任意多個標籤。name屬性值都相同。程式碼如下:


       
               

function addComponent()
{
        var uploadHTML = document.createElement( "");
            document.getElementById("files").appendChild(uploadHTML);
        uploadHTML = document.createElement( "

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

       
       
               
               

                                        method="post" enctype="multipart/form-data">
                       
                               


                       

                       
               
       



    上面的javascript程式碼可以生成任意多個標籤,name的值都為file。至於Action類,和上傳單個檔案的Action類基本一至,只需要將三個屬性的型別改為List即可。程式碼如下:

package action;

import java.io.*;
import com.opensymphony.xwork2.ActionSupport;

public class UploadMoreAction extends ActionSupport
{
        private java.util.List uploads;
        private java.util.List fileNames;
        private java.util.List uploadContentTypes;

        public java.util.List getUploadFileName()
        {
                return fileNames;
        }
        public void setUploadFileName(java.util.List fileNames)
        {
                this.fileNames = fileNames;
        }
        public java.util.List getUpload()
        {
                return uploads;
        }

        public void setUpload(java.util.List uploads)
        {
                this.uploads = uploads;
        }

        public void setUploadContentType(java.util.List contentTypes)
        {
                this.uploadContentTypes = contentTypes;

        }

        public java.util.List getUploadContentType()
        {
                return this.uploadContentTypes;
        }

        public String execute() throws Exception
        {
                if (uploads != null)
                {
                        int i = 0;
                        for (; i < uploads.size(); i++)
                        {
                                java.io.InputStream is = new java.io.FileInputStream(uploads.get(i));
                                java.io.OutputStream s = new java.io.FileOutputStream(
                                                "d:\upload\" + fileNames.get(i));
                                byte buffer[] = new byte[8192];
                                int count = 0;
                                while ((count = is.read(buffer)) > 0)
                                {
                                        os.write(buffer, 0, count);
                                }
                                os.close();
                                is.close();
                        }
                }
                return SUCCESS;
        }
}

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

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


圖1


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

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12921506/viewspace-255113/,如需轉載,請註明出處,否則將追究法律責任。

相關文章