1、struts2的环境配置,我用的是struts2.3.4
1)所需jar包如下:
下载地址:http://labs.mop.com/apache-mirror//struts/binaries/struts-2.3.4-all.zip
2)web.xml如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <welcome-file-list> <welcome-file>input.jsp</welcome-file> </welcome-file-list> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
3)struts2配置文件struts.xml:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <!-- 指定允许上传的文件最大字节数。默认值是2097152(2M) --> <constant name="struts.multipart.maxSize" value="20971520" /> <constant name="struts.devMode" value="true" /> <package name="upload" extends="struts-default" namespace="/"> <action name="input" class="com.ljmin.action.UploadAction" method="input"> <result name="input">/input.jsp</result> </action> <action name="upload" class="com.ljmin.action.UploadAction" method="upload"> <result name="upload">/upload.jsp</result> </action> </package> </struts>
2、jsp里加上文件标签
<form action="upload/upload" method="post" enctype="multipart/form-data"> <input type="file" name="myFile"> <input type="submit" value="上传"> </form>
注意:enctype="multipart/form-data" 必须写,没有会报错。
3、UploadAction
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.ljmin.action; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.util.Date; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; @SuppressWarnings("serial") public class UploadAction extends ActionSupport { private File myFile; private String fileName; private String saveName; private static final int BUFFER_SIZE = 8 * 1024; public String input() { return "input"; } public String upload() { /* 截取后缀名 */ int pos = fileName.lastIndexOf("."); String str = fileName.substring(pos); // 时间加后缀名保存 saveName = new Date().getTime() + str; // 根据服务器的文件保存地址和原文件名创建目录文件全路径 File imageFile = new File(ServletActionContext.getServletContext() .getRealPath("upload") + "/" + saveName); copy(myFile, imageFile); return "upload"; } // 复制方法 public static void copy(File src, File dst) { try { InputStream in = null; OutputStream out = null; try { in = new BufferedInputStream(new FileInputStream(src), BUFFER_SIZE); out = new BufferedOutputStream(new FileOutputStream(dst), BUFFER_SIZE); byte[] buffer = new byte[BUFFER_SIZE]; while (in.read(buffer) > 0) { out.write(buffer); } } finally { if (null != in) { in.close(); } if (null != out) { out.close(); } } } catch (Exception e) { e.printStackTrace(); } } //得到文件名 public void setMyFileFileName(String fileName) { this.fileName = fileName; } public File getMyFile() { return myFile; } public void setMyFile(File myFile) { this.myFile = myFile; } public String getFileName() { return fileName; } public void setFileName(String fileName) { this.fileName = fileName; } public String getSaveName() { return saveName; } public void setSaveName(String saveName) { this.saveName = saveName; } }
注意:
(1) ServletActionContext.getServletContext().getRealPath("upload") 表示服务器工程目录下的upload文件夹。跟工作路径是不一样的。
所以项目重新部署的时候,这个文件夹会被替换掉,保存的文件也会被删除。测试阶段,重新部署项目应该先备份这些文件。
(2) public void setMyFileFileName(String fileName) {
this.fileName = fileName;
}
是把myFile路径里的文件名称赋值给fileName.
(3) 上传文件名为中文的图片时,img将不能显示中文命名的图片,如:<img alt="" src="upload/中文.jpg">。
如要显示,必须先转码。这里建议用“时间+后缀名”的方式,保存上传的图片。这样保证图片不重复,还避免了中文问题。
(4) 上传文件大小默认是2M,超出会报错,可以在struts.xml更改默认大小:
<constant name="struts.multipart.maxSize" value="20971520" />