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

Struts2 控制文件上傳下載功能實(shí)例代碼

 更新時(shí)間:2017年05月23日 14:53:15   作者:Walker_YAM  
這篇文章主要介紹了Struts2 控制文件上傳下載功能實(shí)例代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下

之前介紹servlet3.0新特性的時(shí)候有提到過(guò)servlet API提供了一個(gè)part類(lèi)來(lái)實(shí)現(xiàn)對(duì)文件的上傳和保存,Struts其實(shí)是在其基礎(chǔ)上做了進(jìn)一步的封裝,更加簡(jiǎn)單易用。至于文件下載,Struts貫徹AOP 思想,在下載之前提供對(duì)用戶(hù)權(quán)限控制的API。

下面我們將詳細(xì)介紹上傳和下載的相關(guān)內(nèi)容。

一、Struts文件上傳機(jī)制

     想要實(shí)現(xiàn)文件上傳功能,頁(yè)面的表單的method屬性必須被指定為post,還有enctype屬性必須為multipart/form-data,該值表示上傳的內(nèi)容將會(huì)以二進(jìn)制的形式被上傳到服務(wù)器,至于該屬性的其他值的作用及他們之間的區(qū)別,請(qǐng)查看之前文章:servlet3.0新特性。下面給出表現(xiàn)層頁(yè)面代碼:

 <body>
  <s:form method="post" enctype="multipart/form-data" action="/upload">
   <s:file name="ufile" label="瀏覽"/>
   <s:submit value="上傳"/>
  </s:form>
 </body>

實(shí)際上在Struts的文件上傳中,它使用三個(gè)Action屬性來(lái)描述被上傳的文件。commons-fileupload-1.3.2.jar和commons-io-2.2.jar這兩個(gè)包就是用于輔助表單上傳的內(nèi)容賦值到action屬性中,所以在使用Struts的文件上傳之前應(yīng)當(dāng)先包含著兩個(gè)包到項(xiàng)目中。下面給出upload對(duì)應(yīng)的action:

public class UploadFile extends ActionSupport {
  //封裝的上傳文件的文件內(nèi)容
  private File ufile;
  //封裝的上傳文件的文件名
  private String ufileFileName;
  //封裝的上傳文件的文件類(lèi)型
  private String ufileContentType;
  ....省去getter,setter方法

  public String execute() throws IOException {
    FileInputStream fin = new FileInputStream(ufile);
    FileOutputStream fos = new FileOutputStream("F:\\360\\"+ufileFileName);
    byte[] buffer = new byte[1024];
    int len;
    while((len = fin.read(buffer))>0){
      fos.write(buffer,0,len);
    }
    return SUCCESS;
  }
}

先不看execute方法,在該action中,我們可以看到有三個(gè)屬性。ufile封裝了上傳的文件的二進(jìn)制內(nèi)容,ufileFileName(xxxFileName)封裝了該文件的文件名,ufileContentType(xxxContentType)封裝了該文件的類(lèi)型。他們的值是我們不必關(guān)心的,框架會(huì)根據(jù)表單上傳的文件對(duì)他們進(jìn)行賦值,只需要遵守他的命名規(guī)則即可。

execute方法主要是完成將上傳的文件保存到硬盤(pán)上,代碼也比較簡(jiǎn)單,讀取屬性u(píng)file中的內(nèi)容,寫(xiě)入磁盤(pán)指定位置。下面我們看看運(yùn)行的結(jié)果截圖:

至此我們就完成了對(duì)上傳文件的獲取保存,總體上看來(lái),實(shí)際上還是使用了三個(gè)action實(shí)例屬性對(duì)上傳文件相關(guān)信息的封裝。一個(gè)屬性封裝的是該上傳文件的二進(jìn)制內(nèi)容,一個(gè)屬性封裝該文件的文件名稱(chēng),一個(gè)屬性封裝的是該文件的文件類(lèi)型。實(shí)際上把控好這三個(gè)屬性,基本可以完成對(duì)該上傳文件的所有操作。下面我們看文件下載。

二、Struts文件下載機(jī)制

     廣義上的文件下載,其實(shí)可以使用a標(biāo)簽鏈接到對(duì)應(yīng)資源完成對(duì)資源的下載,但是在瀏覽器中使用這種方式會(huì)導(dǎo)致瀏覽器直接打開(kāi)該資源文件而非彈出下載框指定下載位置。Struts下載機(jī)制通過(guò)配置result元素的type屬性為stream來(lái)實(shí)現(xiàn)的。在類(lèi)型為stream的result元素中可以配置一些參數(shù),這些參數(shù)主要有以下一些:

contentType:指定被下載文件的文件類(lèi)型

inputName:指定被下載文件的輸入流入口

contentDisposition:指定下載文件的文件名

bufferSize:指定下載文件的緩沖大小

具體的應(yīng)用我們從代碼示例中體會(huì):

//直接訪問(wèn)的action
 <body>
   <a href="/download" rel="external nofollow" >下載資源</a>
 </body>
public class DownloadFile extends ActionSupport {
  private String inputPath;
  public void setInputPath(String s){
    this.inputPath = s;
  }
  public String getInputPath(){
    return this.inputPath;
  }
  public InputStream getTarFile(){
    return ServletActionContext.getServletContext().getResourceAsStream(inputPath);
  }
  @Override
  public String execute(){
    return SUCCESS;
  }
}
//download的action配置
    <action name="download" class="MyPackage.DownloadFile">
      <param name="inputPath">/m.jpg</param>
      <result type="stream">
        <param name="inputName">tarFile</param>
        <param name="contentType">image/jpg</param>
        <param name="contentDisposition">attachment;filename="walker.jpg"</param>
      </result>
    </action>

首先解析下Struts.xml中有關(guān)action的配置代碼,第一個(gè)param元素為action中的屬性inputPath動(dòng)態(tài)賦值,該參數(shù)的值指定了將要被下載的文件資源位置,我們此處指定的web應(yīng)用根目錄下的一張圖片。

接下來(lái)就是配置的結(jié)果類(lèi)型result,該元素的默認(rèn)type屬性為dispather表示分發(fā)的意思,而我們此處的stream表示流的意思,它將返回給瀏覽器一個(gè)InputStream(被下載文件的入口)。其中它配置了inputName,該參數(shù)的值對(duì)應(yīng)于action中g(shù)etXXXX方法,當(dāng)接受到請(qǐng)求的時(shí)候,框架會(huì)通過(guò)該參數(shù)匹配調(diào)用action中的getXXXX方法,該方法會(huì)根據(jù)指定資源路徑返回該文件的入口InputStream,交給瀏覽器。

我們也看到contentType參數(shù)指定了該文件的類(lèi)型,和互聯(lián)網(wǎng)MIME標(biāo)準(zhǔn)中的規(guī)定類(lèi)型一致,例如:text/plain代表純文本,text/xml表示XML,image/gif代表GIF圖片,image/jpeg代表JPG圖片等。

contentDisposition參數(shù)表示被下載文件在保存時(shí)候的文件名,它有兩個(gè)屬性值。第一個(gè)屬性值可以是inline或者attachment,它指定瀏覽器是直接打開(kāi)還是下載,filename指定了下載或者打開(kāi)文件的名稱(chēng)。下面看上述代碼的運(yùn)行結(jié)果截圖:

至此,有關(guān)Struts控制文件的上傳和下載的相關(guān)內(nèi)容已經(jīng)簡(jiǎn)單介紹完了,有些核心的,深層次的內(nèi)容涉及到攔截器,所以當(dāng)我們介紹完攔截器之后,想必大家會(huì)有更加深刻的理解。

以上所述是小編給大家介紹的Struts2 控制文件上傳下載功能實(shí)例代碼,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Java?CompletableFuture實(shí)現(xiàn)原理分析詳解

    Java?CompletableFuture實(shí)現(xiàn)原理分析詳解

    CompletableFuture是Java8并發(fā)新特性,本文我們主要來(lái)聊一聊CompletableFuture的回調(diào)功能以及異步工作原理是如何實(shí)現(xiàn)的,需要的可以了解一下
    2022-09-09
  • SpringBoot自定義Starter及使用

    SpringBoot自定義Starter及使用

    這篇文章主要介紹了SpringBoot自定義Starter及使用,Starter是Spring Boot中的一個(gè)非常重要的概念,Starter相當(dāng)于模塊,它能將模塊所需的依賴(lài)整合起來(lái)并對(duì)模塊內(nèi)的Bean根據(jù)環(huán)境進(jìn)行自動(dòng)配置,需要的朋友可以參考下
    2023-07-07
  • 基于Java并發(fā)容器ConcurrentHashMap#put方法解析

    基于Java并發(fā)容器ConcurrentHashMap#put方法解析

    下面小編就為大家?guī)?lái)一篇基于Java并發(fā)容器ConcurrentHashMap#put方法解析。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • feign post參數(shù)對(duì)象不加@RequestBody的使用說(shuō)明

    feign post參數(shù)對(duì)象不加@RequestBody的使用說(shuō)明

    這篇文章主要介紹了feign post參數(shù)對(duì)象不加@RequestBody的使用說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • java檢測(cè)redis是否可用的方法示例

    java檢測(cè)redis是否可用的方法示例

    這篇文章主要給大家介紹了關(guān)于java檢測(cè)redis是否可用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 為什么 Java 8 中不需要 StringBuilder 拼接字符串

    為什么 Java 8 中不需要 StringBuilder 拼接字符串

    java8中,編輯器對(duì)“+”進(jìn)行了優(yōu)化,默認(rèn)使用StringBuilder進(jìn)行拼接,所以不用顯示的使用StringBuilder了,直接用“+”就可以了。下面我們來(lái)詳細(xì)了解一下
    2019-05-05
  • 關(guān)于SpringBoot靜態(tài)資源路徑管理問(wèn)題

    關(guān)于SpringBoot靜態(tài)資源路徑管理問(wèn)題

    這篇文章主要介紹了SpringBoot靜態(tài)資源路徑管理,主要包括默認(rèn)靜態(tài)資源路徑,增加靜態(tài)資源路徑前綴的相關(guān)操作,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05
  • maven打包本地jar到項(xiàng)目中的方法實(shí)現(xiàn)

    maven打包本地jar到項(xiàng)目中的方法實(shí)現(xiàn)

    本文主要介紹了maven打包本地jar到項(xiàng)目中的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • SpringBoot中對(duì)SpringMVC的自動(dòng)配置詳解

    SpringBoot中對(duì)SpringMVC的自動(dòng)配置詳解

    這篇文章主要介紹了SpringBoot中的SpringMVC自動(dòng)配置詳解,Spring MVC自動(dòng)配置是Spring Boot提供的一種特性,它可以自動(dòng)配置Spring MVC的相關(guān)組件,簡(jiǎn)化了開(kāi)發(fā)人員的配置工作,需要的朋友可以參考下
    2023-10-10
  • spring 重復(fù)注解和aop攔截的實(shí)現(xiàn)示例

    spring 重復(fù)注解和aop攔截的實(shí)現(xiàn)示例

    本文主要介紹了spring 重復(fù)注解和aop攔截的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08

最新評(píng)論

佛坪县| 东港市| 连江县| 个旧市| 织金县| 色达县| 云阳县| 西昌市| 柳江县| 三亚市| 叙永县| 德昌县| 鄂托克前旗| 板桥市| 兰州市| 蒙自县| 新建县| 蒲江县| 广西| 招远市| 长葛市| 滦平县| 治县。| 定州市| 芜湖县| 连州市| 临邑县| 武安市| 通城县| 东丽区| 涟水县| 江达县| 阳原县| 新乡市| 岢岚县| 普兰店市| 乐安县| 元江| 泰顺县| 醴陵市| 石门县|