描述:
通過struts2實現多圖片上傳。
我使用的版本是2.2.1,使用的包有如下幾個:
具體實現:
1. 創建上傳圖片的頁面:fileUpload.jsp
- <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
- <%@ taglib prefix="s" uri="/struts-tags" %>
- <%
- String path = request.getContextPath();
- String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
- %>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <base href="<%=basePath%>">
- <title>My JSP 'fileUpLoad.jsp' starting page</title>
- <meta http-equiv="pragma" content="no-cache">
- <meta http-equiv="cache-control" content="no-cache">
- <meta http-equiv="expires" content="0">
- <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
- <meta http-equiv="description" content="This is my page">
- <!--
- <link rel="stylesheet" type="text/css" href="styles.css" mce_href="styles.css">
- -->
- </head>
- <body>
- <center>
- <s:form action ="fileUpload" method ="POST" enctype ="multipart/form-data" >
- <s:fielderror />
- <s:file name ="myFile" label ="Image File1"/>
- <s:file name ="myFile" label ="Image File2"/>
- <s:file name ="myFile" label ="Image File3"/>
- <s:textfield name ="caption" label ="Caption" />
- <s:submit/>
- </s:form>
- </center>
- </body>
- </html>
在FileUpload.jsp中,先將表單的提交方式設爲POST,然後將enctype設爲multipart/form-data,這並沒有什麼特別之處。接下來,<s:file/>標誌將文件上傳控件綁定到Action的myFile屬性,因爲要上傳多張圖片我們就暫且添加三個file
注意這三個file的name屬性要相同。
2. 創建處理圖片上傳的action:FileUploadAction.java
- package com.ywjava.action;
- import java.io.BufferedInputStream;
- import java.io.BufferedOutputStream;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.util.ArrayList;
- import java.util.Date;
- import java.util.List;
- import org.apache.struts2.ServletActionContext;
- import com.opensymphony.xwork2.ActionSupport;
- public class FileUploadAction extends ActionSupport {
- private static final long serialVersionUID = 572146812454l;
- private static final int BUFFER_SIZE = 16 * 1024;
- private List<File> myFile = new ArrayList<File>();
- private List<String> contentType = new ArrayList<String>();
- private List<String> fileName = new ArrayList<String>(); //文件名
- private List<String> imageFileName = new ArrayList<String>();
- private String caption;
- private static void copy(File src, File dst) {
- try {
- InputStream in = null;
- OutputStream out = null;
- try {
- in = new BufferedInputStream(new FileInputStream(src),
- BUFFER_SIZE);
- out = new BufferedOutputStream(new FileOutputStream(dst),
- BUFFER_SIZE);
- byte[] buffer = new byte[BUFFER_SIZE];
- while (in.read(buffer) > 0) {
- out.write(buffer);
- }
- } finally {
- if (null != in) {
- in.close();
- }
- if (null != out) {
- out.close();
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- private static String getExtention(String fileName) {
- int pos = fileName.lastIndexOf(".");
- return fileName.substring(pos);
- }
- @Override
- public String execute() {
- if (myFile == null)
- return INPUT;
- for (int i = 0; i < myFile.size(); i++) {
- imageFileName.add(new Date().getTime()+ getExtention(this.getMyFileFileName().get(i))) ;
- File imageFile = new File(ServletActionContext.getServletContext() //得到圖片保存的位置(根據root來得到圖片保存的路徑在tomcat下的該工程裏)
- .getRealPath("UploadImages")
- + "/" + imageFileName);
- copy(myFile.get(i), imageFile); //把圖片寫入到上面設置的路徑裏
- }
- return SUCCESS;
- }
- public List<File> getMyFile() {
- return myFile;
- }
- public void setMyFile(List<File> myFile) {
- this.myFile = myFile;
- }
- public List<String> getContentType() {
- return contentType;
- }
- public void setContentType(List<String> contentType) {
- this.contentType = contentType;
- }
- public List<String> getMyFileFileName() {
- return fileName;
- }
- public void setMyFileFileName(List<String> fileName) {
- this.fileName = fileName;
- }
- public List<String> getImageFileName() {
- return imageFileName;
- }
- public void setImageFileName(List<String> imageFileName) {
- this.imageFileName = imageFileName;
- }
- public String getCaption() {
- return caption;
- }
- public void setCaption(String caption) {
- this.caption = caption;
- }
- public static int getBufferSize() {
- return BUFFER_SIZE;
- }
- }
在FileUploadAction中我分別寫了setMyFileContentType、setMyFileFileName、setMyFile和setCaption四個Setter方法,
後兩者很容易明白,分別對應FileUpload.jsp中的<s:file/>和<s:textfield/>標誌。但是前兩者並沒有顯式地與任何的頁面標誌綁定,
那麼它們的值又是從何而來的呢?其實,<s:file/>標誌不僅僅是綁定到myFile,
還有myFileContentType(上傳文件的MIME類型)和myFileFileName(上傳文件的文件名,該文件名不包括文件的路徑)。
因此,<s:file name="xxx" />對應Action類裏面的xxx、xxxContentType和xxxFileName三個屬性。
FileUploadAction作用是將瀏覽器上傳的文件拷貝到WEB應用程序的
UploadImages文件夾下,新文件的名稱是由系統時間與上傳文件的後綴組成,
該名稱將被賦給imageFileName屬性,以便上傳成功的跳轉頁面使用。
3. 創建顯示圖片的頁面:showUpload.jsp
- <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
- <%@ taglib prefix="s" uri="/struts-tags" %>
- <%
- String path = request.getContextPath();
- String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
- %>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <base href="<%=basePath%>">
- <title>Show Image</title>
- <meta http-equiv="pragma" content="no-cache">
- <meta http-equiv="cache-control" content="no-cache">
- <meta http-equiv="expires" content="0">
- <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
- <meta http-equiv="description" content="This is my page">
- <!--
- <link rel="stylesheet" type="text/css" href="styles.css" mce_href="styles.css">
- -->
- </head>
- <body>
- <s:iterator value="imageFileName" status="length">
- <div
- style="padding: 3px; border: solid 1px #cccccc; text-align: center">
- <img src='UploadImages/<s:property value ="imageFileName" /> ' />
- <br />
- <s:property value="caption" />
- </div>
- </s:iterator>
- <s:property value ="caption" />
- </body>
- </html>
4.Action配置文件:Struts.xml
- <?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE struts PUBLIC
- "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
- "http://struts.apache.org/dtds/struts-2.0.dtd">
- <struts>
- <constant name="struts.enable.DynamicMethodInvocation" value="false" />
- <constant name="struts.devMode" value="false" />
- <!-- 指定國際化資源文件的baseName爲messageResource -->
- <constant name="struts.custom.i18n.resources" value="messageResource" />
- <!-- 設置該應用使用的解碼集 -->
- <constant name="struts.i18n.encoding" value="utf-8" />
- <!-- 上傳的全部圖片的最大限制-->
- <constant name="struts.multipart.maxSize" value="1024102400" />
- <!-- 臨時存放文件的路徑 -->
- <constant name="struts.multipart.saveDir" value="d:/test" />
- <package name="index" namespace="/" extends="struts-default">
- <action name="index" class="com.ywjava.action.IndexAction">
- <result>
- /WEB-INF/page/fileUpLoad.jsp
- </result>
- </action>
- <action name="fileUpload" class="com.ywjava.action.FileUploadAction">
- <!-- 限制圖片的格式和圖片的大小 -->
- <interceptor-ref name="fileUpload">
- <param name="allowedTypes">
- image/bmp,image/png,image/gif,image/jpeg,image/pjpeg
- </param>
- </interceptor-ref>
- <!-- 默認的攔截器,必須要寫 -->
- <interceptor-ref name="defaultStack" />
- <result name="input"> /WEB-INF/page/fileUpLoad.jsp</result>
- <result name="success">/WEB-INF/page/showUpload.jsp</result>
- </action>
- </package>
- <!--
- <constant name="struts.multipart.saveDir" value="d:/test"></constant>
- -->
- <!-- Add packages here -->
- </struts>
Action配置文件裏所做的配置都有註釋,不明白的地方看下注釋
另外因爲做了國際化處理所以需要一個國際化配置的文件
放在src目錄下
5.國際化配置文件
messageResource_zh_CN.properties(只配置了中文的)
struts.messages.error.content.type.not.allowed=/u4E0A/u4F20/u7C7B/u578B/u9519/u8BEF
struts.messages.error.file.too.large=/u4E0A/u4F20/u6587/u4EF6/u592A/u5927
總結:struts2上傳圖片利用了fileUpload攔截器而變的簡單,主要是在action中做相應處理獲取文件的相應信息。