自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Struts2教程:上傳任意多個文件

開發(fā) 后端
本文為Struts2教程,本部分教你如何上傳任意多個文件。Struts2雖然在大版本號上是第二個版本,但基本上在配置和使用上已經(jīng)完全顛覆了Struts1.x的方式。

一、上傳單個文件

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

要用Struts2實現(xiàn)上傳單個文件的功能非常容易實現(xiàn),只要使用普通的Action即可。但為了獲得一些上傳文件的信息,如上傳文件名、上傳文件類型以及上傳文件的Stream對象,就需要按著一定規(guī)則來為Action類增加一些getter和setter方法。

在Struts2中,用于獲得和設(shè)置java.io.File對象(Struts2將文件上傳到臨時路徑,并使用java.io.File打開這個臨時文件)的方法是getUpload和setUpload。獲得和設(shè)置文件名的方法是getUploadFileName和setUploadFileName,獲得和設(shè)置上傳文件內(nèi)容類型的方法是getUploadContentType和setUploadContentType。下面是用于上傳的動作類的完整代碼:

  1. package action;  
  2.  
  3. import java.io.*;  
  4. import com.opensymphony.xwork2.ActionSupport;  
  5.  
  6. public class UploadAction extends ActionSupport   
  7. {  
  8.     private File upload;  
  9.     private String fileName;  
  10.     private String uploadContentType;  
  11.       
  12.     public String getUploadFileName()  
  13.     {  
  14.         return fileName;  
  15.     }  
  16.  
  17.     public void setUploadFileName(String fileName)  
  18.     {  
  19.         this.fileName = fileName;  
  20.     }  
  21.  
  22.     public File getUpload()  
  23.     {  
  24.         return upload;  
  25.     }  
  26.  
  27.     public void setUpload(File upload)  
  28.     {  
  29.         this.upload = upload;  
  30.     }  
  31.     public void setUploadContentType(String contentType)  
  32.     {  
  33.         this.uploadContentType=contentType;  
  34.       
  35.     }  
  36.       
  37.     public String getUploadContentType()  
  38.     {  
  39.         return this.uploadContentType;  
  40.     }  
  41.     public String execute() throws Exception  
  42.     {     
  43.         java.io.InputStream is = new java.io.FileInputStream(upload);  
  44.         java.io.OutputStream os = new java.io.FileOutputStream("d:\\upload\\" + fileName);  
  45.         byte buffer[] = new byte[8192];  
  46.         int count = 0;  
  47.         while((count = is.read(buffer)) > 0)  
  48.         {  
  49.             os.write(buffer, 0, count);  
  50.         }  
  51.         os.close();  
  52.         is.close();  
  53.         return SUCCESS;  
  54.     }  
  55. }  

在execute方法中的實現(xiàn)代碼就很簡單了,只是從臨時文件復(fù)制到指定的路徑(在這里是d:\upload)中。上傳文件的臨時目錄的默認(rèn)值是javax.servlet.context.tempdir的值,但可以通過struts.properties(和struts.xml在同一個目錄下)的struts.multipart.saveDir屬性設(shè)置。Struts2上傳文件的默認(rèn)大小限制是2M(2097152字節(jié)),也可以通過struts.properties文件中的struts.multipart.maxSize修改,如struts.multipart.maxSize=2048 表示一次上傳文件的總大小不能超過2K字節(jié)。

下面的代碼是上傳文件的JSP頁面代碼:

  1.  
  2. < %@ page language="java" import="java.util.*" pageEncoding="GBK"%> 
  3. < %@ taglib prefix="s" uri="/struts-tags"%> 
  4.  
  5. < html> 
  6.     < head> 
  7.         < title>上傳單個文件< /title> 
  8.     < /head> 
  9.  
  10.     < body> 
  11.         < s:form action="upload" namespace="/test" 
  12.             enctype="multipart/form-data"> 
  13.             < s:file name="upload" label="輸入要上傳的文件名" /> 
  14.             < s:submit value="上傳" /> 
  15.         < /s:form> 
  16.  
  17.     < /body> 
  18. < /html> 

也可以在success.jsp頁中通過< s:property>獲得文件的屬性(文件名和文件內(nèi)容類型),代碼如下:

< s:property value="uploadFileName"/>

二、上傳任意多個文件

在Struts2中,上傳任意多個文件也非常容易實現(xiàn)。首先,要想上傳任意多個文件,需要在客戶端使用DOM技術(shù)生成任意多個< input type=”file” />標(biāo)簽。name屬性值都相同。代碼如下:

  1. < html> 
  2.     < head> 
  3.         < script language="javascript"> 
  4.  
  5. function addComponent()  
  6. {  
  7.         var uploadHTML = document.createElement( "< input type='file'  name='upload'/>");  
  8.         document.getElementById("files").appendChild(uploadHTML);  
  9.         uploadHTML = document.createElement( "< p/>");  
  10.         document.getElementById("files").appendChild(uploadHTML);  
  11. }  
  12. < /script> 
  13.     < /head> 
  14.     < body> 
  15.         < input type="button" onclick="addComponent();" value="添加文件" /> 
  16.         < br /> 
  17.         < form onsubmit="return true;" action="/struts2/test/upload.action" 
  18.             method="post" enctype="multipart/form-data"> 
  19.             < span id="files"> < input type='file' name='upload' /> 
  20.                 < p /> 
  21.             < /span> 
  22.             < input type="submit" value="上傳" /> 
  23.         < /form> 
  24.     < /body> 
  25.  
  26. < /html> 

上面的javascript代碼可以生成任意多個< input type=’file’>標(biāo)簽,name的值都為file(要注意的是,上面的javascript代碼只適合于IE瀏覽器,firefox等其他瀏覽器需要使用他的代碼)。至于Action類,和上傳單個文件的Action類基本一至,只需要將三個屬性的類型改為List即可。代碼如下:

  1. package action;  
  2.  
  3. import java.io.*;  
  4. import com.opensymphony.xwork2.ActionSupport;  
  5.  
  6. public class UploadMoreAction extends ActionSupport  
  7. {  
  8.     private java.util.List< File> uploads;  
  9.     private java.util.List< String> fileNames;  
  10.     private java.util.List< String> uploadContentTypes;  
  11.  
  12.     public java.util.List< String> getUploadFileName()  
  13.     {  
  14.         return fileNames;  
  15.     }  
  16.     public void setUploadFileName(java.util.List< String> fileNames)  
  17.     {  
  18.         this.fileNames = fileNames;  
  19.     }  
  20.     public java.util.List< File> getUpload()  
  21.     {  
  22.         return uploads;  
  23.     }  
  24.  
  25.     public void setUpload(java.util.List< File> uploads)  
  26.     {  
  27.         this.uploads = uploads;  
  28.     }  
  29.  
  30.     public void setUploadContentType(java.util.List< String> contentTypes)  
  31.     {  
  32.         this.uploadContentTypes = contentTypes;  
  33.  
  34.     }  
  35.  
  36.     public java.util.List< String> getUploadContentType()  
  37.     {  
  38.         return this.uploadContentTypes;  
  39.     }  
  40.  
  41.     public String execute() throws Exception  
  42.     {  
  43.         if (uploads != null)  
  44.         {  
  45.             int i = 0;  
  46.             for (; i <  uploads.size(); i++)  
  47.             {  
  48.                 java.io.InputStream is = new java.io.FileInputStream(uploads.get(i));  
  49.                 java.io.OutputStream os = new java.io.FileOutputStream(  
  50.                         "d:\\upload\\" + fileNames.get(i));  
  51.                 byte buffer[] = new byte[8192];  
  52.                 int count = 0;  
  53.                 while ((count = is.read(buffer)) > 0)  
  54.                 {  
  55.                     os.write(buffer, 0, count);  
  56.                 }  
  57.                 os.close();  
  58.                 is.close();  
  59.             }  
  60.         }  
  61.         return SUCCESS;  
  62.     }  
  63. }  

在execute方法中,只是對List對象進(jìn)行枚舉,在循環(huán)中的代碼和上傳單個文件時的代碼基本相同。如果讀者使用過struts1.x的上傳組件,是不是感覺Struts2的上傳功能更容易實現(xiàn)呢?在Struts1.x中上傳多個文件時,可是需要建立帶索引的屬性的。而在Struts2中,就是這么簡單就搞定了。圖1是上傳任意多個文件的界面。

上傳任意多個文件的界面


圖1

【編輯推薦】

  1. Struts2教程:在Action類中獲得HttpServletResponse對象
  2. Struts2教程:使用Validation框架驗證數(shù)據(jù)
  3. Struts2教程:使用validate方法驗證數(shù)據(jù)
  4. Struts2教程:struts.xml常用配置解析
  5. Struts2教程:處理一個form多個submit
責(zé)任編輯:yangsai 來源: BlogJava
相關(guān)推薦

2009-02-04 14:00:59

2009-06-04 09:41:50

struts2上傳文件

2009-06-25 15:11:28

Struts2教程Struts2程序

2009-02-04 11:00:44

2009-06-08 16:44:00

Struts2文件上傳

2009-06-25 15:22:03

Struts2教程一個form多個sub

2009-02-04 10:51:07

2009-06-03 14:19:34

Struts2Guice

2009-06-25 16:04:30

2009-06-25 15:26:25

Struts2教程struts.xml常

2009-06-04 08:34:24

Struts2配置struts.xml

2009-02-04 15:04:13

2009-06-25 15:54:42

Struts2教程攔截器

2009-02-04 11:37:15

2009-07-29 09:54:34

struts2和str

2009-06-25 15:33:12

Struts2教程使用validate驗證數(shù)據(jù)

2009-02-04 14:19:38

2009-06-25 15:37:12

Struts2教程Validation框

2009-06-25 15:59:21

Struts2教程攔截器

2009-02-04 12:00:08

點贊
收藏

51CTO技術(shù)棧公眾號