這一部分使用Struts2實(shí)現(xiàn)文件的上傳與下載。
必須條件:
前臺form表單<code>method="post" enctype="multipart/form-data"</code>
Struts2在原有的上傳解析器繼承上做了進(jìn)一步封裝褒搔,更進(jìn)一步簡化了文件上傳脸甘。
Struts2默認(rèn)使用的是Common-FileUpload的文件上傳框架恳啥,因此,如果需要使用Struts2的文件上傳功能丹诀,需要在web應(yīng)用中導(dǎo)入相應(yīng)的jar包钝的。
Action需要使用三個屬性來封裝該文件域的信息:
類型為File的xxx屬性封裝了該文件域?qū)?yīng)的文件的文件內(nèi)容。
類型為String的xxxFileName屬性封裝了該文件域?qū)?yīng)的文件的文件名稱铆遭。
類型為String的xxxContentType屬性封裝了該文件域?qū)?yīng)的文件的文件類型硝桩。
關(guān)鍵:
struts.xml配置攔截器,設(shè)置允許上傳類型枚荣、文件大小等信息碗脊。
上傳單個文件
web.xml
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
前臺頁面:
<h2>Struts2上傳</h2>
<s:form action="doUpload.action" method="post" enctype="multipart/form-data">
<s:file name="upload" label="File"/>
<s:submit value="上傳"/>${strutsResult}
</s:form>
在jsp頁面中增加Struts2的標(biāo)簽庫。
<%@ taglib uri="/struts-tags" prefix="s"%>
編寫UploadAction
public class UploadAction extends ActionSupport {
//文件內(nèi)容(要與前臺的name屬性值一致)
private File upload;
//文件類型
private String uploadContentType;
//文件名稱
private String uploadFileName;
//返回消息提示
private String strutsResult;
public File getUpload() {
return upload;
}
public void setUpload(File upload) {
this.upload = upload;
}
public String getUploadContentType() {
return uploadContentType;
}
public void setUploadContentType(String uploadContentType) {
this.uploadContentType = uploadContentType;
}
public String getUploadFileName() {
return uploadFileName;
}
public void setUploadFileName(String uploadFileName) {
this.uploadFileName = uploadFileName;
}
public String getStrutsResult() {
return strutsResult;
}
public void setStrutsResult(String strutsResult) {
this.strutsResult = strutsResult;
}
public String execute() throws IOException {
//獲取服務(wù)器上傳文件存放路徑
String path = ServletActionContext.getServletContext().getRealPath("/upload");
File file = new File(path);
if (!file.exists()) {
file.mkdir();
}
FileUtils.copyFile(upload, new File(file, uploadFileName));
strutsResult = "上傳成功";
return SUCCESS;
}
}
上面的三個基本屬性封裝重要的信息橄妆。
接下來來配置struts.xml
<?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.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="true" />
<package name="default" namespace="/" extends="struts-default">
<action name="doUpload" class="com.meng.action.UploadAction">
<result name="success">/index.jsp</result>
<!-- 配置攔截器限制上傳文件類型及大小 -->
<interceptor-ref name="fileUpload">
<param name="allowedType">image/bmp,image/x-png,image/gif,image/jpeg</param>
<param name="maximumSize">2M</param>
</interceptor-ref>
<interceptor-ref name="basicStack"></interceptor-ref>
</action>
</package>
</struts>
多文件上傳(批量上傳)
修改前臺頁面
<h2>上傳多個文件</h2>
<s:form action="doUpload.action" method="post" enctype="multipart/form-data">
<s:file name="upload" label="File"/>
<s:file name="upload" label="File"/>
<s:file name="upload" label="File"/>
<s:submit value="上傳"/>${strutsResult}
</s:form>
UploadAction
public class UploadAction extends ActionSupport {
// 文件內(nèi)容
private List<File> upload;
// 文件類型
private List<String> uploadContentType;
// 文件名稱
private List<String> uploadFileName;
// 返回消息提示
private String strutsResult;
public List<File> getUpload() {
return upload;
}
public void setUpload(List<File> upload) {
this.upload = upload;
}
public List<String> getUploadContentType() {
return uploadContentType;
}
public void setUploadContentType(List<String> uploadContentType) {
this.uploadContentType = uploadContentType;
}
public List<String> getUploadFileName() {
return uploadFileName;
}
public void setUploadFileName(List<String> uploadFileName) {
this.uploadFileName = uploadFileName;
}
public String getStrutsResult() {
return strutsResult;
}
public void setStrutsResult(String strutsResult) {
this.strutsResult = strutsResult;
}
public String execute() throws IOException {
// 獲取服務(wù)器上傳文件存放路徑
String path = ServletActionContext.getServletContext().getRealPath("/upload");
File file = new File(path);
if (!file.exists()) {
file.mkdir();
}
for (int i = 0; i < upload.size(); i++) {
FileUtils.copyFile(upload.get(i), new File(file, uploadFileName.get(i)));
}
strutsResult = "上傳成功";
return SUCCESS;
}
}
這樣就能成功的完成上傳的功能衙伶。
文件的下載
通常情況下,我們在下載文件的時候害碾,文件的路徑都是股固定的矢劲。
所以實(shí)現(xiàn)起來也是比較簡單的。
在前臺給定一個連接
<h2>Struts2下載</h2>
<a href="doDownload.action">下載</a>
然后配置struts.xml慌随,添加如下配置:
<action name="doDownload" class="com.meng.action.download.DownloadAction">
<param name="inputPath">/upload/10.jpg</param>
<result name="success" type="stream">
<param name="contentType">application/octet-stream</param>
<param name="inputName">inputStream</param>
<param name="contentDisposition">attachment;filename="10.jpg"</param>
<param name="bufferSize">8192</param>
</result>
</action>
編寫DownloadAction
public class DownloadAction extends ActionSupport {
private String inputPath;
public String getInputPath() {
return inputPath;
}
public void setInputPath(String inputPath) {
this.inputPath = inputPath;
}
@Override
public String execute() throws Exception {
return SUCCESS;
}
public InputStream getInputStream() {
return ServletActionContext.getServletContext().getResourceAsStream(inputPath);
}
}
當(dāng)我們點(diǎn)擊連接的時候卧须,就會下載我們所給定的文件。
但是這樣配置很是不方便儒陨,我們可以通過URL來給定所要下載的文件名稱花嘶。
將上面的代碼進(jìn)行修改:
<a href="doDownload.action?filename=10.jpg">下載</a>
<action name="doDownload" class="com.meng.action.download.DownloadAction">
<result name="success" type="stream">
<param name="contentType">application/octet-stream</param>
<param name="inputName">inputStream</param>
<param name="contentDisposition">attachment;filename="${downloadFileName}"</param>
<param name="bufferSize">8192</param>
</result>
</action>
public class DownloadAction extends ActionSupport {
private String filename;
public String getFilename() {
return filename;
}
public void setFilename(String filename) {
this.filename = filename;
}
@Override
public String execute() throws Exception {
return SUCCESS;
}
public InputStream getInputStream() throws IOException {
String path = ServletActionContext.getServletContext().getRealPath("/upload");
String filepath = path + "\\" + filename;
File file = new File(filepath);
return FileUtils.openInputStream(file);
}
public String getDownloadFileName() {
String downloadFileName = "";
try {
// 轉(zhuǎn)換下中文的文件名的的編碼
downloadFileName = URLEncoder.encode("文件下載.jpg", "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return downloadFileName;
}
}
這樣配置是不是用起來的時候會方便的多。