程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> java中Struts2文件上傳成績詳解

java中Struts2文件上傳成績詳解

編輯:關於JAVA

java中Struts2文件上傳成績詳解。本站提示廣大學習愛好者:(java中Struts2文件上傳成績詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是java中Struts2文件上傳成績詳解正文


起首是網頁部門,upload_file.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML>
<html>
<head>
<title>Upload File</title>
</head>
<body>
  <form action="UploadFile" method="post" enctype="multipart/form-data">
    <!--文件域-->
    <input type="file" name="source" /> <input type="submit" value="上傳">
  </form>
</body>
</html>

上傳文件的表單,metho必需設置成post,enctype必需設置成multipart/form-data。

從下面代碼中可以看到這個表單提交給了UploadFile這個action來處置,那我們在struts.xml外面設置裝備擺設以下:

<action name="UploadFile" class="com.lidi.action.UploadAction">
  <result name="success">/uploadResult.jsp</result>
  <!--fileUpload攔阻器,可用於限制上傳文檔的類型和文檔年夜小 -->
  <interceptor-ref name="fileUpload">
  <!-- 限制文件年夜小20M,單元為字節 -->
    <param name="maximumSize">20971520</param>
  </interceptor-ref>
  <!--默許攔阻器,必需聲明在fileUpload攔阻器以後 -->
  <interceptor-ref name="defaultStack" />
 </action>

fileUpload攔阻器,用於設置上傳途徑,限制文件類型和年夜小。

關於限制文件年夜小,光有<param name="maximumSize">是不可的,還必需在<struts>標簽下添加

<constant name="struts.multipart.maxSize" value="21000000"/>

這行代碼表現全部項目一切要上傳文件的處所許可上傳的文件年夜小的最年夜值,也就是說這個項目裡上傳的任何單個文件年夜小不克不及跨越21000000字節(約20M),假如項目中不添加這行代碼,則默許許可上傳的文件年夜小最年夜為2M,所以這也是沖破struts2只能上傳2M文件的限制的辦法。

關於限制文件類型,假如須要限制為圖片文件,則<interceptor>可以如許設置裝備擺設

<!-- 設置只許可上傳圖片文件 -->
<intercepter-ref name="fileUpload">
  <param name="allowedTypes">image/bmp, image/x-png, image/gif, image/jpeg</param>
</intercepter-ref>
<interceptor-ref name="defaultStack" />

<param name="allowedTypes">標簽中的值都是文件的MIME類型,經常使用文件的MIME類型可以在%TOMCAT_HOME%\conf\web.xml中找到。

假如要限制為word文件,則可以<interceptor>可以如許設置裝備擺設

<!-- 設置只許可上傳word文檔 -->
<intercepter-ref name="fileUpload">
  <param name="allowedTypes">application/msword, application/vnd.openxmlformats-officedocument.wordprocessingml.document</param>
</intercepter-ref>
<interceptor-ref name="defaultStack" />

但是我感到如許來限制文件類型,不如用javascript在前端完成限制。

接上去寫UploadAction,UploadAction必須的公有屬性是source,這是和upload_file.jsp外面文件域的name屬性是分歧,就是說文件域的name屬性值為source,則UploadAction中必須有公有屬性source,別的,還有兩個比擬主要的公有屬性:

private String sourceFileName; //待上傳文件的文件名
private String sourceContentType; //待上傳文件的文件類型
這兩個變量名的格局就是後面的前綴source和upload_file.jsp中的文件域的name屬性雷同。

綜合來講,就是,好比upload_file.jsp中文件域的name = “abc”,則Action中就須要如許界說

private File abc;
private String abcFileName;
private String abcContentType; 

abc會主動獲得要上傳的文件對象,abcFileName主動獲得文件名,abcContentType主動獲得文件類型。

關於上傳途徑,是我要重點說一下的。

假如是上傳到相對途徑,那還挺好弄的,但假如要上傳到項目根目次下的upload文件夾呢,怎樣取得這個upload文件夾的完全途徑?

我測驗考試過應用

ServletActionContext.getServletContext().getRealPath("/upload");
但前往了null。也用過

ServletActionContext.getRequest().getRealPath("/upload");
照樣前往了null。但在網上查下這個成績,許多人都推舉這麼寫,證實能夠某些情形下如許寫確切是可行的,但也有跟我一樣前往null的人,他們同時推舉了一種新的辦法,就是讓UploadAction完成ServletContextAware接口。詳細做法以下:

public class UploadAction extends ActionSupport implements ServletContextAware {

  /**
   * 省略其它代碼...
   */
  private ServletContext context; 

  public ServletContext getContext() {
    return context;
  }

  public void setContext(ServletContext context) {
    this.context = context;
  }
  
  @Override
  public void setServletContext(ServletContext context) {
    this.context = context;
  }
}

然後應用

String path = context.getRealPath("/upload");// 主要:斜槓不克不及少

取得upload文件夾的途徑。然後履行上傳:

/*將文件上傳到upload文件夾下*/
File savefile = new File(path, sourceFileName);
FileUtils.copyFile(source, savefile);

我小我是比擬推舉這類辦法的,由於這類辦法似乎躲避了當項目被打包轉移到其它情況時也能包管取得准確的途徑。

前面貼上UploadAction的完全代碼UploadAction.java

package com.lidi.action;
import java.io.File;
import java.io.IOException;
import javax.servlet.ServletContext;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.util.ServletContextAware;
import com.opensymphony.xwork2.ActionSupport;
public class UploadAction extends ActionSupport implements ServletContextAware {
  /**
   * 
   */
  private static final long serialVersionUID = 1L;
  private File source;// 待上傳文件
  private String sourceFileName;// 待上傳文件的文件名
  private String sourceContentType; // 待上傳文件的文件類型
  private ServletContext context; // 主要
  /* 主要 */
  public ServletContext getContext() {
    return context;
  }
  public void setContext(ServletContext context) {
    this.context = context;
  }
  /* getters & setters */
  public File getSource() {
    return source;
  }
  public void setSource(File source) {
    this.source = source;
  }
  public String getSourceFileName() {
    return sourceFileName;
  }
  public void setSourceFileName(String sourceFileName) {
    this.sourceFileName = sourceFileName;
  }
  public String getSourceContentType() {
    return sourceContentType;
  }
  public void setSourceContentType(String sourceContentType) {
    this.sourceContentType = sourceContentType;
  } 
  @Override
  public void setServletContext(ServletContext context) {
    this.context = context;
  }
  public String execute() throws IOException {
    /*獲得寄存上傳文件的途徑:項目根目次upload文件夾*/
    String path;
    path = context.getRealPath("/upload");// 主要:斜槓不克不及少
    System.out.println(path);    
    /*將文件上傳到upload文件夾下*/
    File savefile = new File(path, sourceFileName);
    FileUtils.copyFile(source, savefile);
    System.out.println(savefile.getAbsolutePath());
    return SUCCESS;
  }
}

上傳成果頁uploadResult.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE HTML>
<html>
 <head>  
  <title>Upload Result</title>
 </head>
 <body>
 <p>文件名:<s:property value="sourceFileName" /></p>
 <p>文件類型:<s:property value="sourceContentType" /></p>
 <p>文件:<a href="upload/<s:property value="sourceFileName" />"><s:property value="sourceFileName" /></a></p>
 </body>
</html>

以上所述就是本文的全體內容了,願望年夜家可以或許愛好。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved