Struts2文件上傳
=======================上傳(過濾大小及類型)下載文件(彈出框以流的方式下載)=======================
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 /> 照片: <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; publicFile 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文件上傳