首页 > 学院 > 开发设计 > 正文

Struts2文件上传

2019-11-06 09:24:51
字体:
来源:转载
供稿:网友

Struts2文件上传

目录:

1、Tomcat报错处理:

2、文件上传jar包引入:

3、form表单配置:

4、Action添加属性:

5、其它:

6、源代码示例:

7、配置文件:

8、页面源码

9、运行结果:

10、文件类型和后缀名:

1、Tomcat报错处理:

(1)Configuration PRoblem: Unable to locate Spring NamespaceHandler for xml schema namespace [http://www.springframework.org/schema/tx]

Offending resource: class path resource [application.xml]

答:没有导入jar包,加上

<!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-tx</artifactId>

<version>4.2.5.RELEASE</version>

</dependency>

(2)Invalid bean definition with name 'dataSource' defined in class path resource [application.xml]: Could not resolve placeholder 'jdbc.driverClassName' in string value "${jdbc.driverClassName}"; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'jdbc.driverClassName' in string value "${jdbc.driverClassName}"

答:在spring的配置文件中,

<!-- 引入配置文件 -->

<context:property-placeholder location="classpath:jdbc.properties" ignore-unresolvable="true" />

此行加上 ignore-unresolvable="true"

(3)nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.remoa.dao.Userdao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

答:在dao层的实现类加上@Repository

(4)Unable to find 'struts.multipart.saveDir' property setting.

答:struts.multipart.saveDir没有配置,用于存放指定临时文件的文件夹,在struts.xml加上:

<constant name="struts.multipart.saveDir" value="/tmp"/>

(5)Can not issue data manipulation statements with executeQuery().

答:可能是当要insert时,使用了ps.executeQuery()用错,改为ps.executeUpdate()方法。

(6)Data truncation: Data too long for column 'passWord' at row 1

答:因为用了md5Util加密,所以数据库里的password字段定义为vatchar(20)太短了,博主修改为varchar(100)可使用。

(7)Servlet.service() for servlet jsp threw exception

javax.el.PropertyNotFoundException: Property 'account' not found on type java.lang.String

答:jsp页面的el表达式错了,看看是不是粗心没加$

(8)严重: Servlet.service() for servlet jsp threw exception

org.apache.jasper.JasperException

答:单双引号的混乱,根据报错的提示行数看JSP页面

 

2、文件上传jar包引入:

答:commons-fileupload-1.3.2.jar

commons-io-2.4.jar

 

3、form表单配置:

答:凡是要用commons-fileupload上传文件的表单都必须设置enctype属性,且属性的值必须是multipart/form-data,同时请求方法必须是post

enctype="multipart/form-data"

 

4、Action添加属性:

答:private File xxx;

private String xxxFileName;

private String xxxContentType;

然后加上getter和setter方法

 

5、其它:

答:限制上传文件的大小和文件类型

//默认限制2M,5242880字节/ 1024 / 1024 = 5

<constant name="struts.multipart.maxSize" value="5242880"/>

 

@InterceptorRef(value="defaultStack",

params={"fileUpload.maximumSize","5242880",

"fileUpload.allowedTypes","image/jpeg,image/png",

"fileUpload.allowedExtensions",".jpg,.jpeg,.jpe,.png"})

说明:

先判断fileUpload.maximumSize条件,如果通过再判断struts.multipart.maxSize条件

 

6、源代码示例:

(1)说明:

本源代码在eclipse集成开发环境下模拟,使用maven管理工具,jdk版本为1.8,Tomcat版本为8.0,数据库管理系统使用MySQL,演示Struts2框架下的文件上传,其中action交付给Spring进行管理,模拟了一个注册表单的提交,包括账户名,密码,性别,及头像上传,其中密码使用了MD5Util加密方式,然后在show.jsp页面对数据库中存放的所有用户信息进行展示。

(2) 包目录结构:

图6.1 包目录结构1

图6.2 包目录结构2

(3)代码示例:

①AddUserAction.java

package com.remoa.action;import java.io.File;import java.util.List;import java.util.UUID;import org.apache.commons.io.FileUtils;import org.apache.struts2.convention.annotation.Action;import org.apache.struts2.convention.annotation.InterceptorRef;import org.apache.struts2.convention.annotation.Namespace;import org.apache.struts2.convention.annotation.Result;import org.apache.struts2.convention.annotation.Results;import org.springframework.beans.factory.annotation.Autowired;import com.opensymphony.xwork2.ActionContext;import com.opensymphony.xwork2.ActionSupport;import com.opensymphony.xwork2.ModelDriven;import com.remoa.domain.User;import com.remoa.service.UserService;@Namespace("/user")@Results({@Result(name="show", location="show.jsp"),	@Result(name="upload", location="upload.jsp")})@InterceptorRef(value="defaultStack",params={"fileUpload.maximumSize","5242880",		"fileUpload.allowedTypes","image/jpeg,image/png",//允许的文件类型		"fileUpload.allowedExtensions",".jpg,.jpeg,.jpe,.png"})public class AddUserAction extends ActionSupport implements ModelDriven<User>{	private static final long serialVersionUID = 1L;	@Autowired	private UserService service;	private List<User> userList;	private User user = new User();	private File myFile;	private String myFileFileName;	private String myFileContentType;		public UserService getService() {		return service;	}	public void setService(UserService service) {		this.service = service;	}	public User getUser() {		return user;	}	public void setUser(User user) {		this.user = user;	}	public File getMyFile() {		return myFile;	}	public void setMyFile(File myFile) {		this.myFile = myFile;	}	public String getMyFileFileName() {		return myFileFileName;	}	public void setMyFileFileName(String myFileFileName) {		this.myFileFileName = myFileFileName;	}	public String getMyFileContentType() {		return myFileContentType;	}	public void setMyFileContentType(String myFileContentType) {		this.myFileContentType = myFileContentType;	}	@Action("doUpload")	public String doUpload() throws Throwable{		System.out.println(this.myFile.getAbsolutePath());		System.out.println(this.myFileFileName);		System.out.println(this.myFileContentType);		String fileName = UUID.randomUUID().toString() + this.myFileFileName.substring(this.myFileFileName.lastIndexOf('.'));		user.setHeadImg(fileName);		service.register(user);		FileUtils.copyFile(this.myFile, new File("d:/apps/" + fileName));		return "upload";	}		@Action("upload")	public String upload() throws Throwable{		return "upload";	}		@Action("show")	public String show()throws Throwable{		userList = service.listUser();		System.out.println(userList);		ActionContext.getContext().put("userList", userList);		return "show";	}		@Override	public User getModel() {		return this.user;	}}②ConnectionFactory.java

package com.remoa.common;import java.io.InputStream;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.Properties;import org.apache.commons.dbcp.BasicDataSource;import org.apache.commons.dbcp.BasicDataSourceFactory;public class ConnectionFactory {	private static ThreadLocal<Connection> thlocal = new ThreadLocal<Connection>();	private BasicDataSource dataSource;	private static ConnectionFactory instance = new ConnectionFactory();	public static ConnectionFactory getInstance() {		return instance;	}	private ConnectionFactory(){		Properties pro = new Properties();		try {			InputStream input = this.getClass().getResourceAsStream("/jdbc.properties");			pro.load(input);			input.close();			dataSource = (BasicDataSource)BasicDataSourceFactory.createDataSource(pro);			} catch (Exception e) {				e.printStackTrace();			}	}		public Connection getConnection() throws SQLException{		return dataSource.getConnection();	}		public static Connection getLocalThreadConnection() throws SQLException{		Connection conn = thlocal.get();		if(conn == null){			Connection localConn = instance.getConnection();			thlocal.set(localConn);			return conn;		}else{			return conn;		}	}		public static void closeAll(Connection conn, Statement st, ResultSet rs){		if(rs != null){			try {				rs.close();			} catch (SQLException e) {				e.printStackTrace();			}		}		if(st != null){			try {				st.close();			} catch (SQLException e) {				e.printStackTrace();			}		}		if(conn != null){			try {				conn.close();			} catch (SQLException e) {				e.printStackTrace();			}		}	}		public static void main(String[] args){		System.out.println(ConnectionFactory.getInstance().getClass().getName());	}}③InitListener.java
package com.remoa.common;import javax.servlet.ServletContextEvent;import javax.servlet.ServletContextListener;import javax.servlet.annotation.WebListener;@WebListenerpublic class InitListener implements ServletContextListener{	@Override	public void contextInitialized(ServletContextEvent sce) {		sce.getServletContext().setAttribute("path", sce.getServletContext().getContextPath());	}	@Override	public void contextDestroyed(ServletContextEvent sce) {	}}④Userdao.java

package com.remoa.common;import javax.servlet.ServletContextEvent;import javax.servlet.ServletContextListener;import javax.servlet.annotation.WebListener;@WebListenerpublic class InitListener implements ServletContextListener{	@Override	public void contextInitialized(ServletContextEvent sce) {		sce.getServletContext().setAttribute("path", sce.getServletContext().getContextPath());	}	@Override	public void contextDestroyed(ServletContextEvent sce) {	}}⑤UserdaoImp.java

package com.remoa.dao;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.Statement;import java.util.ArrayList;import java.util.List;import org.springframework.stereotype.Repository;import com.remoa.common.ConnectionFactory;import com.remoa.domain.User;@Repositorypublic class UserdaoImp implements Userdao{	private String addSql = "insert into user(account, password, sex, headImg) values(?,?,?,?)";	@Override	public void add(User user) throws Throwable {		Connection conn = ConnectionFactory.getInstance().getConnection();		PreparedStatement ps = conn.prepareStatement(addSql);		ps.setString(1, user.getAccount());		ps.setString(2, user.getPassword());		ps.setString(3, user.getSex());		ps.setString(4, user.getHeadImg());		ps.executeUpdate();		ConnectionFactory.closeAll(conn, ps, null);	}	@Override	public void delete(int id) throws Throwable {		// TODO Auto-generated method stub			}	@Override	public void update(User user) throws Throwable {		// TODO Auto-generated method stub			}	@Override	public User getUserById(int id) throws Throwable {		// TODO Auto-generated method stub		return null;	}	@Override	public User getUserByAccount(String account) throws Throwable {		// TODO Auto-generated method stub		return null;	}	private String listSql = "select * from user";	@Override	public List<User> list() throws Throwable {		Connection conn = ConnectionFactory.getInstance().getConnection();		Statement st = conn.createStatement();		ResultSet rs = st.executeQuery(listSql);		List<User> list = new ArrayList<User>();		while(rs.next()){			User user = new User();			user.setId(rs.getInt(1));			user.setAccount(rs.getString(2));			user.setPassword(rs.getString(3));			user.setSex(rs.getString(4));			user.setHeadImg(rs.getString(5));			list.add(user);		}		System.out.println(list);		System.out.println("-------------");		return list;	}}⑥User.java

package com.remoa.domain;public class User {	private int id;	private String account;	private String password;	private String sex;	private String headImg;	public int getId() {		return id;	}	public void setId(int id) {		this.id = id;	}	public String getAccount() {		return account;	}	public void setAccount(String account) {		this.account = account;	}	public String getPassword() {		return password;	}	public void setPassword(String password) {		this.password = password;	}	public String getSex() {		return sex;	}	public void setSex(String sex) {		this.sex = sex;	}	public String getHeadImg() {		return headImg;	}	public void setHeadImg(String headImg) {		this.headImg = headImg;	}	@Override	public String toString() {		return "User [id=" + id + ", account=" + account + ", password=" + password + ", sex=" + sex + ", headImg="				+ headImg + "]";	}}⑦UserService.java

package com.remoa.service;import java.util.List;import com.remoa.domain.User;public interface UserService {	/**	 * 用户注册	 * @param user	 * @throws Throwable	 */	public void register(User user)throws Throwable;	/**	 * 展示用户列表 	 * @return	 * @throws Throwable	 */	public List<User> listUser() throws Throwable;}⑧UserServiceImp.java

package com.remoa.service;import java.util.List;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import com.remoa.dao.Userdao;import com.remoa.domain.User;import com.remoa.util.MD5Util;@Servicepublic class UserServiceImp implements UserService{	@Autowired	private Userdao dao;	@Override	public void register(User user) throws Throwable {		user.setPassword(MD5Util.md5(user.getPassword()));		dao.add(user);	}	@Override 	public List<User> listUser() throws Throwable{		List<User> userList = dao.list();		return userList;	}}⑨MD5Util.java

package com.remoa.util;import java.security.MessageDigest;public class MD5Util {	public static String md5(String source) throws Exception{          String des = "";          MessageDigest md = MessageDigest.getInstance("MD5");          byte[] result = md.digest(source.getBytes());          StringBuilder buf = new StringBuilder();          for (int i=0;i<result.length;i++) {              byte b = result[i];              buf.append(String.format("%02X", b));          }          des = buf.toString().toLowerCase();          return des;      }   }⑩SpringUtil.java

package com.remoa.util;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class SpringUtil{		private static ApplicationContext ctx;	public static void init(String path){		ctx=new ClassPathXmlApplicationContext(path);	}		public static Object getBean(String id){		return ctx.getBean(id);	}		public static <T> T getBean(Class<T> type){				return ctx.getBean(type);	}	}7、配置文件:(1)pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">	<modelVersion>4.0.0</modelVersion>	<groupId>com.remoa</groupId>	<artifactId>struts2Learn</artifactId>	<version>0.0.1-SNAPSHOT</version>	<packaging>war</packaging>	<build>		<finalName>struts</finalName>		<!-- 默认源代码和资源文件目录配置 -->		<sourceDirectory>src/main/java </sourceDirectory>		<testSourceDirectory>src/test/java</testSourceDirectory>		<resources>			<resource>				<directory>src/main/resources</directory>			</resource>		</resources>		<testResources>			<testResource>				<directory>src/test/resources</directory>			</testResource>		</testResources>		<plugins>			<plugin>				<artifactId>maven-compiler-plugin</artifactId>				<version>3.3</version>				<configuration>					<source>1.8</source>					<target>1.8</target>				</configuration>			</plugin>		</plugins>	</build>	<dependencies>				<dependency>			<groupId>org.apache.struts</groupId>			<artifactId>struts2-spring-plugin</artifactId>			<version>2.5.2</version>		</dependency>		<!-- struts2注解零配置依赖的包 -->		<dependency>			<groupId>org.apache.struts</groupId>			<artifactId>struts2-convention-plugin</artifactId>			<version>2.5.2</version>		</dependency>		<!-- Servlet规范包 -->		<dependency>			<groupId>javax.servlet</groupId>			<artifactId>javax.servlet-api</artifactId>			<version>3.1.0</version>			<scope>provided</scope>		</dependency>		<!-- 众多接口的集合,它不负责日志的具体实现,只在编译时负责寻找合适的日志系统进行绑定 -->		<dependency>			<groupId>org.slf4j</groupId>			<artifactId>slf4j-log4j12</artifactId>			<version>1.7.2</version>		</dependency>		<!-- 具体的日志系统,通过slf4j-log4j12初始化log4j,达到最终日志的输出 -->		<dependency>			<groupId>org.apache.logging.log4j</groupId>			<artifactId>log4j-core</artifactId>			<version>2.5</version>		</dependency>		<!-- 文件上传组件 -->		<dependency>			<groupId>commons-fileupload</groupId>			<artifactId>commons-fileupload</artifactId>			<version>1.3.2</version>		</dependency>		<!-- 文件上传组件 -->		<dependency>			<groupId>commons-io</groupId>			<artifactId>commons-io</artifactId>			<version>2.4</version>		</dependency>		<!-- jsp标签库 -->		<dependency>		    <groupId>javax.servlet</groupId>		    <artifactId>jstl</artifactId>		    <version>1.2</version>		</dependency>		<!-- 使用dbcp连接池 -->		<dependency>		    <groupId>commons-dbcp</groupId>		    <artifactId>commons-dbcp</artifactId>		    <version>1.4</version>		</dependency>		<!-- MySQL驱动 -->		<dependency>		    <groupId>mysql</groupId>		    <artifactId>mysql-connector-java</artifactId>		    <version>5.1.38</version>		</dependency>	</dependencies></project>(2)application.xml

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"	xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop"	xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"	xmlns:cache="http://www.springframework.org/schema/cache" xmlns:p="http://www.springframework.org/schema/p"	xsi:schemaLocation="http://www.springframework.org/schema/beans      http://www.springframework.org/schema/beans/spring-beans-4.2.xsd     http://www.springframework.org/schema/aop     http://www.springframework.org/schema/aop/spring-aop-4.2.xsd     http://www.springframework.org/schema/context     http://www.springframework.org/schema/context/spring-context-4.2.xsd     http://www.springframework.org/schema/tx     http://www.springframework.org/schema/tx/spring-tx-4.2.xsd">	<!-- 只扫描service -->	<context:component-scan base-package="com.remoa">		</context:component-scan>	<!-- 引入配置文件 -->	<context:property-placeholder location="classpath:jdbc.properties" ignore-unresolvable="true" />	<!--创建数据源 -->	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"		destroy-method="close">		<property name="driverClassName" value="${jdbc.driverClassName}" />		<property name="url" value="${jdbc.url}" />		<property name="username" value="${jdbc.username}" />		<property name="password" value="${jdbc.password}" />		<!--maxActive: 最大连接数量 -->		<property name="maxActive" value="5" />		<!--minIdle: 最小空闲连接 -->		<property name="minIdle" value="2" />		<!--maxIdle: 最大空闲连接 -->		<property name="maxIdle" value="10" />		<!--initialSize: 初始化连接 -->		<property name="initialSize" value="5" />		<!-- 连接被泄露时是否打印 -->		<property name="logAbandoned" value="true" />		<!--removeAbandoned: 是否自动回收超时连接 -->		<property name="removeAbandoned" value="true" />		<!--removeAbandonedTimeout: 超时时间(以秒数为单位) -->		<property name="removeAbandonedTimeout" value="30" />		<!--maxWait: 超时等待时间以毫秒为单位 -->		<property name="maxWait" value="60000" />		<!-- 在空闲连接回收器线程运行期间休眠的时间值,以毫秒为单位. -->		<property name="timeBetweenEvictionRunsMillis" value="10000" />		<!-- 在每次空闲连接回收器线程(如果有)运行时检查的连接数量 -->		<property name="numTestsPerEvictionRun" value="10" />		<!-- 1000 * 60 * 30 连接在池中保持空闲而不被空闲连接回收器线程 -->		<property name="minEvictableIdleTimeMillis" value="10000" />		<property name="validationQuery" value="${jdbc.validationQuery}" />	</bean>	</beans>(3)jdbc.properties

driverClassName=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/strutsLearn?useUnicode=true&characterEncoding=utf-8&useSSL=falseusername=rootpassword=123456initialSize=5maxTotal=10maxIdle=10minIdle=2validationQuery=select 1(4)log4j.properties

log4j.rootLogger=INFO,consolelog4j.appender.console=org.apache.log4j.ConsoleAppenderlog4j.appender.console.layout=org.apache.log4j.PatternLayoutlog4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd  HH:mm:ss,SSS}  [%c]-[%p]%m%n  log4j.logger.java.sql=DEBUG   (5)log4j2.xml

<?xml version="1.0" encoding="UTF-8"?><Configuration>    <Appenders>        <Console name="STDOUT" target="SYSTEM_OUT">            <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>        </Console>    </Appenders>    <Loggers>        <Logger name="org.apache.struts2" level="info"/>        <Root level="info">            <AppenderRef ref="STDOUT"/>        </Root>    </Loggers></Configuration>(6)struts.xml

<!DOCTYPE struts PUBLIC    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"    "http://struts.apache.org/dtds/struts-2.3.dtd">  <struts>	<include file="struts-default.xml"></include>	<!-- 指定被struts2处理的请求后缀类型。多个用逗号隔开 -->      <constant name="struts.action.extension" value="action"/>       <!-- 是否开启动态方法调用 -->  	<constant name="struts.enable.DynamicMethodInvocation" value="true" /> 	<!-- 是否使用struts的开发模式。开发模式会有更多的调试信息。默认值为false(生产环境下使用),开发阶段最好打开  -->      <constant name="struts.devMode" value="true"/>    <constant name="struts.i18n.encoding" value="UTF-8" />    <constant name="struts.convention.result.path" value="/WEB-INF/pages"/>     <!-- 进行扫描的根包,该包会被扫描成action -->    <constant name="struts.convention.package.locators" value="action"/>     <!-- 设置浏览器是否缓存静态内容。默认值为true(生产环境下使用),开发阶段最好关闭  -->      <constant name="struts.serve.static.browserCache" value="false" />       <!-- 指定由spring负责action对象的创建 -->    <constant name="struts.objectFactory" value="spring"/>    <!-- 当struts.xml改动后,是否重新加载。默认值为false(生产环境下使用),开发阶段最好打开  -->      <constant name="struts.configuration.xml.reload" value="true"/>	<constant name="struts.multipart.maxSize" value="5242880"/>	<constant name="struts.multipart.saveDir" value="/tmp"/>	</struts>8、页面源码:(1)show.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><!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=UTF-8">	<meta name="viewport" content="width=device-width, initial-scale=1.0" />	<script type="text/Javascript" src="${path }/bootstrap/js/jquery.min.js" ></script>	<script type="text/javascript" src="${path }/bootstrap/js/bootstrap.min.js" ></script>	<link rel="stylesheet" href="${path }/bootstrap/CSS/bootstrap.min.css" />	<title>展示</title></head><body>	<div class="col-md-6">		<c:forEach items="${userList }" var="item">			账户名:${item.account }<br/>			密码:${item.password }<br/>			性别:${item.sex }<br/>			<img src="/images/${item.headImg }" class="img img-circle" width="100px" height="100px"/><br/>		</c:forEach>	</div></body></html>(2)upload.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><!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=UTF-8">	<meta name="viewport" content="width=device-width, initial-scale=1.0" />	<script type="text/javascript" src="${path }/bootstrap/js/jquery.min.js" ></script>	<script type="text/javascript" src="${path }/bootstrap/js/bootstrap.min.js" ></script>	<link rel="stylesheet" href="${path }/bootstrap/css/bootstrap.min.css" />	<title>文件上传</title></head><body>	<div class="col-md-7" style="text-align:center">		文件上传学习:	</div>	<div class="col-md-6">		<form class="form" action="doUpload.action" method="post" enctype="multipart/form-data" role="form" >			<div class="form-group col-md-12">				<label for="account" class="col-md-3 control-label">					账户:				</label>				<div class="col-md-9 col-md-12">					<input type="text" name="account" class="form-control" placeholder="请输入账户名" />				</div>			</div>			<div class="form-group col-md-12">				<label for="password" class="col-md-3 control-label">					密码:				</label>				<div class="col-md-9">					<input type="password" name="password" class="form-control" placeholder="请输入密码" />				</div>			</div>			<div class="form-group col-md-12">				<label for="sex" class="col-md-3 control-label">                 		性别:                  </label>                  <div class="col-md-9">                      <label class="radio-inline">                          <input type="radio" name="sex" value="male" checked />男                      </label>                      <label class="radio-inline">                          <input type="radio" name="sex" value="female" />女                      </label>                  </div>  			</div>			<div class="form-group col-md-12">				<label for="file" class="col-md-3 control-label">					头像上传:				</label>				<div class="col-md-3">					<input type="file" name="myFile" />				</div>				<div class="col-md-6"></div>			</div>			<input type="submit" class="btn btn-success col-md-offset-3" value="提交" />			<input type="reset" class="btn btn-primary col-md-offset-1" value="重置" />		</form>		<a href="${path }/user/show.action">查看所有用户</a>	</div></body></html>

9、运行结果:

答:(1)页面展示结果:

图9.1 页面运行结果1

图9.2 页面运行结果2

(2)数据库表结果:

图9.3 数据库表结果

(3)本地目录下图片上传结果:

图9.4 本地存放头像图片目录查看

 

10、文件类型和后缀名:

'.a': 'application/octet-stream'   

'.ai': 'application/postscript'   

'.aif': 'audio/x-aiff'   

'.aifc': 'audio/x-aiff'   

'.aiff': 'audio/x-aiff'   

'.au': 'audio/basic'   

'.avi': 'video/x-msvideo'   

'.bat': 'text/plain'   

'.bcpio' : 'application/x-bcpio'   

'.bin': 'application/octet-stream'   

'.bmp': 'image/x-ms-bmp'   

'.c': 'text/plain'

'.cdf': 'application/x-cdf'   

'.cdf': 'application/x-netcdf'   

'.cpio': 'application/x-cpio'   

'.csh': 'application/x-csh'   

'.css': 'text/css'   

'.dll': 'application/octet-stream'   

'.doc': 'application/msword'   

'.dot': 'application/msword'   

'.dvi': 'application/x-dvi'   

'.eml': 'message/rfc822'   

'.eps': 'application/postscript'   

'.etx' : 'text/x-setext'   

'.exe': 'application/octet-stream'   

'.gif': 'image/gif'   

'.gtar': 'application/x-gtar'   

'.h': 'text/plain'   

'.hdf': 'application/x-hdf'   

'.htm': 'text/html'   

'.html': 'text/html'   

'.ief': 'image/ief'   

'.jpe': 'image/jpeg'   

'.jpeg': 'image/jpeg'   

'.jpg': 'image/jpeg'  

'.js': 'application/x-javascript'   

'.ksh': 'text/plain'   

'.latex' : 'application/x-latex'   

'.m1v': 'video/mpeg'   

'.man': 'application/x-troff-man'   

'.me': 'application/x-troff-me'   

'.mht' : 'message/rfc822'   

'.mhtml' : 'message/rfc822'   

'.mif': 'application/x-mif'   

'.mov': 'video/quicktime'   

'.movie' : 'video/x-sgi-movie'   

'.mp2': 'audio/mpeg'   

'.mp3': 'audio/mpeg'   

'.mpa' : 'video/mpeg'   

'.mpe': 'video/mpeg'   

'.mpeg': 'video/mpeg'   

'.mpg': 'video/mpeg'   

'.ms': 'application/x-troff-ms'   

'.nc' : 'application/x-netcdf'   

'.nws': 'message/rfc822'   

'.o': 'application/octet-stream'   

'.obj': 'application/octet-stream'   

'.oda': 'application/oda'   

'.p12' : 'application/x-pkcs12'   

'.p7c': 'application/pkcs7-mime'   

'.pbm': 'image/x-portable-bitmap'   

'.pdf': 'application/pdf'   

'.pfx': 'application/x-pkcs12'   

'.pgm': 'image/x-portable-graymap'   

'.pl': 'text/plain'   

'.png': 'image/png'   

'.pnm': 'image/x-portable-anymap'   

'.pot': 'application/vnd.ms-Powerpoint'   

'.ppa': 'application/vnd.ms-powerpoint'   

'.ppm': 'image/x-portable-pixmap'   

'.pps': 'application/vnd.ms-powerpoint'   

'.PPT': 'application/vnd.ms-powerpoint'   

'.ps': 'application/postscript'   

'.pwz': 'application/vnd.ms-powerpoint'   

'.py': 'text/x-python'   

'.pyc': 'application/x-python-code'   

'.pyo' : 'application/x-python-code'   

'.qt': 'video/quicktime'   

'.ra' : 'audio/x-pn-realaudio'   

'.ram' : 'application/x-pn-realaudio'   

'.ras' : 'image/x-cmu-raster'   

'.rdf': 'application/xml'   

'.rgb' : 'image/x-rgb'   

'.roff': 'application/x-troff'   

'.rtx' : 'text/richtext'   

'.sgm': 'text/x-sgml'   

'.sgml': 'text/x-sgml'   

'.sh': 'application/x-sh'   

'.shar' : 'application/x-shar'   

'.snd' : 'audio/basic'   

'.so' : 'application/octet-stream'   

'.src': 'application/x-wais-source'   

'.sv4cpio': 'application/x-sv4cpio'   

'.sv4crc' : 'application/x-sv4crc'   

'.swf': 'application/x-shockwave-Flash'   

'.t' : 'application/x-troff'   

'.tar': 'application/x-tar'   

'.tcl' : 'application/x-tcl'   

'.tex' : 'application/x-tex'   

'.texi': 'application/x-texinfo'   

'.texinfo': 'application/x-texinfo'   

'.tif' : 'image/tiff'   

'.tiff': 'image/tiff'   

'.tr': 'application/x-troff'   

'.tsv': 'text/tab-separated-values'   

'.txt': 'text/plain'   

'.ustar' : 'application/x-ustar'   

 

'.vcf': 'text/x-vcard'   

'.wav': 'audio/x-wav'   

'.wiz': 'application/msword'   

'.wsdl': 'application/xml'   

'.xbm': 'image/x-xbitmap'   

'.xlb': 'application/vnd.ms-Excel'   

 

# Duplicates

'.xls': 'application/excel'   

'.xls': 'application/vnd.ms-excel'   

'.xml' : 'text/xml'   

'.xpdl': 'application/xml'   

'.xpm': 'image/x-xpixmap'   

'.xsl': 'application/xml'   

'.xwd': 'image/x-xwindowdump'   

'.zip': 'application/zip'

 


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表