实例:
jsp页面
<%@ page language="java" contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!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">
<title>文件上传</title>
<link rel="stylesheet"
href="${pageContext.request.contextPath }/js/AjaxFileUploaderV2.1/ajaxfileupload.css">
<script type="text/javascript"
src="${pageContext.request.contextPath }/js/AjaxFileUploaderV2.1/jquery.js"></script>
<script type="text/javascript"
src="${pageContext.request.contextPath }/js/AjaxFileUploaderV2.1/ajaxfileupload.js"></script>
<script type="text/javascript">
function FormSubmit() {
var file = $("#file").val();
if (file == "") {
alert("请选择文件");
return;
}
var fileType = file.substring(file.lastIndexOf(".") + 1);
if (fileType != "docx" && fileType != "doc") {
alert("上传文件格式错误");
return;
}
var url = "${pageContext.request.contextPath}/struts2_upload.action?nowtime="
+ new Date().getTime();
$.ajaxFileUpload({
url : url,
secureuri : false,
fileElementId : "file", //file的id
dataType : 'json',//返回值类型 一般设置为json
success : function(data, status) {
alert(data.message);
}
});
}
</script>
</head>
<body>
<div>
<form
action="${pageContext.request.contextPath }/struts2_upload.action"
method="post" enctype="multipart/form-data">
<p>
<label>请选择上传文件:</label><input type="file" name="file" id="file">
</p>
<p>
<input type="button" value="提交" onclick="FormSubmit();" />
</p>
</form>
</div>
</body>
</html>
Action代码
package org.zsm.learn.struts2.action;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.io.IOUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class FileUploadAction extends ActionSupport {
private static final long serialVersionUID = -1063647163701747470L;
// 与上传文件相关的三个参数
private File file;
private String fileFileName;
private String fileContentType;
// Action相关参数的设置
private String savePath;
private long maximumSize;
private String allowedTypes;
// 返回结果
private Map<String, Object> result;
public Map<String, Object> getResult() {
return result;
}
public String upload() {
result = new HashMap<String, Object>();
// 判断上传文件是否符合要求
if (getFile() == null) {
result.put("success", false);
result.put("messages", "上传文件不能为空!!!");
} else if (!validateUploadLength(maximumSize)) {
result.put("success", false);
result.put("message", "上传文件超出了限制!!!");
} else if (!validateUploadType(allowedTypes)) {
result.put("success", false);
result.put("message", "上传文件类型不符合要求!!!");
} else {
// 获取存储上传目录
String storageDir = ServletActionContext.getServletContext()
.getRealPath(savePath);
// 判断存储上传目录
File storageFile = new File(storageDir);
if (!storageFile.exists()) {
storageFile.mkdirs();
}
// 上传文件
File destFile = generateDestFile(storageDir, fileFileName);
uploadFile(destFile, file);
result.put("success", true);
result.put("message", "文件上传成功!!!");
}
return "success";
}
public String ActionError(){
result = new HashMap<String, Object>();
result.put("success", false);
result.put("messages", "上传文件超过了限制的大小");
return "actionError";
}
public File getFile() {
return file;
}
public void setFile(File file) {
this.file = file;
}
public String getFileFileName() {
return fileFileName;
}
public void setFileFileName(String fileFileName) {
this.fileFileName = fileFileName;
}
public String getFileContentType() {
return fileContentType;
}
public void setFileContentType(String fileContentType) {
this.fileContentType = fileContentType;
}
public File generateDestFile(String destFileDir, String sourceFileName) {
File destDir = new File(destFileDir);
if (!destDir.exists()) {
destDir.mkdirs();
}
// 生成规则
return new File(destDir, sourceFileName);
}
public static void uploadFile(File destFile, File sourceFile) {
InputStream input = null;
OutputStream output = null;
try {
input = new FileInputStream(sourceFile);
output = new FileOutputStream(destFile);
IOUtils.copy(input, output);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
IOUtils.closeQuietly(output);
IOUtils.closeQuietly(input);
}
}
/**
* 判断是否支持上传文件的类型
*
* @param types
* @return
*/
public boolean validateUploadType(String types) {
String[] allowedTypes = null;
// 获取文件上传类型
String fileType = getFileContentType();
allowedTypes = types.split(",");
for (String type : allowedTypes) {
if (type.equals(fileType)) {
return true;
}
}
return false;
}
public boolean validateUploadLength(long maximumSize) {
if (getFile().length() > maximumSize) {
return false;
}
return true;
}
public String getSavePath() {
return savePath;
}
public void setSavePath(String savePath) {
this.savePath = savePath;
}
public long getMaximumSize() {
return maximumSize;
}
public void setMaximumSize(long maximumSize) {
this.maximumSize = maximumSize;
}
public String getAllowedTypes() {
return allowedTypes;
}
public void setAllowedTypes(String allowedTypes) {
this.allowedTypes = allowedTypes;
}
}
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.custom.i18n.resources" value="ApplicationResources"
/> -->
<package name="default" extends="json-default">
<action name="struts2_*" class="org.zsm.learn.struts2.action.FileUploadAction"
method="{1}">
<param name="savePath">/upload</param>
<param name="maximumSize">1048576</param>
<param name="allowedTypes">
application/vnd.ms-powerpoint,application/msword
</param>
<!-- 注意结合Action观察struts.xml中result的配置。 contentType参数是一定要有的,
否则浏览器总是提示将返回的JSON结果另存为文件,不会交给ajaxfileupload处理。这是因
为struts2 JSON Plugin默认的contentType为application/json,
而ajaxfileupload则要求为text/html。 -->
<result name="success" type="json">
<param name="contentType">
text/html
</param>
<param name="root">result</param>
</result>
<result name="actionError" type="json">
<param name="root">result</param>
<param name="contentType">
text/html
</param>
</result>
<result name="input" type="redirect">struts2_ActionError.action</result>
</action>
</package>
</struts>