1、在服务器端提供一个文件夹存放提交的文件,upload文件夹,位于WebRoot下面
2.在upload.jsp页面
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@taglib uri="/struts-tags" prefix="s" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>文件上传</title> </head> <body> <center> <h1>文件上传</h1> <form action="upload.action" method="post" enctype="multipart/form-data"> 文件上传:<input type="file" name="pic"/><br> <input type="submit" value="Submit"/> </form> </center> </body> </html>
3.写一个Action类,FileUploadAction extends ActionSupport
package com.jsu.struts2.action; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.interceptor.ServletRequestAware; import com.opensymphony.xwork2.ActionSupport; public class FileUploadAction extends ActionSupport implements ServletRequestAware { private File pic;// 提交的数据类型是文件 /* * Struts2.0框架中获得上传文件的名称 在页面中如果定义了 <file name="xxx"/> 文件名称的属性必须定义成 * xxxFileName */ private String picFileName; /* 文件的类型 */ private String picContentType; private HttpServletRequest request; public String execute() throws Exception { System.out.println("File===" + pic); System.out.println("文件名称====" + picFileName); System.out.println("文件类型====" + picContentType); // File 获得是临时文件 FileInputStream io = new FileInputStream(pic); // 文件路径问题 /* ServletContext由逻辑路径获得物理路径 */ ServletContext ctx=request.getSession().getServletContext(); String path=ctx.getRealPath("/upload");//由逻辑路径获得绝对路径 FileOutputStream out = new FileOutputStream(path+"\\"+picFileName); byte[] b = new byte[1024];// 1k int len = 0; while (true) { len = io.read(b); if (len < 0) break; out.write(b, 0, len); } out.close(); io.close(); return SUCCESS; } public File getPic() { return pic; } public void setPic(File pic) { this.pic = pic; } public String getPicFileName() { return picFileName; } public void setPicFileName(String picFileName) { this.picFileName = picFileName; } public String getPicContentType() { return picContentType; } public void setPicContentType(String picContentType) { this.picContentType = picContentType; } public void setServletRequest(HttpServletRequest request) { this.request = request; } }
4.error.jsp页面
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@taglib uri="/struts-tags" prefix="s"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> </head> <body> Error: <s:fielderror></s:fielderror> </body> </html>
5.在struts.xml中配置
<struts> <constant name="struts.custom.i18n.resources" value="myRes"/> <package name="loginDemo" namespace="/" extends="struts-default"> <!-- 文件的上传 --> <action name="upload" class="com.jsu.struts2.action.FileUpAction"> <!-- 使用Struts2.0 fileUpload拦截器限定文件的大小和类型 --> <interceptor-ref name="fileUpload"> <!-- 文件的最大值 --> <param name="maximumSize">2048000</param> <!-- 设置文件上传的类型 IE消息头解析图片为pjpeg,所以加为pjpeg--> <param name="allowedTypes">image/jpeg,image/gif,image/pjpeg</param> </interceptor-ref> <interceptor-ref name="defaultStack"/> <result>/upload.jsp</result> <result name="input">/error.jsp</result> </action> </package> </struts>
6.在 src 提供 struts.properties 配置文件 一般在 strusts 核心 jar 包里面的 defalut.xml 文件中找
struts.multipart.saveDir=
struts.multipart.maxSize= 2097152
struts.properties 文件中的内容
#修改临时文件存放的路径,如果该目录不存在则创建 struts.multipart.saveDir=D:\\temp #全局限定文件的大小,默认为2M struts.multipart.maxSize=2097152
7.修改文件上传异常的错误信息
1. 在 src 中创建资源文件
2. 在 myRes.properties
3. 在 struts-default.xml 文件中找或者在 java 代码中查看源码
//上传文件太大 struts.messages.error.file.too.large=\u4E0A\u4F20\u7684\u6587\u4EF6\u592A\u5927 //上传的文件类型不允许 struts.messages.error.content.type.not.allowed=\u53EA\u80FD\u4E0A\u4F20\u56FE\u7247