最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java中Struts2文件上傳問題詳解

 更新時(shí)間:2015年07月02日 10:54:56   投稿:hebedich  
文件上傳和文件下載是我們?cè)趙eb應(yīng)用程序中常用的兩個(gè)功能,在java中,實(shí)現(xiàn)這兩種功能的方式也有很多種,其中struts2就給我們提供了一種算是比較簡(jiǎn)單的方式吧,下面我們就一起來看一下,

首先是網(wǎng)頁(yè)部分,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必須設(shè)置成post,enctype必須設(shè)置成multipart/form-data。

從上面代碼中可以看到這個(gè)表單提交給了UploadFile這個(gè)action來處理,那我們?cè)趕truts.xml里面配置如下:

<action name="UploadFile" class="com.lidi.action.UploadAction">
  <result name="success">/uploadResult.jsp</result>
  <!--fileUpload攔截器,可用于限制上傳文檔的類型和文檔大小 -->
  <interceptor-ref name="fileUpload">
  <!-- 限制文件大小20M,單位為字節(jié) -->
    <param name="maximumSize">20971520</param>
  </interceptor-ref>
  <!--默認(rèn)攔截器,必須聲明在fileUpload攔截器之后 -->
  <interceptor-ref name="defaultStack" />
 </action>

fileUpload攔截器,用于設(shè)置上傳路徑,限制文件類型和大小。

關(guān)于限制文件大小,光有<param name="maximumSize">是不行的,還必須在<struts>標(biāo)簽下添加

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

這行代碼表示整個(gè)項(xiàng)目所有要上傳文件的地方允許上傳的文件大小的最大值,也就是說這個(gè)項(xiàng)目里上傳的任何單個(gè)文件大小不能超過21000000字節(jié)(約20M),如果項(xiàng)目中不添加這行代碼,則默認(rèn)允許上傳的文件大小最大為2M,所以這也是突破struts2只能上傳2M文件的限制的方法。

關(guān)于限制文件類型,如果需要限制為圖片文件,則<interceptor>可以這樣配置

<!-- 設(shè)置只允許上傳圖片文件 -->
<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">標(biāo)簽中的值都是文件的MIME類型,常用文件的MIME類型可以在%TOMCAT_HOME%\conf\web.xml中找到。

如果要限制為word文件,則可以<interceptor>可以這樣配置

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

然而我感覺這樣來限制文件類型,不如用javascript在前端實(shí)現(xiàn)限制。

接下來寫UploadAction,UploadAction必需的私有屬性是source,這是和upload_file.jsp里面文件域的name屬性是一致,就是說文件域的name屬性值為source,則UploadAction中必需有私有屬性source,另外,還有兩個(gè)比較重要的私有屬性:

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

綜合來說,就是,比如upload_file.jsp中文件域的name = “abc”,則Action中就需要這樣定義

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

abc會(huì)自動(dòng)獲取要上傳的文件對(duì)象,abcFileName自動(dòng)獲取文件名,abcContentType自動(dòng)獲取文件類型。

關(guān)于上傳路徑,是我要重點(diǎn)說一下的。

如果是上傳到絕對(duì)路徑,那還挺好搞的,但如果要上傳到項(xiàng)目根目錄下的upload文件夾呢,怎么獲得這個(gè)upload文件夾的完整路徑?

我嘗試過使用

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

ServletActionContext.getRequest().getRealPath("/upload");
還是返回了null。但在網(wǎng)上查下這個(gè)問題,很多人都推薦這么寫,證明可能某些情況下這樣寫確實(shí)是可行的,但也有跟我一樣返回null的人,他們同時(shí)推薦了一種新的方法,就是讓UploadAction實(shí)現(xiàn)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文件夾的路徑。然后執(zhí)行上傳:

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

我個(gè)人是比較推薦這種方法的,因?yàn)檫@種方法好像規(guī)避了當(dāng)項(xiàng)目被打包轉(zhuǎn)移到其它環(huán)境時(shí)也能保證獲得正確的路徑。

后面貼上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 {
    /*獲取存放上傳文件的路徑:項(xiàng)目根目錄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;
  }
}

上傳結(jié)果頁(yè)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>

以上所述就是本文的全部?jī)?nèi)容了,希望大家能夠喜歡。

相關(guān)文章

  • springboot用controller跳轉(zhuǎn)html頁(yè)面的實(shí)現(xiàn)

    springboot用controller跳轉(zhuǎn)html頁(yè)面的實(shí)現(xiàn)

    這篇文章主要介紹了springboot用controller跳轉(zhuǎn)html頁(yè)面的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • 詳解Java序列化如何破壞單例模式

    詳解Java序列化如何破壞單例模式

    這篇文章主要為大家詳細(xì)介紹了Java序列化是如何破壞單例模式的,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以學(xué)習(xí)一下
    2023-12-12
  • Java特性隊(duì)列和棧的堵塞原理解析

    Java特性隊(duì)列和棧的堵塞原理解析

    這篇文章主要介紹了Java特性隊(duì)列和棧的堵塞原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • SpringBoot最常用的50個(gè)注解總結(jié)(全是干貨!)

    SpringBoot最常用的50個(gè)注解總結(jié)(全是干貨!)

    SpringBoot提供多種注解簡(jiǎn)化配置與啟動(dòng)流程,如@SpringBootAppication、@RestController、@RequestMapping等,這篇文章主要介紹了SpringBoot最常用的50個(gè)注解的相關(guān)資料,需要的朋友可以參考下
    2024-09-09
  • Java?Stream流語(yǔ)法示例詳解

    Java?Stream流語(yǔ)法示例詳解

    這篇文章主要為大家詳細(xì)介紹了Java的Stream流,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • springboot如何讀取自定義配置項(xiàng)

    springboot如何讀取自定義配置項(xiàng)

    這篇文章主要介紹了springboot如何讀取自定義配置項(xiàng)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2018-05-05
  • Java8中的默認(rèn)方法(面試者必看)

    Java8中的默認(rèn)方法(面試者必看)

    這篇文章主要介紹了Java8中的默認(rèn)方法(面試者必看),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • IDEA插件之mybatisx?插件使用教程

    IDEA插件之mybatisx?插件使用教程

    這篇文章主要介紹了mybatisx?插件使用教程,包括插件安裝自動(dòng)生成代碼的相關(guān)知識(shí),本文通過實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05
  • Struts2數(shù)據(jù)輸入驗(yàn)證教程詳解

    Struts2數(shù)據(jù)輸入驗(yàn)證教程詳解

    這篇文章主要介紹了Struts2數(shù)據(jù)輸入驗(yàn)證教程詳解的相關(guān)資料,輸入數(shù)據(jù)驗(yàn)證的方法有兩種,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2016-10-10
  • spring security自定義登錄頁(yè)面

    spring security自定義登錄頁(yè)面

    在項(xiàng)目中我們肯定不能使用Spring自己生成的登錄頁(yè)面,而要用我們自己的登錄頁(yè)面,下面通過本文給大家分享spring security自定義登錄頁(yè)面的實(shí)現(xiàn)方法,一起看看吧
    2017-09-09

最新評(píng)論

八宿县| 龙南县| 五常市| 聂拉木县| 东兴市| 新蔡县| 育儿| 冕宁县| 邳州市| 六枝特区| 洞头县| 禹城市| 瓮安县| 彭阳县| 天长市| 平顶山市| 大港区| 石楼县| 张家川| 江孜县| 石林| 峨山| 揭西县| 青海省| 灵川县| 河间市| 阳泉市| 乡宁县| 阳原县| 望城县| 余干县| 乌兰县| 马鞍山市| 湖北省| 陵川县| 北川| 隆尧县| 厦门市| 玉树县| 大庆市| 怀化市|