1. 程式人生 > >Struts2文件上傳

Struts2文件上傳

就會 oca fileutil content def -name fin 發生 訪問

=======================上傳(過濾大小及類型)下載文件(彈出框以流的方式下載)=======================

1)上傳jsp:

<form enctype="multipart/form-data" action="fileUpLoadAction.action" method="post">
<h3 align="center">
Struts2文件上傳示例
</h3>
用戶名:
<input type="text" name="uname" />
<br />
年齡:
<input type
="text" name="age" /> <br /> 照片:&nbsp;&nbsp;&nbsp; <input type="file" value="選擇圖片" name="image2" /> <input type="submit" value="上傳" /> </form>

註:1) enctype="multipart/form-data" 表單中如果要上傳附件那麽這裏要加這個屬性,作用是表單是的數據以二進制形式提交
2) method="post" 有附件上傳那麽提交方式必然是post方式


2) 上傳Action:

/*
* 必須繼承ActionSupport類,則否fileUpload攔截器無效
*/
public class FileUpLoadAction extends ActionSupport {
private static final long serialVersionUID = 1L;
private File image2; // 變量名必須與jsp頁面中的file控件的name相同
private String image2FileName; // 必須--File變量的名字+ "FileName"
private List<String> listNames;

public
File getImage2() { return image2; } public void setImage2(File image2) { this.image2 = image2; } public String getImage2FileName() { return image2FileName; } public void setImage2FileName(String image2FileName) { this.image2FileName = image2FileName; } public List<String> getListNames() { return listNames; } public void setListNames(List<String> listNames) { this.listNames = listNames; } public String execute() throws Exception { // 放圖片的路徑:E:\apache-tomcat-6.0.18\webapps\StrutsFileUpDown\images String realpath = ServletActionContext.getServletContext().getRealPath("/images"); //不存在則創建,代碼沒寫 if (image2 != null) { // 放圖片的路徑+圖片的名稱 File savefile = new File(realpath + "/" + image2FileName); // FileUtils.copyFile(file1,file2);file1,file2都是文件類型File;把file1拷貝到file2 FileUtils.copyFile(image2, savefile); } // 接收用戶名和年齡 String userName = ServletActionContext.getRequest().getParameter("uname"); String age = ServletActionContext.getRequest().getParameter("age"); /** * 讀取文件名列表 */ //讀取圖片的名稱返回一個list列表 listNames = findFileNames(realpath ); return "success"; } /** * 讀取文件名的列表 * * @param path * 放圖片的路徑 * @return 把路徑中的圖片名取出來存在List裏 */ private List<String> findFileNames(String path) { List<String> listNames = new ArrayList<String>(); File file = new File(path); File[] files = file.listFiles(); for (File f : files) { if (f.isFile()) { // 得到圖片的名稱 123.jpg String fileName = f.getName(); listNames.add(fileName); } } return listNames; } }

3)下載Action

public class DownloadAction {

private String fileName; 

public String getFileName() {
return fileName;
}

public void setFileName(String fileName) {
this.fileName = fileName;
}

public InputStream getInputStream() {
System.out.println("getFileName()="+getFileName());
InputStream ins = ServletActionContext.getServletContext().getResourceAsStream("/images/" + fileName);
return ins;
//查找具有給定名稱的資源。返回 inputstream
//相當於取得File文件後,再new InputStream(file)一樣的結果
//以‘/‘開頭時默認是從此類所在的包下取資源,以‘/‘開頭則是從ClassPath(Src根目錄)根下獲取。
//E:\apache-tomcat-6.0.18\webapps\StrutsFileUpDown\images 其實E:\apache-tomcat-6.0.18\webapps \StrutsFileUpDown\就是根
}

public String execute(){
return "success";
//下載不用寫返回頁面
}


}

註:execute()必須走,走 execute(),在走getInputStream --------->把附件以流的方式寫入瀏覽器中,以彈出框的形式下 載

4)struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<constant name="struts.i18n.encoding" value="UTF-8" />    

<package name="filePackage" extends="struts-default">

<action name="fileUpLoadAction" class="com.cs.fileupload.action.FileUpLoadAction">
<result name="success">index.jsp</result>
<result name="input">error.jsp</result>
<!-- input意思是當上傳的文件大小和類型不符合要求時就會返回一個input,這個input在ActionSupport
類中所以上傳類必須繼承ActionSupport -->

<!-- 文件上傳攔截器,struts自已寫好的,我們調用就可以了 -->
<interceptor-ref name="fileUpload"> 
<!-- 上傳文件的文件類型要求是哪幾個類型,並且以,號分隔 --> 
<param name="allowedTypes">image/bmp,image/png,image/gif</param> 
<!-- 上傳文件的文件的大小允許是多少字節 --> 
<param name="maximumSize">102400</param> 
</interceptor-ref> 
<interceptor-ref name="defaultStack" /> 
</action>
<action name="downloadAction" class="com.cs.fileupload.action.DownloadAction">
<!-- 可以實現文件的下載功能 -->
<result type="stream">
<!-- 讓瀏覽器總是提示一個文件下載對話框 -->
<param name="contentType">application/octet-stream</param>
<!-- 返回的InputStream對象將被發送到瀏覽器 -->
<param name="inputName">inputStream</param>
<!-- 文件處理方式 ${}內部為ognl表達式-->
<param name="contentDisposition">attachment;fileName=${fileName}</param>
<!-- 通過OutputStream對象向瀏覽器發送數據時使用的緩沖區的長度,為了是提高文件的下載速度 -->
<param name="bufferSize">4096</param>
</result>
</action>

</package>

</struts>

5)錯誤頁面 error.jsp

<%@ taglib uri="/struts-tags" prefix="s"%>
<body>
<!-- 上傳如果發錯會進入這個頁面,並用這個標簽顯出錯誤信息,並且以英文的方式顯示出來-->
<h3><s:fielderror/></h3>
<h4><a href="fileUpLoadAction.action">返回圖片上傳頁</a></h4>
</body>

出錯信息在:
傳輸文件時的信息解釋:(struts核心包下/org.apache.struts2/struts-messages.properties文件裏)

struts.messages.error.content.type.not.allowed=不支持上傳該類型的文件
struts.messages.error.file.too.large=上傳圖片失敗:圖片太大
struts.messages.error.uploading=上傳文件時發生錯誤

===========================頁面用struts標簽==========================================
1)如果頁面用struts標簽。
2)web.xml中配置時用的是
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
那麽訪問JSP時就報錯,找不到struts標簽,因為配置時用的是*.action,只有.action形式才走struts框架,那麽這時我們就可以把配置改下加
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>

這樣我們就可以在訪問jsp時,讓它走struts框架。


web.xml完整代碼:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern> 
</filter-mapping>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>    
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>

3)還有另外一種方法是把*.action改成/*

Struts2文件上傳