Struts2知識點回顧(六)文件上傳與下載

文件上傳

準備工作

既然是struts2框架中的文件上傳功能,當然就需要struts2的jar包,以及支持文件上傳所要用到的輔助包,在我的項目下有以下jar包:
這裏寫圖片描述

編碼流程

  1. 準備好文件保存目錄。
  2. 編寫上傳頁面(表單)。
  3. 創建Action繼承ActionSupport,在我這裏是FileUploadAction.java。
  4. 聲明接收文件各項參數的變量並且提供getter、setter,在我這裏是文件類型:xlsContentType、文件名:xlsName,文件xls。其中xls爲表單組件中name屬性對應的值。
  5. 編寫action處理方法,在我這裏是upload()方法,方法中執行了解析Excel文件和保存文件。我在這裏順便學習瞭如何使用jxl工具來解析Excel文件。所以jar包中多了個jxl.jar。
  6. 在配置文件struts.xml中配置action

開始寫代碼

1.上傳文件的頁面fileupload.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
    <fieldset style="width:300px;height:100px;text-align:center;">
        <legend>文件上傳</legend>
        <!-- method要使用POST提交,eenctype要設置成multipart/form-data -->
        <form action="${pageContext.request.contextPath }/upload" method="post" enctype="multipart/form-data">
            <!-- 這個name需要在action中聲明,用來接收這個參數域-->
            <input type="file" name="xls"><br><br>
            <input type="submit" value="上傳文件">
        </form>
    </fieldset>
</body>
</html>

2.FileUploadAction.java

package action;


import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;

import org.apache.struts2.ServletActionContext;

import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;

import com.opensymphony.xwork2.ActionSupport;

public class FileUploadAction extends ActionSupport{
    private String xlsFileName;
    private String xlsContentType;
    private File xls;
    public String upload() throws Exception{
        FileInputStream in = new FileInputStream(xls);
        //從輸入流中構建Workbook對象
        Workbook workbook = Workbook.getWorkbook(in);
        Sheet s = workbook.getSheet(0);
        int count = s.getRows();
        System.out.println("文件名:" + xlsFileName);
        System.out.println("文件類型:" + xlsContentType);
        //遍歷cell,cell爲單元格
        for(int i = 0; i < count; i++){
            Cell[] cells = s.getRow(i);
            for(Cell cell : cells){
                System.out.print(cell.getContents() + "\t");
            }
            System.out.println();
        }
        //保存上傳的文件
        File save = new File(ServletActionContext.getServletContext().getRealPath(xlsFileName));
        OutputStream out = new FileOutputStream(save);
        int b = 0;
        while((b = in.read()) != -1){
            out.write(b);
        }
        in.close();
        out.close();
        return SUCCESS;
    }
    public String getXlsFileName() {
        return xlsFileName;
    }
    public void setXlsFileName(String xlsFileName) {
        this.xlsFileName = xlsFileName;
    }
    public File getXls() {
        return xls;
    }
    public void setXls(File xls) {
        this.xls = xls;
    }
    public String getXlsContentType() {
        return xlsContentType;
    }
    public void setXlsContentType(String xlsContentType) {
        this.xlsContentType = xlsContentType;
    }
}

3.struts.xml

<package name="upload" extends="struts-default" namespace="/">
        <action name="upload" class="action.FileUploadAction" method="upload">
            <result name="success">/success.jsp</result>
        </action>
</package>

運行結果

這裏寫圖片描述


文件下載

個人覺得文件下載比文件上傳難理解,但是自己做過一遍具體流程之後,就能從中理解怎麼實現。

編碼流程

  1. 提供下載頁面。
  2. 準備好提供下載的文件。
  3. 創建Action繼承ActionSupport,聲明下載時顯示的文件名,並提供getter、setter(在action中聲明能解決中文亂碼問題)。在我這裏Action是FileDownload.action,文件名是fileName。
  4. 編寫一個方法簽名爲 public InputStream getXXX()的方法,其中XXX要與配置文件中的配置對應。並且返回值返回的是包含要下載文件的輸入流。在我這裏是getFile()。
  5. 編寫一個action方法來對外提供下載。
  6. 配置文件中配置action。

開始寫代碼

1.下載頁面filedownload.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>文件下載</title>
</head>
<body>
    <fieldset>
        <legend>文件下載</legend>
        <a href="${pageContext.servletContext.contextPath }/download">點擊下載</a>
    </fieldset>
</body>
</html>

2.FileDownloadAction.java

package action;

import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

import javax.servlet.Servlet;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class FileDownloadAction extends ActionSupport {

    private String fileName;
    //這個方法名需要與struts.xml中指定的一致
    public InputStream getFile() throws UnsupportedEncodingException{
        //文件中文名用URLEncoder編譯一下。
        this.fileName = URLEncoder.encode("示例.xls", "UTF-8");
        //返回包含了文件的輸入流
        return ServletActionContext.getServletContext().getResourceAsStream("file/示例.xls");
    }
    //對外部訪問的action,在配置文件中對名爲“success”的結果進行配置。
    public String download(){
        return SUCCESS;
    }
    public String getFileName() {
        return fileName;
    }
    public void setFileName(String fileName) {
        this.fileName = fileName;
    }
}

3.配置文件struts.xml(最重要的一步)

<package name="download" extends="struts-default" namespace="/">
    <action name="download" class="action.FileDownloadAction" method="download">
        <result name="success" type="stream">
            <param name="contentType">text/plain</param>  
            <!-- 指定文件名稱 -->
            <param name="contentDisposition">attachment;filename="${fileName}"</param>
            <!-- 這個就是指定要取哪個方法的輸入流的配置 -->
                <param name="inputName">file</param> 
        </result>
    </action>
</package>
發佈了58 篇原創文章 · 獲贊 8 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章