文件上傳
準備工作
既然是struts2框架中的文件上傳功能,當然就需要struts2的jar包,以及支持文件上傳所要用到的輔助包,在我的項目下有以下jar包:
編碼流程
- 準備好文件保存目錄。
- 編寫上傳頁面(表單)。
- 創建Action繼承ActionSupport,在我這裏是FileUploadAction.java。
- 聲明接收文件各項參數的變量並且提供getter、setter,在我這裏是文件類型:xlsContentType、文件名:xlsName,文件xls。其中xls爲表單組件中name屬性對應的值。
- 編寫action處理方法,在我這裏是upload()方法,方法中執行了解析Excel文件和保存文件。我在這裏順便學習瞭如何使用jxl工具來解析Excel文件。所以jar包中多了個jxl.jar。
- 在配置文件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>
運行結果
文件下載
個人覺得文件下載比文件上傳難理解,但是自己做過一遍具體流程之後,就能從中理解怎麼實現。
編碼流程
- 提供下載頁面。
- 準備好提供下載的文件。
- 創建Action繼承ActionSupport,聲明下載時顯示的文件名,並提供getter、setter(在action中聲明能解決中文亂碼問題)。在我這裏Action是FileDownload.action,文件名是fileName。
- 編寫一個方法簽名爲 public InputStream getXXX()的方法,其中XXX要與配置文件中的配置對應。並且返回值返回的是包含要下載文件的輸入流。在我這裏是getFile()。
- 編寫一個action方法來對外提供下載。
- 配置文件中配置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>