struts2+fileupload

在Struts2中實現文件上傳非常的簡單。利用Struts2所提供的組件可以很容易的完成。

在此我們通過一個簡單的文件上傳實例進行講解。

首先在建立的Web Project工程中加入所需要的Struts2的.jar文件。在此特別需要以下兩個類庫文件,分別爲:commons-io-1.1.jar和commons-fileupload-1.1.1.jar。因此在此項目中需要的Struts2的類庫文件爲如下所示:

下面開始實際的開發工作

因爲採用了Struts2框架,所以需要像以前項目一樣,在web.xml中加入struts2的配置,配置代碼如下:

<?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>struts2</filter-name>
  <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
 </filter>
 <filter-mapping>
  <filter-name>struts2</filter-name>
  <url-pattern>/*</url-pattern>
 </filter-mapping>
 <filter>
  <filter-name>struts-cleanup</filter-name>
  <filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>
 </filter>
 <filter-mapping>
  <filter-name>struts-cleanup</filter-name>
  <url-pattern>/*</url-pattern>
 </filter-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

首先建立上傳文件的文件選擇頁面,此頁面在此非常的簡單,存在一個文件標題的描述輸入框和文件選擇組件

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<%
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 'index.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">
 -->
  </head>
  
  <body> 
    <s:form action="fileUpLoad.action" method ="POST" enctype ="multipart/form-data"> 
        <s:file name ="upFile" label ="FileName:" /> 
        <s:textfield name ="title" label ="Title:" />        
        <s:submit align="left"/> 
    </s:form >

  </body>
</html>
注意粗體部分,因爲上傳文件時,數據傳輸採用流的方式,所以需要設置enctype屬性,設置爲粗體的值。

窗體請求fileUpLoad控制器,下面當然是編寫控制器了。注意在此文件選擇組件的名稱爲upFile,此即爲要上傳得組件路經名稱。在控制器中的很多地方要用到它

控制器代碼如下:

package com.frank.action;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class UpLoadAction extends ActionSupport {
 private static final int FILE_SIZE=16*1024;
 private File upFile;
 private String upFileContentType;
 private String upFileFileName;
 private String title;
 public File getUpFile() {
  return upFile;
 }
 public void setUpFile(File upFile) {
  this.upFile = upFile;
 }
 public String getTitle() {
  return title;
 }
 public void setTitle(String title) {
  this.title = title;
 }
 public void setUpFileContentType(String upFileContentType) {
  this.upFileContentType = upFileContentType;
 }
 public void setUpFileFileName(String upFileFileName) {
  this.upFileFileName = upFileFileName;
 }
 public void upLoadFile(File source,File target){
  InputStream in=null;
  OutputStream out=null;
  try{
   in=new BufferedInputStream(new FileInputStream(source),FILE_SIZE);
   out=new BufferedOutputStream(new FileOutputStream(target),FILE_SIZE);
   byte[] image=new byte[FILE_SIZE];
   while(in.read(image)>0){
    out.write(image);
   }
  }catch(IOException ex){
   ex.printStackTrace();
  }finally{
   try{
    in.close();
    out.close();
   }catch(IOException ex){
    
   }
  }
 }
 @Override
 public String execute() throws Exception {
  // TODO Auto-generated method stub
  System.out.println("hello");
  String filePath=ServletActionContext.getServletContext().getRealPath("images")
  +"/"+this.upFileFileName;
  
  File targetFile=new File(filePath);
  upLoadFile(upFile,targetFile);
  return SUCCESS;
 }
 public String getUpFileFileName() {
  return upFileFileName;
 }
 
}

注意,針對於選擇的上傳文件,在控制器中存在三個set方法與此對應,分別爲setUpFile、setUpFileContentType和setUpFileFileName,也就是說對於每個上傳得文件,增加了ContentType和FileName的set和get方法。用來取得上傳文件的文件類型名稱和文件名稱。而常規的UpFile的set和get方法獲取和設置的是File類型。也就是要上傳得文件。

在此增加了一個方法upLoad用來實現真正的文件上傳操作。採用文件流的方式將上傳得文件數據寫入到目的地文件中。其實就是常規的文件流操作。

應該注意到,我們將文件上傳到當前網站的images目錄下,所以建立一個images目錄即可。在編碼中通過ServletActionContext.getServletContext().getRealPath("images")得到images的實際路經。

下面需要配置struts.xml了。當然需要在src下建立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>
 <include file="struts-default.xml"/>
 <package name="fileUpLoad" extends="struts-default">
  <action name="fileUpLoad" class="com.frank.action.UpLoadAction">
   <interceptor-ref name="fileUpload">
    <param name="allowedTypes">
     image/bmp,image/png,image/gif,image/jpeg,image/jpg,image/x-png
    </param>
   </interceptor-ref>
   <interceptor-ref name="defaultStack"/>
   <result>success.jsp</result>
   <result name="input">index.jsp</result>
  </action>
 </package>
</struts>
注意在控制器的配置中加入了兩個攔截器。fileUpLoad攔截器負責攔截所選擇的文件類型,通過參數allowedType來實現。在此我們能看明白,上傳得文件類型必須爲:image/bmp,image/png,image/gif,image/jpeg,image/jpg,image/x-png    圖片類型

同時需要加入defaultStack攔截器,這樣在選擇的文件違反條簡單俄時候轉發到input所指向的頁面

當成功時,轉發到success.jsp,此頁面的職責是顯示剛纔上傳得圖片

代碼非常的簡單,使用<img>標記顯示圖片

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<%
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 'success.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">
 -->

  </head>
  <body>
   <s:property value="title"/>
   <br>
   <img src='images/<s:property value="upFileFileName"/>'>
  </body>
</html>

現在可以開始測試了:

submit後,上傳成功,顯示圖片

 

如果當時選擇文件的時候,選擇的類型違反了條件,不是圖片,那麼顯示如下:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章