版权声明:本文为博主原创文章,转载请注明出处,谢谢。 https://blog.csdn.net/nailnehc/article/details/85531674
目录
三、struts.xml配置【包含拦截器实现文件格式与文件大小的过滤】
一、struts2文件上传大前提
- 必须将<form>表单中的method设置为”post”
- 必须将<form>表单中的enctype设置为”multipart/form-data”
- 必须提供一个<input type=”file” name=”xxx”>或<s:file name=”xxx”>
- 导入commons-io-2.5.jar和commons-fileupload-1.3.3.jar
【这里的name属性值'xxx'在action中有使用到,注意】
test.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" 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; charset=ISO-8859-1">
<title>Struts2文件上传示例</title>
</head>
<body>
<s:form action="upload" enctype="multipart/form-data" method="post">
<s:file name="upload" label="选择文件"/>
<s:submit value="上传"/>
</s:form>
</body>
</html>
二、Action实现
- Action中必须提供三个变量【这里的'xxx' 就是表单中<input type=”file” name=”xxx”>中的那个‘xxx’,这里笔者写的是‘upload’】
类型为File的 xxx成员变量,用于封装文件内容;
类型为String的xxxFileName成员变量,用于封装文件名;
类型为String的xxxContentType成员变量,用于封装文件类型;
public class UploadAction extends ActionSupport {
private File upload;//这里的 “update”就是对应表单<s:file>中那么的值,下面两个变量也是
private String uploadFileName;//xxxFileName
private String uploadContentType;//xxxContenxtType
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 execute() throws Exception{
//上传图片:
if(upload != null) {
//上传后存放路径;
String path = "F:/upload";
//获取唯一文件名,解决上传时同一目录中文件名相同的问题--
int lastPointIndex = uploadFileName.lastIndexOf(".");//获取文件名中最后一个点的位置【扩展名前的那个点】
String extention = uploadFileName.substring(lastPointIndex);//获取文件扩展名,包括前面那个点
String uuidFileName = UUID.randomUUID().toString().replace("-", "") + extention;//生成通用唯一识别码,并把其中的‘-’给去掉,最后加上扩展名
//-----------------------------------------------
//根据文件名获取存放路径【目录分离】-----------------
int code1 = uuidFileName.hashCode();//获取唯一文件名对应的哈希码
int d1 = code1 & 0xf;//然后通过 哈希码的最后四位与十六进制的15(即 ‘1111’)进行与运算,得到一个16以内的一个数字,作为根目录下的一级目录。
int d2 = (code1 >>> 4) & 0xf;//哈希码右移四位,再相与,获得二级目录名【如果觉得文件夹数目还不够,以此类推,一共可以获得8级目录,共有16^8(16的8次方)个文件夹】
String realPath = "/" + d1 + "/" + d2;
//-----------------------------------------------
//创建目录----------------------------------------
String url = path + realPath;
File file = new File(url);
if(!file.exists()) {
file.mkdirs();
}
//-----------------------------------------------
File dictFile = new File(url + "/" + uuidFileName);
FileUtils.copyFile(upload, dictFile);//存储到目录中
}
return "success";
}
}
三、struts.xml配置【包含拦截器实现文件格式与文件大小的过滤】
<struts>
<constant name="struts.multipart.maxSize" value="5242880"/><!-- 设置表单上传文件的总大小 -->
<package name="upload_package" extends="struts-default" namespace="/">
<action name="upload" class="cla.fjh.web.action.UploadAction">
<result name="success">/success.jsp</result>
<result name="input">/input.jsp</result><!-- 当上传的文件格式或者文件大小超出允许上传的范围,就是自动跳转到input视图 -->
<interceptor-ref name="defaultStack">
<param name="fileUpload.allowedTypes">application/octet-stream</param><!-- 配置允许上传的文件类型,多种类型可以用逗号隔开,常用格式见文末 -->
<param name="fileUpload.maximumSize">2097152</param><!-- 配置允许上传单个文件的大小,单位为字节 -->
</interceptor-ref>
</action>
</package>
</struts>
在input页面内用<s:fielderror/> ,但上传文件超出允许范围,就会在页面显示错误原因。可以用国际化将其转为中文提示。
-----------------------------------------------Monkey_Chen----------------------------------------------------
常用struts2 配置上传文件格式
jpg | image/jpeg |
png | image/png |
gif | image/gif |
jpeg | image/jpeg |
html | text/html |
xml | text/xml |
htm | text/html |
css | text/css |
js | text/javascript |
application/pdf | |
zip | application/x-zip-compresse |
xls | application/vnd.ms-excel |
xlsx | application/vnd.openxmlformats-officedocument.spreadsheetml.sheet |
ppt | application/vnd.ms-powerpoint |
pptx | application/vnd.openxmlformats-officedocument.presentationml.presentation |
doc | application/msword |
docx | application/vnd.openxmlformats-officedocument.wordprocessingml.document |
vsd | application/vnd.visio |
dwg | application/octet-stream |
jsp | application/octet-stream |
psd | application/octet-stream |
db | application/octet-stream |
java | application/octet-stream |
sql | application/octet-stream |
rar | application/octet-stream |
log | application/octet-stream |