浅谈Struts2文件上传

版权声明:本文为博主原创文章,转载请注明出处,谢谢。 https://blog.csdn.net/nailnehc/article/details/85531674

目录

一、struts2文件上传大前提

二、Action实现

三、struts.xml配置【包含拦截器实现文件格式与文件大小的过滤】

常用struts2 配置上传文件格式 


一、struts2文件上传大前提

  1. 必须将<form>表单中的method设置为”post”
  2. 必须将<form>表单中的enctype设置为”multipart/form-data”
  3. 必须提供一个<input type=”file” name=”xxx”>或<s:file name=”xxx”>
  4. 导入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实现

  1. 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 配置上传文件格式 

常用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
pdf 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

猜你喜欢

转载自blog.csdn.net/nailnehc/article/details/85531674