struts2文件上傳

[b]文件上傳的原理:[/b]
表單元素的enctype屬性指定的是表單數據的編碼方式,該屬性有3個值:
1) application/x-www-form-urlencoded:這是默認編碼方式,它只處理表單域裏的value屬性值,採用這種編碼方式的表單會將表單域的值處理成URL編碼方式。
2) multipart/form-data:這種編碼方式的表單會以二進制流的方式來處理表單數據,這種編碼方式會把文件域指定文件的內容也封裝到請求參數裏。
3) text/plain:這種方式主要適用於直接通過表單發送郵件的方式。
文件上傳是web應用經常用到的一個知識。原理是,通過爲表單元素設置enctype=”multipart/form-data”屬性,讓表單提交的數據以二進制編碼的方式提交,在接收此請求的Servlet中用二進制流來獲取內容,就可以取得上傳文件的內容,從而實現文件的上傳。
在Java領域中,有兩個常用的文件上傳項目:一個是Apache組織Jakarta的Common-FileUpload組件(http://commons.apache.org/fileupload/),另一個是Oreilly組織的COS框架(http://www.servlets.com/cos/)。利用這兩個框架都能很方便的實現文件的上傳。
[b] Struts2的文件上傳:[/b]
Struts2並未提供自己的請求解析器,也就是就Struts2不會自己去處理multipart/form-data的請求,它需要調用其他請求解析器,將HTTP請求中的表單域解析出來。但Struts2在原有的上傳解析器基礎上做了進一步封裝,更進一步簡化了文件上傳。
Struts2默認使用的是Jakarta的Common-FileUpload框架來上傳文件,因此,要在web應用中增加兩個Jar文件:commons-fileupload-1.2.jar和commons-io-1.3.1.jar。它在原上傳框架上做了進一步封裝,簡化了文件上傳的代碼實現,取消了不同上傳框架上的編程差異。

具體使用FileUpload和內建的FileUploadInterceptor攔截器實現文件上傳,所需的jar包如下:
commons-logging-1.1.jar
freemarker-2.3.8.jar
ognl-2.6.11.jar
struts2-core-2.0.6.jar
xwork-2.0.1.jar
commons-io-1.3.1.jar
commons-fileupload-1.2.jar

[b]文件上傳頁面 fileupload.jsp[/b]

<form action="/tiny_uploadImage.action" method="post" enctype="multipart/form-data">
<input type="file" name="image" />
<input type="submit" value="提交"/>
</form>


注意:enctype="multipart/form-data" 不能忘掉


[b]TinyAction.java[/b]

import java.io.File;
import java.io.PrintWriter;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;

import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class TinyAction extends ActionSupport {

/**
*
*/
private static final long serialVersionUID = 5908981338203682183L;

private File image;
private String imageFileName;
private String imageContentType;

public String uploadImage() throws Exception{
String targetDirectory = "e:/upload/"; // 指定保存地址
String targetFileName = generateFileName(imageFileName);
File target = new File(targetDirectory, targetFileName);

FileUtils.copyFile(image, target);

}

/**
* 生成保存的文件名稱
* @param fileName
* @return
*/
private String generateFileName(String fileName) {
DateFormat format = new SimpleDateFormat("yyMMddHHmmssSSS");
String formatDate = format.format(new Date());

int random = new Random().nextInt(10000);

int position = fileName.lastIndexOf(".");
String extension = fileName.substring(position);

return formatDate + random + extension;
}

public File getImage() {
return image;
}

public void setImage(File image) {
this.image = image;
}

public String getImageFileName() {
return imageFileName;
}

public void setImageFileName(String imageFileName) {
this.imageFileName = imageFileName;
}

public String getImageContentType() {
return imageContentType;
}

public void setImageContentType(String imageContentType) {
this.imageContentType = imageContentType;
}

}

說明:在jsp中,只有image一個字段,而Action中,卻有三個字段,Struts2怎麼通過頁面的一個字段設置Action裏的三個字段呢?沒錯,這就是FileUploadInterceptor的功勞了!你所要做的只是按照一定的樣式命名這三個字段的set方法,而字段名可以任意命名。第一個File類型的字段的set方法還是以常規的方式命名,另兩個String類型的字段的set方法必須分別以“File字段的set方法名+FileName”和“File字段的set方法名+ContentType”來命名。
本例中就是image imageFileName imageContentType。

[b]配置web.xml[/b]
沒什麼新意

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

<filter>
<filter-name>struts-cleanup</filter-name>
<filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>
</filter>

<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>

<filter-mapping>
<filter-name>struts-cleanup</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

</web-app>


[b]多文件上傳[/b]
與單文件上傳相似,Struts 2實現多文件上傳也很簡單。你可以將多個<s:file />綁定Action的數組或列表。如下例所示

<form action="multiFileUpload.action" method="POST" enctype="multipart/form-data">

<!-- 設置二個文件域,名字相同 -->
選擇第一個文件:<input type="file" name="upload" size="50"/><br/>
選擇第二個文件:<input type="file" name="upload" size="50"/><br/>
<input type="submit" value=" 上傳 "/>
</form>


Action中以數組或list實現

private File[] uploads;
private String[] uploadFileNames;
private String[] uploadContentTypes;

public File[] getUpload() { return this .uploads; }
public void setUpload(File[] upload) { this .uploads = upload; }

public String[] getUploadFileName() { return this .uploadFileNames; }
public void setUploadFileName(String[] uploadFileName) { this .uploadFileNames = uploadFileName; }

public String[] getUploadContentType() { return this .uploadContentTypes; }
public void setUploadContentType(String[] uploadContentType) { this .uploadContentTypes = uploadContentType; }


list方式

private List < File > uploads = new ArrayList < File > ();
private List < String > uploadFileNames = new ArrayList < String > ();
private List < String > uploadContentTypes = new ArrayList < String > ();

public List < File > getUpload() {
return this .uploads;
}
public void setUpload(List < File > uploads) {
this .uploads = uploads;
}

public List < String > getUploadFileName() {
return this .uploadFileNames;
}
public void setUploadFileName(List < String > uploadFileNames) {
this .uploadFileNames = uploadFileNames;
}

public List < String > getUploadContentType() {
return this .uploadContentTypes;
}
public void setUploadContentType(List < String > contentTypes) {
this .uploadContentTypes = contentTypes;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章