struts2實現文件上傳(多文件上傳)及下載


一、要實現文件上傳,需在項目中添加兩個jar文件

二、上傳准備的頁面

注:必須植入enctype="multipart/form-data"屬性,以及提交方式要設置成post

 <h2>單個文件上傳</h2>
    <s:form action="upload.action" enctype="multipart/form-data" method="post">
    <s:textfield name="title" label="標題"/>
    <s:file name="upload" label="選擇文件"/><br/>
    <s:submit name="submit" value="上傳文件"></s:submit>
    
    </s:form>

實現文件上傳的Action類

public class UploadAction extends ActionSupport{
    //封裝上傳文件屬性
    private File upload;
    //封裝上傳文件的類型
    private String uploadContentType;
    //封裝上傳文件名稱
    private String uploadFileName;
    //獲取文件上傳的路徑
    private String savePath;
    
    @Override
    public String execute() throws Exception {
        byte[] buffer=new byte[1024];
        
        //讀取文件
        FileInputStream fis=new FileInputStream(getUpload());
        //保存文件
        FileOutputStream fos=new FileOutputStream(getSavePath()+"\\"+this.getUploadFileName());
        int length=fis.read(buffer);
        while(length>0){
            //每次寫入length長度的內容
            fos.write(buffer,0,length);
            length=fis.read(buffer);
        }
        fis.close();
        fos.flush();
        fos.close();
        
        return SUCCESS;
    }

      //獲取文件上傳的保存路徑 通過讀取存放目錄獲得保存路徑
       public String getSavePath() {
          return ServletActionContext.getServletContext().getRealPath(savePath);
     }

 

在Action中使用了三個屬性封裝文件信息:

File類型的XXX屬性,與表單的File控件的name屬性一樣,用於封裝File控件對應的文件內容

String類型的xxxFileName屬性,該屬性名稱由前面的File類型屬性和FileName組合,是固定的語法,是封裝File控件對應文件的文件名

String類型的XXXContentType屬性,同樣由xxx屬性和ContentType組合而成,是固定語法,封裝File控件對應文件的文件類型

配置Action:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
   <constant name="struts.devMode" value="true"></constant>
    <package name="default" namespace="/" extends="struts-default">
    <!-- 文件上傳 -->
        <action name="upload" class="cn.happy.action.UploadAction">
        <!-- 通過param參數設置保存目錄的路徑 -->
        <param name="savePath">/upload</param>
           <result name="success">ok.jsp</result> 
        </action>
        
    </package>
</struts>

上傳成功后的結果頁面:植入的value是Action類中所對應的實體類屬性

 您所上傳的文件是:<s:property value="uploadFileName"/><br/>
 文件類型:<s:property value="uploadContentType"/>

實現效果:


三、多文件上傳

與單文件上傳的不同之處在於 將三個屬性的類型修改成數組類型,並通過for循環進行遍歷

public class SomeUploadAction extends ActionSupport {

    // 封裝上傳文件屬性
    private File[] upload;

    // 封裝上傳文件的類型
    private String[] uploadContentType;

    // 封裝上傳文件名稱
    private String[] uploadFileName;

    // 封裝文件上傳的路徑
    private String savePath;

    public String execute() throws Exception {
        byte[] buffer = new byte[1024];
        for (int i = 0; i < upload.length; i++) {
            FileInputStream fis = new FileInputStream(getUpload()[i]);
            FileOutputStream fos = new FileOutputStream(getSavePath() + "\\"
                    + this.getUploadFileName()[i]);
            int length = fis.read(buffer);
            while (length > 0) {
                fos.write(buffer, 0, length);
                length = fis.read(buffer);
            }
            fos.flush();
            fos.close();
            fis.close();
        }
        return SUCCESS;
    }

      public String getSavePath() {
         return ServletActionContext.getServletContext().getRealPath(savePath);
       }

 

實現效果:


 

 四、實現文件下載

為了支持文件的下載,Struts2框架提供了stream結果類型,該類型的作用就是專門用於實現文件下載的功能

 

實現文件下載:

 由於在Struts2中實現文件下載時需要用到InputStream,所以在文件下載Action中要提供一個獲得InputStream的方法,通過這個輸入流將可以獲取希望下載的文件內容

public class DownAction extends ActionSupport{

    //讀取下載文件的目錄
    private String inputPath;
    //下載文件的文件名
    private String fileName;
    //讀取下載文件的輸入流
    private InputStream inputStream;
    //下載文件的類型
    private String conetntType;
    
    @Override
    public String execute() throws Exception {
        
        return SUCCESS;
    }
        //創建InputStream輸入流
    public InputStream getInputStream() throws FileNotFoundException {
        String path=ServletActionContext.getServletContext().getRealPath(inputPath);
        return new BufferedInputStream(new FileInputStream(path+"\\"+fileName));
    }

通過Context上下文得到下載文件的實際路徑,並構建了一個InputStream輸入流實現文件下載讀取

Action配置:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
   <constant name="struts.devMode" value="true"></constant>
    <package name="default" namespace="/" extends="struts-default">
   
        <!-- 文件下載 -->
        
         <action name="down" class="cn.happy.action.DownAction">
        <param name="inputPath">/image</param>
           <result name="success" type="stream">
           <param name="contentType">application/octet-stream</param>
           <param name="inputName">inputStream</param>
           <param name="contentDisposition">attachment;filename="${fileName}"</param>
           <param name="bufferSize">4096</param>
           </result> 
        </action>
    </package>
</struts>

在配置文件中,contentType參數決定了下載文件的類型。不同文件類型對應的參數值也是不同的。

通常情況下,contentType參數直接設置為application/octet-stream即可

contentDispoistion參數由兩個部分組成,前面的部分表示處理文件的形式,如attachement表示在下載時彈出對話框,提示用戶保存或者直接打開文件,而后一部分表示下載文件的名稱,兩部分之間以“;”進行分隔

當單擊超鏈接時,即可下載

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM