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.javapackage 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.javapackage 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.javapackage 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.javapackage 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.javapackage 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.javapackage 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.javapackage 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.javapackage 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.javapackage 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.propertiesdriverClassName=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.propertieslog4j.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'
新闻热点
疑难解答