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

JavaWeb中struts2實(shí)現(xiàn)文件上傳下載功能實(shí)例解析

 更新時(shí)間:2020年12月13日 09:31:46   作者:xiaoluo501395377  
這篇文章主要介紹了JavaWeb中struts2文件上傳下載功能的實(shí)現(xiàn),在Web應(yīng)用系統(tǒng)開(kāi)發(fā)中,文件上傳和下載功能是非常常用的功能,需要的朋友可以參考下

在做B/S系統(tǒng)時(shí),通常會(huì)涉及到上傳文件和下載文件,在沒(méi)接struts2框架之前,我們都是使用apache下面的commons子項(xiàng)目的FileUpload組件來(lái)進(jìn)行文件的上傳,但是那樣做的話,代碼看起來(lái)比較繁瑣,而且不靈活,在學(xué)習(xí)了struts2后,struts2為文件上傳下載提供了更好的實(shí)現(xiàn)機(jī)制,在這里我分別就單文件上傳和多文件上傳的源代碼進(jìn)行一下講解,這里需要導(dǎo)入文件下載上傳的兩個(gè)jar文件,一個(gè)是commons-fileupload-1.2.2.jar,另一個(gè)是commons-io-2.0.1.jar

struts2單文件上傳:

首先是一個(gè)jsp文件上傳頁(yè)面,這個(gè)比較簡(jiǎn)單,就是一個(gè)表單,里面有個(gè)文件上傳框

 <!--在進(jìn)行文件上傳時(shí),表單提交方式一定要是post的方式,因?yàn)槲募蟼鲿r(shí)二進(jìn)制文件可能會(huì)很大,還有就是enctype屬性,這個(gè)屬性一定要寫(xiě)成multipart/form-data,
  不然就會(huì)以二進(jìn)制文本上傳到服務(wù)器端--> 
  <form action="fileUpload.action" method="post" enctype="multipart/form-data">
   
  username: <input type="text" name="username"><br>
  file: <input type="file" name="file"><br>
  
  <input type="submit" value="submit">
 </form>

接下來(lái)是FileUploadAction部分代碼,因?yàn)閟truts2對(duì)上傳和下載都提供了很好的實(shí)習(xí)機(jī)制,所以在action這段我們只需要寫(xiě)很少的代碼就行:

public class FileUploadAction extends ActionSupport
{
 private String username;
 
   //注意,file并不是指前端jsp上傳過(guò)來(lái)的文件本身,而是文件上傳過(guò)來(lái)存放在臨時(shí)文件夾下面的文件
 private File file;
 
 //提交過(guò)來(lái)的file的名字
 private String fileFileName;
 
 //提交過(guò)來(lái)的file的MIME類型
 private String fileContentType;

 public String getUsername()
 {
  return username;
 }

 public void setUsername(String username)
 {
  this.username = username;
 }

 public File getFile()
 {
  return file;
 }

 public void setFile(File file)
 {
  this.file = file;
 }

 public String getFileFileName()
 {
  return fileFileName;
 }

 public void setFileFileName(String fileFileName)
 {
  this.fileFileName = fileFileName;
 }

 public String getFileContentType()
 {
  return fileContentType;
 }

 public void setFileContentType(String fileContentType)
 {
  this.fileContentType = fileContentType;
 }
 
 @Override
 public String execute() throws Exception
 {
  String root = ServletActionContext.getServletContext().getRealPath("/upload");
  
  InputStream is = new FileInputStream(file);
  
  OutputStream os = new FileOutputStream(new File(root, fileFileName));
  
  System.out.println("fileFileName: " + fileFileName);

    // 因?yàn)閒ile是存放在臨時(shí)文件夾的文件,我們可以將其文件名和文件路徑打印出來(lái),看和之前的fileFileName是否相同
  System.out.println("file: " + file.getName());
  System.out.println("file: " + file.getPath());
  
  byte[] buffer = new byte[500];
  int length = 0;
  
  while(-1 != (length = is.read(buffer, 0, buffer.length)))
  {
   os.write(buffer);
  }
  
  os.close();
  is.close();
  
  return SUCCESS;
 }
}

首先我們要清楚一點(diǎn),這里的file并不是真正指代jsp上傳過(guò)來(lái)的文件,當(dāng)文件上傳過(guò)來(lái)時(shí),struts2首先會(huì)尋找struts.multipart.saveDir(這個(gè)是在default.properties里面有)這個(gè)name所指定的存放位置,我們可以新建一個(gè)struts.properties屬性文件來(lái)指定這個(gè)臨時(shí)文件存放位置,如果沒(méi)有指定,那么文件會(huì)存放在tomcat的apache-tomcat-7.0.29\work\Catalina\localhost\目錄下,然后我們可以指定文件上傳后的存放位置,通過(guò)輸出流將其寫(xiě)到流里面就行了,這時(shí)我們就可以在文件夾里看到我們上傳的文件了。

文件上傳后我們還需要將其下載下來(lái),其實(shí)struts2的文件下載原理很簡(jiǎn)單,就是定義一個(gè)輸入流,然后將文件寫(xiě)到輸入流里面就行,關(guān)鍵配置還是在struts.xml這個(gè)配置文件里配置:

FileDownloadAction代碼如下:

public class FileDownloadAction extends ActionSupport
{
 public InputStream getDownloadFile()
 {
  return ServletActionContext.getServletContext().getResourceAsStream("upload/通訊錄2012年9月4日.xls");
 }
 
 @Override
 public String execute() throws Exception
 {
  return SUCCESS;
 }
}

我們看,這個(gè)action只是定義了一個(gè)輸入流,然后為其提供getter方法就行,接下來(lái)我們看看struts.xml的配置文件:

  <action name="fileDownload" class="com.xiaoluo.struts2.FileDownloadAction">
   <result name="success" type="stream">
    <param name="contentDisposition">attachment;filename="通訊錄2012年9月4日.xls"</param>
    <param name="inputName">downloadFile</param>
   </result>
  </action>

struts.xml配置文件有幾個(gè)地方我們要注意,首先是result的類型,以前我們定義一個(gè)action,result那里我們基本上都不寫(xiě)type屬性,因?yàn)槠淠J(rèn)是請(qǐng)求轉(zhuǎn)發(fā)(dispatcher)的方式,除了這個(gè)屬性一般還有redirect(重定向)等這些值,在這里因?yàn)槲覀冇玫氖俏募螺d,所以type一定要定義成stream類型,告訴action這是文件下載的result,result元素里面一般還有param子元素,這個(gè)是用來(lái)設(shè)定文件下載時(shí)的參數(shù),inputName這個(gè)屬性就是得到action中的文件輸入流,名字一定要和action中的輸入流屬性名字相同,然后就是contentDisposition屬性,這個(gè)屬性一般用來(lái)指定我們希望通過(guò)怎么樣的方式來(lái)處理下載的文件,如果值是attachment,則會(huì)彈出一個(gè)下載框,讓用戶選擇是否下載,如果不設(shè)定這個(gè)值,那么瀏覽器會(huì)首先查看自己能否打開(kāi)下載的文件,如果能,就會(huì)直接打開(kāi)所下載的文件,(這當(dāng)然不是我們所需要的),另外一個(gè)值就是filename這個(gè)就是文件在下載時(shí)所提示的文件下載名字。在配置完這些信息后,我們就能過(guò)實(shí)現(xiàn)文件的下載功能了。

struts2多文件上傳

其實(shí)多文件上傳和單文件上傳原理一樣,單文件上傳過(guò)去的是單一的File,多文件上傳過(guò)去的就是一個(gè)List<File>集合或者是一個(gè)File[]數(shù)組,首先我們來(lái)看一下前端jsp部分的代碼,這里我用到了jquery來(lái)實(shí)現(xiàn)動(dòng)態(tài)的添加文件下載框以及動(dòng)態(tài)的刪除下載框:

 <script type="text/javascript" src="script/jquery-1.8.1.js"></script>
 <script type="text/javascript">
   
  $(function()
  {
   $("#button").click(function()
   {
    var html = $("<input type='file' name='file'>");
    var button = $("<input type='button' name='button' value='刪除'><br>");
    
    $("#body div").append(html).append(button);
    
    button.click(function()
    {
     html.remove();
     button.remove();
    })
   })
  })
 
 </script>
 </head>
 
 <body id="body">

 <form action="fileUpload2.action" method="post" enctype="multipart/form-data">
 
  username: <input type="text" name="username"><br>
  file: <input type="file" name="file">
  <input type="button" value="添加" id="button"><br>
  <div></div>
  <input type="submit" value="submit"> 
  
 </form>

 </body>

file的名字必須都命名成file才行,然后處理多文件上傳的action代碼如下:

public class FileUploadAction2 extends ActionSupport
{
 private String username;
 
  //這里用List來(lái)存放上傳過(guò)來(lái)的文件,file同樣指的是臨時(shí)文件夾中的臨時(shí)文件,而不是真正上傳過(guò)來(lái)的文件
 private List<File> file;
 
  //這個(gè)List存放的是文件的名字,和List<File>中的文件相對(duì)應(yīng)
 private List<String> fileFileName;
 
 private List<String> fileContentType;

 public String getUsername()
 {
  return username;
 }

 public void setUsername(String username)
 {
  this.username = username;
 }

 public List<File> getFile()
 {
  return file;
 }

 public void setFile(List<File> file)
 {
  this.file = file;
 }

 public List<String> getFileFileName()
 {
  return fileFileName;
 }

 public void setFileFileName(List<String> fileFileName)
 {
  this.fileFileName = fileFileName;
 }

 public List<String> getFileContentType()
 {
  return fileContentType;
 }

 public void setFileContentType(List<String> fileContentType)
 {
  this.fileContentType = fileContentType;
 }
 
 @Override
 public String execute() throws Exception
 {
  String root = ServletActionContext.getServletContext().getRealPath("/upload");
  
  for(int i = 0; i < file.size(); i++)
  {
   InputStream is = new FileInputStream(file.get(i));
   
   OutputStream os = new FileOutputStream(new File(root, fileFileName.get(i)));
   
   byte[] buffer = new byte[500];
   
   @SuppressWarnings("unused")
   int length = 0;
   
   while(-1 != (length = is.read(buffer, 0, buffer.length)))
   {
    os.write(buffer);
   }
   
   os.close();
   is.close();
  }
  
  return SUCCESS;
 }
}

這樣同樣將其寫(xiě)到一個(gè)輸出流里面,這樣我們就可以在文件夾里看到上傳的多個(gè)文件了

接下來(lái)的文件下載就和剛才的文件下載一模一樣,struts.xml也是一樣的,這里就不再重復(fù)了

總結(jié):總的來(lái)說(shuō),struts2提供的文件上傳下載機(jī)制簡(jiǎn)化了我們很多代碼,我們可以在以后的項(xiàng)目中使用該機(jī)制,同樣我們也可以使用FileUpload組件來(lái)進(jìn)行文件的上傳,這個(gè)都是因個(gè)人愛(ài)好決定!

關(guān)于JavaWeb中的文件上傳和下載功能的內(nèi)容就這么多,謝謝大家的閱讀。

相關(guān)文章

  • Java設(shè)計(jì)模式--代理模式

    Java設(shè)計(jì)模式--代理模式

    代理就是一個(gè)人或者一個(gè)機(jī)構(gòu)代表另一個(gè)人或者另一個(gè)機(jī)構(gòu)采取行動(dòng)。在一些情況下,一個(gè)客戶不想或者不能夠直接引用一個(gè)對(duì)象,而代理對(duì)象可以在客戶端和目標(biāo)對(duì)象之前起到中介的作用
    2021-07-07
  • Spring Boot實(shí)現(xiàn)簡(jiǎn)單的定時(shí)任務(wù)

    Spring Boot實(shí)現(xiàn)簡(jiǎn)單的定時(shí)任務(wù)

    這篇文章主要給大家介紹了關(guān)于利用Spring Boot實(shí)現(xiàn)簡(jiǎn)單的定時(shí)任務(wù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • springMVC的生命周期詳解

    springMVC的生命周期詳解

    本篇文章主要介紹了springMVC的生命周期詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-03-03
  • JAVA讀取PDF、WORD文檔實(shí)例代碼

    JAVA讀取PDF、WORD文檔實(shí)例代碼

    本篇文章主要通過(guò)實(shí)例代碼介紹了JAVA讀取PDF、WORD文檔,需要的朋友可以參考下
    2017-04-04
  • Java中的Timer與TimerTask源碼及使用解析

    Java中的Timer與TimerTask源碼及使用解析

    這篇文章主要介紹了Java中的Timer與TimerTask源碼及使用解析,在Java中,經(jīng)常使用Timer來(lái)定時(shí)調(diào)度任務(wù),Timer調(diào)度任務(wù)有一次性調(diào)度和循環(huán)調(diào)度,循環(huán)調(diào)度有分為固定速率調(diào)度(fixRate)和固定時(shí)延調(diào)度(fixDelay),需要的朋友可以參考下
    2023-10-10
  • logback 自定義Pattern模板教程

    logback 自定義Pattern模板教程

    這篇文章主要介紹了logback 自定義Pattern模板教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java操作Elasticsearch?rest-high-level-client?的基本使用

    Java操作Elasticsearch?rest-high-level-client?的基本使用

    這篇文章主要介紹了Java操作Elasticsearch?rest-high-level-client?的基本使用,本篇主要講解一下?rest-high-level-client?去操作?Elasticsearch的方法,結(jié)合實(shí)例代碼給大家詳細(xì)講解,需要的朋友可以參考下
    2022-10-10
  • 關(guān)于@Entity和@Table注解的用法詳解

    關(guān)于@Entity和@Table注解的用法詳解

    這篇文章主要介紹了關(guān)于@Entity和@Table注解的用法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • idea 設(shè)置鼠標(biāo)懸停(放上)彈出注釋的方法

    idea 設(shè)置鼠標(biāo)懸停(放上)彈出注釋的方法

    這篇文章主要介紹了idea 設(shè)置鼠標(biāo)懸停(放上)彈出注釋的方法,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • springboot hazelcast緩存中間件的實(shí)例代碼

    springboot hazelcast緩存中間件的實(shí)例代碼

    這篇文章主要介紹了springboot hazelcast緩存中間件的實(shí)例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-08-08

最新評(píng)論

德州市| 周宁县| 永吉县| 安义县| 隆林| 南城县| 保亭| 民权县| 白山市| 蒙山县| 枝江市| 涟水县| 佛学| 漠河县| 苍山县| 宽城| 新丰县| 安龙县| 札达县| 巧家县| 和顺县| 安溪县| 纳雍县| 吕梁市| 平罗县| 沙湾县| 灌云县| 沙河市| 鹤岗市| 二连浩特市| 乡城县| 唐海县| 德钦县| 开平市| 宁波市| 阿拉尔市| 乐清市| 孟连| 英山县| 寿光市| 隆德县|