---恢复内容开始---
**Struts2的文件上传(掌握)**
1.文件上传的概述和注意事项
* 概述:把客户端的文件上传到服务器端。
* 服务器:FileUpload的组件
* 创建工厂类
* 创建能解析request类
* 解析request,返回的List<FileItem>,自己循环,获取到表单的内容和文件上传的内容。
* 如果获取到上传文件的名称和上传文件的输入流,使用io流完成文件的读写操作。
2.企业中实现文件上传的几种方式?
* jspSmartUpload(主要应用 JSP model1 时代)
* fileupload (Apache commons项目中一个组件)
* Servlet3.0 集成文件上传 Part类
3.客户端三个注意事项
* method="post"
* enctype="multipart/form-data"
* <input type="file" name="myfile">
4.Struts2框架的使用拦截器完成了文件上传,并且底层使用也是FileUpload开源的组件。
* 提供 FileUpload 拦截器,用于解析 multipart/form-data 编码格式请求,解析上传文件的内容
* fileUpload拦截器 默认在 defaultStack 栈中, 默认会执行的
* 在Action中编写文件上传,需要定义三个属性
> 文件类型File ,属性名与表单中file的name属性名一致.
> 字符串类型String , 属性名:前段是name属性名一致 + ContentType;
> 字符串类型String , 属性名:前段是name属性名一致+FileName;
> 最后需要为上述的三个属性提供set方法。
> 可以通过FileUtils提供 copyFile 进行文件复制,将上传文件 保存到服务器端
5. 总结文件上传
* 编写upload的JSP的页面,注意JSP页面的三个注意事项。
* 编写UploadAction中,提供3个属性,并且提供set方法
* private File upload;(upload和表单的name属性是一样的)
* private String uploadFileName; 代表文件名称
* private String uploadContentType; 代表文件的MIME的类型
* 提供上述属性的set方法
* 获取到要上传的文件和上传的文件名称,做拷贝。
5.文件上传中存在的问题
* 先配置input逻辑视图
* 在页面中显示错误信息
* 文件上传的总大小默认值是2M,如果超过了2M,程序会报出异常。可以使用<s:actionError>来查看具体信息!
> 解决总大小的设置,找到常量:
* struts.multipart.parser=jakarta -- 默认文件上传解析器,就是FileUpload组件
* struts.multipart.saveDir= -- 文件上传的临时文件存储目录
* struts.multipart.maxSize=2097152 -- 文件上传的最大值(总大小),默认是2M
> 可以在struts.xml中设置常量,修改文件上传的默认总大小!!!
* <constant name="struts.multipart.maxSize" value="5000000"></constant>
6.还可以通过配置拦截器来设置文件上传的一些属性
* 先在<action>标签中引入文件上传的拦截器
<interceptor-ref name="defaultStack">
<!-- 设置单个上传文件的大小 -->
<param name="fileUpload.maximumSize">2097152</param>
<!-- 设置扩展名 -->
<param name="fileUpload.allowedExtensions">.txt</param>
</interceptor-ref>
单文件上传:
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.enable.DynamicMethodInvocation" value="true" />
<!-- 配置文件上传的默认总大小 -->
<constant name="struts.multipart.maxSize" value="209715200"></constant>
<package name="demo1" extends="struts-default" namespace="/">
<action name="upload" class="demo1.UploadAction" method="upload">
<result name="input">/demo1/upload.jsp</result>
<!-- 想给fileUpload拦截器添加一些属性,设置单个上传文件的大小,设置上传文件的扩展名 -->
<interceptor-ref name="defaultStack">
<!-- 设置单个上传文件的大小 -->
<param name="fileUpload.maximumSize">4097152</param>
<!-- 设置上传文件的扩展名 -->
<param name="fileUpload.allowedExtensions">.txt,.jpg,.pgn</param>
</interceptor-ref>
</action>
</package>
</struts>
upload.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<!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">
<title>Insert title here</title>
</head>
<body>
<h3>文件上传</h3>
<s:fielderror/>
<s:actionerror/>
<form action="${ pageContext.request.contextPath }/upload.action" method="post" enctype="multipart/form-data">
文件上传:<input type="file" name="upload" /><br/>
<input type="submit" value="上传" />
</form>
</body>
</html>
UploadAction:
package demo1;
import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
/**
* 文件上传的入门
* @author Administrator
*/
public class UploadAction extends ActionSupport{
/**
* 提供对应的set方法
* 1. 提供File类型,变量名称和表单中的name属性是一样的,代表上传的文件
* 2. 提供String类型,变量名称 和 nameFileName; 代表上传文件的名称
* 3. 提供String类型,变量名称 nameContentType; 代表的是上文件的MIME的类型
* 提供上述属性的set方法就可以了!!
*/
// 要上传的文件
private File upload;
// 要上传的文件的名称
private String uploadFileName;
// 上传文件的MIME的类型
private String uploadContentType;
public void setUpload(File upload) {
this.upload = upload;
}
public void setUploadFileName(String uploadFileName) {
this.uploadFileName = uploadFileName;
}
public void setUploadContentType(String uploadContentType) {
this.uploadContentType = uploadContentType;
}
/**
* 文件上传
* @return
*/
public String upload(){
// 需要完成文件的上传就OK了
// 先获取到upload文件夹的绝对路径
String path = ServletActionContext.getServletContext().getRealPath("/upload");
// 创建File对象
File toFile = new File(path+"/"+uploadFileName);
try {
System.out.println("文件名称:"+uploadFileName);
System.out.println("文件的MIME的类型:"+uploadContentType);
System.out.println(toFile.getAbsolutePath());
// 把上传的upload文件拷贝到toFile中就可以了!!
/**
* copyFile的两个参数
* 1 代表源文件
* 2 代表目标文件
*/
FileUtils.copyFile(upload, toFile);
} catch (IOException e) {
e.printStackTrace();
}
return NONE;
}
}
8.多文件上传,在JSP的页面上提供多组文件上传的输入框,选择多个文件,上传。
* 在Action中还是编写三个属性
> 属性需要是数组或者List集合,这样就可以完成多文件上传了。
> 注意:是数组或者List集合
private File [] upload; // 代表上传的文件
private String [] uploadContentType; // 代表文件的类型
private String [] uploadFileName; // 上传文件的名称
struts.xml:
<!-- 多文件上传 -->
<action name="moreupload" class="demo1.MoreUploadAction">
<result name="input">/demo1/upload2.jsp</result>
</action>
MoreUploadAction:
package demo1;
import java.io.File;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
/**
* 多文件上传
* @author mjl
*
*/
public class MoreUploadAction extends ActionSupport{
//定义File类型的数组
private File [] upload;
private String [] uploadFileName;
private String [] uploadContentType;
public void setUpload(File[] upload) {
this.upload = upload;
}
public void setUploadFileName(String[] uploadFileName) {
this.uploadFileName = uploadFileName;
}
public void setUploadContentType(String[] uploadContentType) {
this.uploadContentType = uploadContentType;
}
public String execute() throws Exception {
//获取到upload文件夹的路径
String path = ServletActionContext.getServletContext().getRealPath("/upload");
for(int i=0;i<upload.length;i++){
//创建File对象
File toFile=new File(path+"/"+uploadFileName[i]);
//拷贝
FileUtils.copyFile(upload[i], toFile);
}
return NONE;
}
}
---恢复内容结束---