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

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

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

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

struts2單文件上傳:

首先是一個jsp文件上傳頁面,這個比較簡單,就是一個表單,里面有個文件上傳框

 <!--在進行文件上傳時,表單提交方式一定要是post的方式,因為文件上傳時二進制文件可能會很大,還有就是enctype屬性,這個屬性一定要寫成multipart/form-data,
  不然就會以二進制文本上傳到服務器端--> 
  <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>

接下來是FileUploadAction部分代碼,因為struts2對上傳和下載都提供了很好的實習機制,所以在action這段我們只需要寫很少的代碼就行:

public class FileUploadAction extends ActionSupport
{
 private String username;
 
   //注意,file并不是指前端jsp上傳過來的文件本身,而是文件上傳過來存放在臨時文件夾下面的文件
 private File file;
 
 //提交過來的file的名字
 private String fileFileName;
 
 //提交過來的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);

    // 因為file是存放在臨時文件夾的文件,我們可以將其文件名和文件路徑打印出來,看和之前的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;
 }
}

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

文件上傳后我們還需要將其下載下來,其實struts2的文件下載原理很簡單,就是定義一個輸入流,然后將文件寫到輸入流里面就行,關鍵配置還是在struts.xml這個配置文件里配置:

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;
 }
}

我們看,這個action只是定義了一個輸入流,然后為其提供getter方法就行,接下來我們看看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配置文件有幾個地方我們要注意,首先是result的類型,以前我們定義一個action,result那里我們基本上都不寫type屬性,因為其默認是請求轉(zhuǎn)發(fā)(dispatcher)的方式,除了這個屬性一般還有redirect(重定向)等這些值,在這里因為我們用的是文件下載,所以type一定要定義成stream類型,告訴action這是文件下載的result,result元素里面一般還有param子元素,這個是用來設定文件下載時的參數(shù),inputName這個屬性就是得到action中的文件輸入流,名字一定要和action中的輸入流屬性名字相同,然后就是contentDisposition屬性,這個屬性一般用來指定我們希望通過怎么樣的方式來處理下載的文件,如果值是attachment,則會彈出一個下載框,讓用戶選擇是否下載,如果不設定這個值,那么瀏覽器會首先查看自己能否打開下載的文件,如果能,就會直接打開所下載的文件,(這當然不是我們所需要的),另外一個值就是filename這個就是文件在下載時所提示的文件下載名字。在配置完這些信息后,我們就能過實現(xiàn)文件的下載功能了。

struts2多文件上傳

其實多文件上傳和單文件上傳原理一樣,單文件上傳過去的是單一的File,多文件上傳過去的就是一個List<File>集合或者是一個File[]數(shù)組,首先我們來看一下前端jsp部分的代碼,這里我用到了jquery來實現(xiàn)動態(tài)的添加文件下載框以及動態(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來存放上傳過來的文件,file同樣指的是臨時文件夾中的臨時文件,而不是真正上傳過來的文件
 private List<File> file;
 
  //這個List存放的是文件的名字,和List<File>中的文件相對應
 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;
 }
}

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

接下來的文件下載就和剛才的文件下載一模一樣,struts.xml也是一樣的,這里就不再重復了

總結:總的來說,struts2提供的文件上傳下載機制簡化了我們很多代碼,我們可以在以后的項目中使用該機制,同樣我們也可以使用FileUpload組件來進行文件的上傳,這個都是因個人愛好決定!

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

相關文章

  • Java設計模式--代理模式

    Java設計模式--代理模式

    代理就是一個人或者一個機構代表另一個人或者另一個機構采取行動。在一些情況下,一個客戶不想或者不能夠直接引用一個對象,而代理對象可以在客戶端和目標對象之前起到中介的作用
    2021-07-07
  • Spring Boot實現(xiàn)簡單的定時任務

    Spring Boot實現(xiàn)簡單的定時任務

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

    springMVC的生命周期詳解

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

    JAVA讀取PDF、WORD文檔實例代碼

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

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

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

    logback 自定義Pattern模板教程

    這篇文章主要介紹了logback 自定義Pattern模板教程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    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的方法,結合實例代碼給大家詳細講解,需要的朋友可以參考下
    2022-10-10
  • 關于@Entity和@Table注解的用法詳解

    關于@Entity和@Table注解的用法詳解

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

    idea 設置鼠標懸停(放上)彈出注釋的方法

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

    springboot hazelcast緩存中間件的實例代碼

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

最新評論

宜春市| 望谟县| 宣化县| 中江县| 伊宁县| 唐海县| 漾濞| 建平县| 苍南县| 新巴尔虎左旗| 阜新| 青河县| 綦江县| 花垣县| 扎赉特旗| 东阳市| 丰台区| 龙里县| 分宜县| 民丰县| 绥阳县| 大丰市| 静乐县| 峨眉山市| 福鼎市| 皋兰县| 亚东县| 天柱县| 富锦市| 邻水| 唐山市| 余江县| 清新县| 屯门区| 绥中县| 枣阳市| 楚雄市| 油尖旺区| 开封市| 布拖县| 基隆市|