Struts2 文件上傳
Struts 2框架提供了內置支持處理文件上傳使用基於HTML表單的文件上傳。上傳一個文件時,它通常會被存儲在一個臨時目錄中,他們應該由Action類進行處理或移動到一個永久的目錄,以確保數據不丟失。
請注意,服務器**有一個安全策略**可能會禁止寫到目錄以外的臨時目錄和屬於web應用的目錄。
在Struts中的文件上傳是通過預先定義的攔截文件上傳攔截器這是可通過org.apache.struts2.interceptor.FileUploadInterceptor類的defaultStack中的一部分。仍然可以使用在struts.xml中設置各種參數,我們將在下面看到。
創建視圖文件:
讓我們開始創建我們認爲這將需要瀏覽和上傳選定的文件。因此,讓我們創建一個純HTML上傳表單,允許用戶上傳文件 index.jsp:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="s" uri="/struts-tags"%>
在上面的例子中值得注意幾點說明。首先,表單的enctype屬性設置爲multipart/ form-data。這應該是設置爲使得處理文件上傳文件上傳。下一個點值得注意的是表單的 action方法上傳和文件上傳字段的名稱 - myFile。我們需要這些信息創建操作方法和struts配置。
接下來讓我們創建一個簡單的 jsp 文件的success.jsp 結果顯示我們的文件上傳的情況下成功。
<%@ page contentType="text/html; charset=UTF-8" %> <%@ taglib prefix="s" uri="/struts-tags" %>
下面將結果文件error.jsp 可能會有一些錯誤,在上傳文件:
<%@ page contentType="text/html; charset=UTF-8" %> <%@ taglib prefix="s" uri="/struts-tags" %>
創建action類:
接下來讓我們創建一個Java類稱爲 uploadFile.java 這會處理上傳文件,該文件存儲在一個安全的位置:
package com.yiibai.struts2; import java.io.File; import org.apache.commons.io.FileUtils; import java.io.IOException; import com.opensymphony.xwork2.ActionSupport; public class uploadFile extends ActionSupport{ private File myFile; private String myFileContentType; private String myFileFileName; private String destPath; public String execute() { /* Copy file to a safe location */ destPath = "C:/apache-tomcat-6.0.33/work/"; try{ System.out.println("Src File name: " + myFile); System.out.println("Dst File name: " + myFileFileName); File destFile = new File(destPath, myFileFileName); FileUtils.copyFile(myFile, destFile); }catch(IOException e){ e.printStackTrace(); return ERROR; } return SUCCESS; } public File getMyFile() { return myFile; } public void setMyFile(File myFile) { this.myFile = myFile; } public String getMyFileContentType() { return myFileContentType; } public void setMyFileContentType(String myFileContentType) { this.myFileContentType = myFileContentType; } public String getMyFileFileName() { return myFileFileName; } public void setMyFileFileName(String myFileFileName) { this.myFileFileName = myFileFileName; } }
uploadFile.java是一個非常簡單的類。重要的是要注意的是使用FileUpload攔截器隨着參數Intercetpor 確實爲我們解決所有繁重工作。文件上傳攔截器,使三個參數,默認情況下提供。它們被命名爲以下模式:
[your file name parameter] - 這是實際的文件的上載。在這個例子中是 "myFile"
[your file name parameter]ContentType - 這是被上傳的文件,該文件的內容類型。在這個例子中是 "myFileContentType"
[your file name parameter]FileName - 這是被上傳的文件的名稱。在這個例子中是 "myFileFileName"
這三個參數是爲我們提供的,這要歸功於Struts的攔截器。所有我們需要做的是在我們的Action類,這些變量是自動連線我們以正確的名稱創建三個參數。所以,在上面的例子中,我們有三個參數的操作方法簡單地返回「success」,如果一切順利,否則返回「error」。
配置文件:
以下是Struts2的配置屬性可以控制文件上傳過程:
SN
屬性& 描述
1
struts.multipart.maxSize
The maximum size (in bytes) of a file to be accepted as a file upload. Default is 250M.
2
struts.multipart.parser
The library used to upload the multipart form. By default is jakarta
3
struts.multipart.saveDir
The location to store the temporary file. By default is javax.servlet.context.tempdir.
爲了改變這些設置,可以使用恆定的標籤在應用程序 struts.xml文件,像我一樣改變要上傳的文件的最大大小。讓我們有我們的在struts.xml如下:
由於FileUpload攔截器是攔截器defaultStack的一部分,我們並不需要明確地配置。但可以添加
<action name="upload" class="com.yiibai.struts2.uploadFile"> <interceptor-ref name="basicStack"> <interceptor-ref name="fileUpload"> <param name="allowedTypes">image/jpeg,image/gif <result name="success">/success.jsp <result name="error">/error.jsp
以下是web.xml文件中的內容:
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app\_2\_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app\_3\_0.xsd" id="WebApp_ID" version="3.0">
現在右鍵點擊項目名稱,並單擊 Export > WAR File 創建一個WAR文件。然後部署此WAR在Tomcat 的webapps目錄下。最後,啓動Tomcat服務器和嘗試訪問URL http://localhost:8080/HelloWorldStruts2/upload.jsp。這會給出以下畫面:
現在選擇一個文件的「Contacts.txt」使用「瀏覽」按鈕,然後點擊上傳按鈕,將文件上傳,應該看到頁面。可以檢查上傳的文件保存在 C:apache-tomcat-6.0.33work.
請注意,使用FileUpload攔截刪除上傳的文件自動所以需要編程在一些位置上保存上傳的文件被刪除之前。
錯誤消息:
fileUplaod攔截器使用幾個默認的錯誤消息鍵:
SN
錯誤消息鍵 & 描述
1
struts.messages.error.uploading
A general error that occurs when the file could not be uploaded.
2
struts.messages.error.file.too.large
Occurs when the uploaded file is too large as specified by maximumSize.
3
struts.messages.error.content.type.not.allowed
Occurs when the uploaded file does not match the expected content types specified.
You can override the text of these messages in WebContent/WEB-INF/classes/messages.propertiesresource files.