struts2的文件上传下载

       struts2提供了文件的上传下载功能,不过需要我们对其提供相关的文件参数。

比如文件上传,必须提供三种属性,并对其提供setter和getter方法,而且必须按照以下规范命名:

private File XXX;

private String XXXFileName;

private String XXXContentType;   

注意:必须是上面的格式,即XXX,XXX+FileName,XXX+ContentType。如果不是上面的形式,拦截器不会对其赋值。

下面是代码:(MyFileUpload.java)

package com.hncj.edu;

import java.io.File;
import java.io.IOException;

import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class MyFileUpload extends ActionSupport{
	private File upload;
	private String uploadFileName;
	private String uploadContentType; //三种属性格式固定
	public File getUpload() {
		return upload;
	}
	public void setUpload(File upload) {
		this.upload = upload;
	}
	public String getUploadFileName() {
		return uploadFileName;
	}
	public void setUploadFileName(String uploadFileName) {
		this.uploadFileName = uploadFileName;
	}
	public String getUploadContentType() {
		return uploadContentType;
	}
	public void setUploadContentType(String uploadContentType) {
		this.uploadContentType = uploadContentType;
	}
	public String executeUpload() {
		String realPath = ServletActionContext.getServletContext().getRealPath("/WEB-INF/upload");
		File uploadDir = new File(realPath);
		if(!uploadDir.exists()) {
			uploadDir.mkdir();
		}
		try {
                     //复制文件调用copyFile就行了
			FileUtils.copyFile(upload, new File(realPath+File.separator+uploadFileName));
               		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return "success";
	}
}

上传视图:(upload.jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<s:actionerror/>
	<s:form action="upload" method="post" enctype="multipart/form-data">
		<s:file name="upload" label="请选择文件"></s:file>
		<s:submit label="提交"/>
	</s:form>
</body>
</html>

上传成功后跳转到下载视图,显示所有可以下载的文件:(result.jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
        //页面中发出list.action请求,在showFileItems.jsp页面中显示所有文件项,并将showFileItems.jsp的内容显示在result.jsp页面中
	<s:action name="list" executeResult="true"/>
</body>
</html>

showFileItems.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<table>
		<s:iterator var="item" value="fileNames">
			<tr>
				<td>${item}</td>
				<td>
                                        //这里要用url标签,不然传递中文文件名会报错
					<s:url var="url" value="download">
						<s:param name="fileName">${item}</s:param>
					</s:url>
                                        //使用上面url标签定义的值
					<s:a href="%{#url}">下载</s:a>
				</td>
			</tr>
		</s:iterator>
	</table>
	<s:debug></s:debug>
</body>
</html>

显示文件项的Action:(ListAllFiles.java)

package com.hncj.edu;

import java.io.File;

import org.apache.struts2.ServletActionContext;

public class ListAllFiles {
	private String[] fileNames;

	public String[] getFileNames() {
		return fileNames;
	}

	public void setFileNames(String[] fileNames) {
		this.fileNames = fileNames;
	}
	
	public String listFiles() {
		String realPath = ServletActionContext.getServletContext().getRealPath("/WEB-INF/upload");
		File dir = new File(realPath);
                //获取上传目录下所有文件的文件名
		fileNames = dir.list();
		return "success";
	}
}

下载的action:(MyFileDownload.java)

文件下载必须要提供对应文件的输入流,为其赋值,并提供get方法。

package com.hncj.edu;

import java.io.InputStream;

import org.apache.struts2.ServletActionContext;

public class MyFileDownload {
	private InputStream input; //必须的
	private String fileName; //还可以提供ContentType,ContentLength等属性
	public InputStream getInput() {
		return input;
	}
	public void setInput(InputStream input) {
		this.input = input;
	}
	public String getFileName() {
		return fileName;
	}
	public void setFileName(String fileName) {
		this.fileName = fileName;
	}
	public String execute() {
		this.input = ServletActionContext.getServletContext().getResourceAsStream("/WEB-INF/upload"+"/"+fileName);
		return "success";
	}
}

strust.xml配置文件

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">


<struts>
    <constant name="struts.devMode" value="true"/>
    <package name="pack1" extends="struts-default">
    	<action name="upload" class="com.hncj.edu.MyFileUpload" method="executeUpload">
    		<interceptor-ref name="defaultStack">
                        <!--限制文件上传的大小-->
    			<param name="fileUpload.maximumSize">102400</param>
                        <!--限制文件的后缀名-->
    			<param name="fileUpload.allowedExtensions">.txt</param>
                        <!--还可以限制文件的类型-->
                        <param name="fileUpload.allowedTypes>image/jpeg<param>
    		</interceptor-ref>
    		<result name="success">result.jsp</result>
    		<result name="input">upload.jsp</result>
    	</action>
    	<action name="list" class="com.hncj.edu.ListAllFiles" method="listFiles">
    		<result>showFileItems.jsp</result>
    	</action>
    	<action name="download" class="com.hncj.edu.MyFileDownload">
    		<result type="stream">
                        <!--inputName要和action中的输入流名字相同-->
    			<param name="inputName">input</param>
                        <!--设置下载方式打开-->
    			<param name="contentDisposition">attachment;filename=${fileName}</param>
                        <!--设置缓冲区大小-->
    			<param name="bufferSize">4096</param>
    		</result>
    	</action>
    </package>
</struts>

运行结果:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章